Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Unsupported instruction AtomicExchange at Function #2413

Closed
Jorgemagic opened this issue Jul 25, 2023 · 1 comment
Closed

Unsupported instruction AtomicExchange at Function #2413

Jorgemagic opened this issue Jul 25, 2023 · 1 comment

Comments

@Jorgemagic
Copy link

I am trying to translate from Spirv to WGSL using Naga

First, I started with the following HLSL:

RWStructuredBuffer<uint1> data: register(u1);

[numthreads(128, 1, 1)]
void csSimpleTest(uint3 ID : SV_GroupThreadID, uint3 GP : SV_GroupID)  
{
                uint1 index = GP.x*100+ID.x;
                uint originalValue;
                InterlockedExchange(data[index].x, 1, originalValue);                        
}

I used the DirectX compiler to translate this HLSL to Spirv (spirv-dis to disassemble it)

; SPIR-V
; Version: 1.0
; Generator: Google spiregg; 0
; Bound: 28
; Schema: 0
               OpCapability Shader
               OpMemoryModel Logical GLSL450
               OpEntryPoint GLCompute %csSimpleTest "csSimpleTest" %gl_LocalInvocationID %gl_WorkGroupID
               OpExecutionMode %csSimpleTest LocalSize 128 1 1
               OpSource HLSL 600
               OpName %type_RWStructuredBuffer_uint "type.RWStructuredBuffer.uint"
               OpName %data "data"
               OpName %csSimpleTest "csSimpleTest"
               OpDecorate %gl_LocalInvocationID BuiltIn LocalInvocationId
               OpDecorate %gl_WorkGroupID BuiltIn WorkgroupId
               OpDecorate %data DescriptorSet 0
               OpDecorate %data Binding 1
               OpDecorate %_runtimearr_uint ArrayStride 4
               OpMemberDecorate %type_RWStructuredBuffer_uint 0 Offset 0
               OpDecorate %type_RWStructuredBuffer_uint BufferBlock
        %int = OpTypeInt 32 1
      %int_0 = OpConstant %int 0
       %uint = OpTypeInt 32 0
   %uint_100 = OpConstant %uint 100
     %uint_0 = OpConstant %uint 0
     %uint_1 = OpConstant %uint 1
%_runtimearr_uint = OpTypeRuntimeArray %uint
%type_RWStructuredBuffer_uint = OpTypeStruct %_runtimearr_uint
%_ptr_Uniform_type_RWStructuredBuffer_uint = OpTypePointer Uniform %type_RWStructuredBuffer_uint
     %v3uint = OpTypeVector %uint 3
%_ptr_Input_v3uint = OpTypePointer Input %v3uint
       %void = OpTypeVoid
         %17 = OpTypeFunction %void
%_ptr_Uniform_uint = OpTypePointer Uniform %uint
       %data = OpVariable %_ptr_Uniform_type_RWStructuredBuffer_uint Uniform
%gl_LocalInvocationID = OpVariable %_ptr_Input_v3uint Input
%gl_WorkGroupID = OpVariable %_ptr_Input_v3uint Input
%csSimpleTest = OpFunction %void None %17
         %19 = OpLabel
         %20 = OpLoad %v3uint %gl_LocalInvocationID
         %21 = OpLoad %v3uint %gl_WorkGroupID
         %22 = OpCompositeExtract %uint %21 0
         %23 = OpIMul %uint %22 %uint_100
         %24 = OpCompositeExtract %uint %20 0
         %25 = OpIAdd %uint %23 %24
         %26 = OpAccessChain %_ptr_Uniform_uint %data %int_0 %25
         %27 = OpAtomicExchange %uint %26 %uint_1 %uint_0 %uint_1
               OpReturn
               OpFunctionEnd

Finally, I used Naga to translate from Spirv to Wgsl and the following error is thrown:
Unsupported instruction AtomicExchange at Function

@teoxoy
Copy link
Member

teoxoy commented Jul 25, 2023

Thanks for the report!

Atomics are not currently supported by the SPIR-V frontend and they are non-trivial to implement.

Closing as duplicate of gfx-rs/wgpu#4489

@teoxoy teoxoy closed this as not planned Won't fix, can't repro, duplicate, stale Jul 25, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants