Skip to content

Workgroup doesn't work in MoltenVk #266

Open
@redain

Description

@redain

Expected Behaviour

I should be able to use workgroups in compute shaders.

Example & Steps To Reproduce

This is the most simplified example I could make to reproduce.

#[spirv(compute(threads(256)))]
    pub fn test(
        #[spirv(local_invocation_id)] lid: UVec3,
        #[spirv(workgroup_id)] gid: UVec3,
        #[spirv(workgroup)] shared: &mut [u32; 32],
        #[spirv(push_constant)] pc: &PushConstants,
        #[spirv(storage_buffer, descriptor_set = 0, binding = 0)] all_bufs: &mut RuntimeArray<
            TypedBuffer<[u32]>,
        >,
    ) {
        shared[0] = 1;
        shared[1] = 2;
        let a = Vec2::new(shared[0] as f32, shared[1] as f32);
    }

produces this runtime Vulkan error:

vkCreateShaderModule(): pCreateInfo->pCode (spirv-val produced an error):
Invalid explicit layout decorations on type for operand '17[%17]'
  %shared = OpVariable %_ptr_Workgroup__arr_uint_uint_32 Workgroup
The Vulkan spec states: All variables must have valid explicit layout decorations as described in Shader Interfaces (https://vulkan.lunarg.com/doc/view/1.4.313.0/mac/antora/spec/latest/appendices/spirvenv.html#VUID-StandaloneSpirv-None-10684)    

spir-v snippet:

 OpCapability Shader
               OpCapability Int64
               OpCapability StorageImageExtendedFormats
               OpCapability ImageQuery
               OpCapability StorageImageWriteWithoutFormat
               OpCapability RuntimeDescriptorArray
               OpExtension "SPV_EXT_descriptor_indexing"
               OpExtension "SPV_KHR_storage_buffer_storage_class"
               OpMemoryModel Logical GLSL450
               OpEntryPoint GLCompute %1 "test" %lid %gid
               OpExecutionMode %1 LocalSize 256 1 1
  OpName %lid "lid"
               OpName %gid "gid"
               OpName %shared "shared"
               OpDecorate %lid BuiltIn LocalInvocationId
               OpDecorate %gid BuiltIn WorkgroupId
               OpDecorate %_arr_uint_uint_32 ArrayStride 4
       %void = OpTypeVoid
          %8 = OpTypeFunction %void
       %uint = OpTypeInt 32 0
     %uint_0 = OpConstant %uint 0
     %uint_1 = OpConstant %uint 1
       %bool = OpTypeBool
     %v3uint = OpTypeVector %uint 3
%_ptr_Input_v3uint = OpTypePointer Input %v3uint
    %uint_32 = OpConstant %uint 32
        %lid = OpVariable %_ptr_Input_v3uint Input
        %gid = OpVariable %_ptr_Input_v3uint Input
%_ptr_Workgroup_uint = OpTypePointer Workgroup %uint
%_arr_uint_uint_32 = OpTypeArray %uint %uint_32
%_ptr_Workgroup__arr_uint_uint_32 = OpTypePointer Workgroup %_arr_uint_uint_32
     %shared = OpVariable %_ptr_Workgroup__arr_uint_uint_32 Workgroup
          %1 = OpFunction %void None %8
         %18 = OpLabel
               OpLine %4 209 8
         %19 = OpLoad %v3uint %lid
               OpLine %4 210 8
         %20 = OpLoad %v3uint %gid
               OpLine %4 217 8
         %21 = OpULessThan %bool %uint_0 %uint_32
               OpNoLine
               OpSelectionMerge %22 None
               OpBranchConditional %21 %23 %24
         %23 = OpLabel
               OpBranch %22
         %24 = OpLabel
               OpReturn
         %22 = OpLabel
               OpLine %4 217 8
         %25 = OpInBoundsAccessChain %_ptr_Workgroup_uint %shared %uint_0
               OpStore %25 %uint_1
               OpLine %4 218 26
         %26 = OpULessThan %bool %uint_0 %uint_32
               OpNoLine
               OpSelectionMerge %27 None
               OpBranchConditional %26 %28 %29
         %28 = OpLabel
               OpBranch %27
         %29 = OpLabel
               OpReturn
         %27 = OpLabel
               OpLine %4 218 26
         %30 = OpInBoundsAccessChain %_ptr_Workgroup_uint %shared %uint_0
         %31 = OpLoad %uint %30
               OpLine %4 218 44
         %32 = OpULessThan %bool %uint_1 %uint_32
               OpNoLine
               OpSelectionMerge %33 None
               OpBranchConditional %32 %34 %35
         %34 = OpLabel
               OpBranch %33
         %35 = OpLabel
               OpReturn
         %33 = OpLabel
               OpLine %4 218 44
         %36 = OpInBoundsAccessChain %_ptr_Workgroup_uint %shared %uint_1
         %37 = OpLoad %uint %36
               OpNoLine
               OpReturn
               OpFunctionEnd

System Info

  • Rust: nightly-2024-11-22
  • OS: MacOS 15.5
  • GPU: Apple M1 (Integrated GPU) with Vulkan 1.2.296
  • SPIR-V: SPIRV-Tools v2025.2 v2025.2.rc2-0-ga62abcb4
  • Vulkan Loader version: 1.4.313
  • rust-gpu: commit: 86fc480

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions