llvm / llvm-project

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

Implement the `GroupMemoryBarrierWithGroupSync` HLSL Function #70103

Open llvm-beanz opened 11 months ago

llvm-beanz commented 11 months ago

AC:

DirectX

DXIL Opcode DXIL OpName Shader Model Shader Stages
80 Barrier 6.0 ()

SPIR-V

OpControlBarrier:

Description:

Wait for all active invocations within the specified Scope to reach the current point of execution.

All active invocations within Execution scope reach this point of execution before any invocation proceeds beyond it.

When Execution is Workgroup or larger, behavior is undefined unless all invocations within Execution execute the same dynamic instance of this instruction.

If Semantics is not None, this instruction also serves as an OpMemoryBarrier instruction, and also performs and adheres to the description and semantics of an OpMemoryBarrier instruction with the same Memory and Semantics operands. This allows atomically specifying both a control barrier and a memory barrier (that is, without needing two instructions). If Semantics is None, Memory is ignored.

Before version 1.3, it is only valid to use this instruction with TessellationControl, GLCompute, or Kernel execution models. There is no such restriction starting with version 1.3.

If used with the TessellationControl execution model, it also implicitly synchronizes the Output Storage Class: Writes to Output variables performed by any invocation executed prior to a OpControlBarrier are visible to any other invocation proceeding beyond that OpControlBarrier.

Word Count Opcode Results Operands

4

224

Scope <id>
Execution

Scope <id>
Memory

Memory Semantics <id>
Semantics

Test Case(s)

Example 1

//dxc GroupMemoryBarrierWithGroupSync_test.hlsl -T lib_6_8  -enable-16bit-types -spirv -fspv-target-env=universal1.5 -fcgl -O0

export void fn() {
    return GroupMemoryBarrierWithGroupSync();
}

HLSL:

Blocks execution of all threads in a group until all group shared accesses have been completed and all threads in the group have reached this call.

Syntax

void GroupMemoryBarrierWithGroupSync(void);

Parameters

This function has no parameters.

Return value

This function does not return a value.

Remarks

The behavior of calls to this function that are within diverging branches of a thread group are undefined.

Minimum Shader Model

This function is supported in the following shader models.

Shader Model Supported
Shader Model 5 and higher shader models yes

 

This function is supported in the following types of shaders:

Vertex Hull Domain Geometry Pixel Compute
x

 

See also

[Intrinsic Functions](https://github.com/MicrosoftDocs/win32/blob/docs/desktop-src//direct3dhlsl/dx-graphics-hlsl-intrinsic-functions.md)
[Shader Model 5](https://github.com/MicrosoftDocs/win32/blob/docs/desktop-src//direct3dhlsl/d3d11-graphics-reference-sm5.md)
damyanp commented 1 week ago

Marking re-estimate this. Since this was originally refined, we have a different approach to implementing intrinsics and the way we've been estimating intrinsics has changed quite a bit.

adam-yang commented 6 days ago

I'll be working on this.