llvm / llvm-project

The LLVM Project is a collection of modular and reusable compiler and toolchain technologies.
http://llvm.org
Other
27.92k stars 11.52k forks source link

Implement the `clip` HLSL Function #99093

Open farzonl opened 1 month ago

farzonl commented 1 month ago

DirectX

DXIL Opcode DXIL OpName Shader Model Shader Stages
82 Discard 6.0 ('pixel',)

SPIR-V

OpDemoteToHelperInvocation:

Description:

(OpDemoteToHelperInvocationEXT)**

Demote this fragment shader invocation to a helper invocation. Any stores to memory after this instruction are suppressed and the fragment does not write outputs to the framebuffer.

Unlike the OpTerminateInvocation instruction, this does not necessarily terminate the invocation which might be needed for derivative calculations. It is not considered a flow control instruction (flow control does not become non-uniform) and does not terminate the block. The implementation may terminate helper invocations before the end of the shader as an optimization, but doing so must not affect derivative calculations and does not make control flow non-uniform.

After an invocation executes this instruction, any subsequent load of HelperInvocation within that invocation will load an undefined value unless the HelperInvocation built-in variable is decorated with Volatile or the load included Volatile in its Memory Operands

This instruction is only valid in the Fragment Execution Model.

Capability:
DemoteToHelperInvocation

Missing before version 1.6.

Word Count Opcode Results Operands
1 5380

Test Case(s)

Example 1

//dxc clip_test.hlsl -T ps_6_8

RWBuffer<float4> Buf;

float4 main( ) : SV_Target {
  float4 p1 = Buf[0];
  clip(p1.a);
  return p1;
}

HLSL:

Discards the current pixel if the specified value is less than zero.

clip(x)

Parameters

Item Description
x
[in] The specified value.

Return Value

None.

Remarks

Use the clip HLSL intrinsic function to simulate clipping planes if each component of the x parameter represents the distance from a plane.

Also, use the clip function to test for alpha behavior, as shown in the following example:

clip( Input.Color.A < 0.1f ? -1:1 );

Type Description

Name Template Type Component Type Size
x scalar, vector, or matrix float any

Minimum Shader Model

This function is supported in the following shader models.

Shader Model Supported
Shader Model 4 yes (pixel shader only)
Shader Model 3 (DirectX HLSL) yes (pixel shader only)
Shader Model 2 (DirectX HLSL) yes (pixel shader only)
Shader Model 1 (DirectX HLSL) yes (pixel shader only)

See also

[**Intrinsic Functions (DirectX HLSL)**](https://github.com/MicrosoftDocs/win32/blob/docs/desktop-src//direct3dhlsl/dx-graphics-hlsl-intrinsic-functions.md)
llvm-beanz commented 1 month ago

Godbolt of DXC's behavior

Edit: Updated link with Vulkan 1.1 and 1.3 output.