Skip to content

Implement the clip HLSL Function #99093

Closed
@farzonl

Description

@farzonl
  • Implement clip clang builtin,
  • Link clip clang builtin with hlsl_intrinsics.h
  • Add sema checks for clip to CheckHLSLBuiltinFunctionCall in SemaChecking.cpp
  • Add codegen for clip to EmitHLSLBuiltinExpr in CGBuiltin.cpp
  • Add codegen tests to clang/test/CodeGenHLSL/builtins/clip.hlsl
  • Add sema tests to clang/test/SemaHLSL/BuiltIns/clip-errors.hlsl
  • Create the int_dx_clip intrinsic in IntrinsicsDirectX.td
  • Create the DXILOpMapping of int_dx_clip to 82 in DXIL.td
  • Create the clip.ll and clip_errors.ll tests in llvm/test/CodeGen/DirectX/
  • Create the int_spv_clip intrinsic in IntrinsicsSPIRV.td
  • In SPIRVInstructionSelector.cpp create the clip lowering and map it to int_spv_clip in SPIRVInstructionSelector::selectIntrinsic.
  • Create SPIR-V backend test case in llvm/test/CodeGen/SPIRV/hlsl-intrinsics/clip.ll

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)

Metadata

Metadata

Assignees

Labels

HLSLHLSL Language Supportbackend:DirectXbackend:SPIR-Vbot:HLSLclang:codegenIR generation bugs: mangling, exceptions, etc.clang:frontendLanguage frontend issues, e.g. anything involving "Sema"metaissueIssue to collect references to a group of similar or related issues.

Type

No type

Projects

Status

Closed

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions