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

Strange massive expansion of shader #5538

Closed
buzmeg opened this issue Nov 12, 2024 · 2 comments · Fixed by #5544
Closed

Strange massive expansion of shader #5538

buzmeg opened this issue Nov 12, 2024 · 2 comments · Fixed by #5544
Assignees
Labels
goal:client support Feature or fix needed for a current slang user.

Comments

@buzmeg
Copy link

buzmeg commented Nov 12, 2024

I'm seeing a very bizarre expansion of a shader that seems to work just fine when compiled under DXC:

Any advice would be appreciated.

Thanks.

The following shader seems to give a very strange massive expansion in slang (that then causes VK_ERROR_DEVICE_LOST in Vulkan):

#define CHUNK_SIZE_X 16
#define CHUNK_SIZE_Y 16

#define VARIABLE_ARRAY_ENTRIES 1

#define FILL_PATTERN_DIMENSIONS_X 16
#define FILL_PATTERN_DIMENSIONS_Y 16


struct PushData {
    uint2 dst_origin;
    uint dst_ww;
    uint dst_hh;
    uint u32_fill_pattern_index;
};

struct FillPatternBuffer {
    float4 px[FILL_PATTERN_DIMENSIONS_Y][FILL_PATTERN_DIMENSIONS_X];
};


[[vk::push_constant]]
ConstantBuffer<PushData> pcb;

[[vk::binding(0, 0)]]
ConstantBuffer<PushData> pdb;


[[vk::binding(0, 1)]]
StructuredBuffer<FillPatternBuffer> dp;


[[vk::binding(0, 2)]]
[[vk::image_format("rgba8")]] RWTexture2D<float4> image_swapchain;


[numthreads(CHUNK_SIZE_X, CHUNK_SIZE_Y, 1)]  // equivalent to local_size
void main(uint3 Gid    : SV_GroupID,
            uint3 DTid : SV_DispatchThreadID, 
            uint3 GTid : SV_GroupThreadID, 
            uint GI    : SV_GroupIndex) {

    const uint ii = GTid.x;
    const uint jj = GTid.y;

    const float4 pmv = dp[0].px[ii][jj];

    // printf("%4v2d %4v4f\n", GTid.xy, pmv);

    // image_swapchain[dst_coords] = float4(0.0, 1.0, 1.0, 1.0);

    image_swapchain[uint2(128, 128)] = pmv;
    image_swapchain[uint2(128, 128)] = float4(1.0, 0.0, 0.0, 1.0);
}

The DXC compiled code seems reasonable:

dxc -Tcs_6_8 -spirv -fspv-target-env=vulkan1.3 -Emain cs_copy_scatter.slang -Fo cs_copy_scatter.spv -Fc cs_copy_scatter.spv.dxc
; SPIR-V
; Version: 1.6
; Generator: Google spiregg; 0
; Bound: 39
; Schema: 0
               OpCapability Shader
               OpMemoryModel Logical GLSL450
               OpEntryPoint GLCompute %main "main" %gl_LocalInvocationID %dp %image_swapchain
               OpExecutionMode %main LocalSize 16 16 1
               OpSource HLSL 680
               OpName %type_StructuredBuffer_FillPatternBuffer "type.StructuredBuffer.FillPatternBuffer"
               OpName %FillPatternBuffer "FillPatternBuffer"
               OpMemberName %FillPatternBuffer 0 "px"
               OpName %dp "dp"
               OpName %type_2d_image "type.2d.image"
               OpName %image_swapchain "image_swapchain"
               OpName %main "main"
               OpDecorate %gl_LocalInvocationID BuiltIn LocalInvocationId
               OpDecorate %dp DescriptorSet 1
               OpDecorate %dp Binding 0
               OpDecorate %image_swapchain DescriptorSet 2
               OpDecorate %image_swapchain Binding 0
               OpDecorate %_arr_v4float_uint_16 ArrayStride 16
               OpDecorate %_arr__arr_v4float_uint_16_uint_16 ArrayStride 256
               OpMemberDecorate %FillPatternBuffer 0 Offset 0
               OpDecorate %_runtimearr_FillPatternBuffer ArrayStride 4096
               OpMemberDecorate %type_StructuredBuffer_FillPatternBuffer 0 Offset 0
               OpMemberDecorate %type_StructuredBuffer_FillPatternBuffer 0 NonWritable
               OpDecorate %type_StructuredBuffer_FillPatternBuffer Block
        %int = OpTypeInt 32 1
      %int_0 = OpConstant %int 0
       %uint = OpTypeInt 32 0
     %uint_0 = OpConstant %uint 0
   %uint_128 = OpConstant %uint 128
     %v2uint = OpTypeVector %uint 2
         %17 = OpConstantComposite %v2uint %uint_128 %uint_128
      %float = OpTypeFloat 32
    %float_1 = OpConstant %float 1
    %float_0 = OpConstant %float 0
    %v4float = OpTypeVector %float 4
         %22 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
    %uint_16 = OpConstant %uint 16
%_arr_v4float_uint_16 = OpTypeArray %v4float %uint_16
%_arr__arr_v4float_uint_16_uint_16 = OpTypeArray %_arr_v4float_uint_16 %uint_16
%FillPatternBuffer = OpTypeStruct %_arr__arr_v4float_uint_16_uint_16
%_runtimearr_FillPatternBuffer = OpTypeRuntimeArray %FillPatternBuffer
%type_StructuredBuffer_FillPatternBuffer = OpTypeStruct %_runtimearr_FillPatternBuffer
%_ptr_StorageBuffer_type_StructuredBuffer_FillPatternBuffer = OpTypePointer StorageBuffer %type_StructuredBuffer_FillPatternBuffer
%type_2d_image = OpTypeImage %float 2D 2 0 0 2 Rgba8
%_ptr_UniformConstant_type_2d_image = OpTypePointer UniformConstant %type_2d_image
     %v3uint = OpTypeVector %uint 3
%_ptr_Input_v3uint = OpTypePointer Input %v3uint
       %void = OpTypeVoid
         %29 = OpTypeFunction %void
%_ptr_StorageBuffer_v4float = OpTypePointer StorageBuffer %v4float
         %dp = OpVariable %_ptr_StorageBuffer_type_StructuredBuffer_FillPatternBuffer StorageBuffer
%image_swapchain = OpVariable %_ptr_UniformConstant_type_2d_image UniformConstant
%gl_LocalInvocationID = OpVariable %_ptr_Input_v3uint Input
       %main = OpFunction %void None %29
         %31 = OpLabel
         %32 = OpLoad %v3uint %gl_LocalInvocationID
         %33 = OpCompositeExtract %uint %32 0
         %34 = OpCompositeExtract %uint %32 1
         %35 = OpAccessChain %_ptr_StorageBuffer_v4float %dp %int_0 %uint_0 %int_0 %33 %34
         %36 = OpLoad %v4float %35
         %37 = OpLoad %type_2d_image %image_swapchain
               OpImageWrite %37 %17 %36 None
         %38 = OpLoad %type_2d_image %image_swapchain
               OpImageWrite %38 %17 %22 None
               OpReturn
               OpFunctionEnd

The slang compiled code seems to lose the plot:

slangc cs_copy_scatter.slang -target spirv -profile spirv_1_6 -stage compute -entry main -o cs_copy_scatter.spv
slangc cs_copy_scatter.slang -target spirv-asm -profile spirv_1_6 -stage compute -entry main -o cs_copy_scatter.asm.spv
; SPIR-V
; Version: 1.6
; Generator: Khronos; 40
; Bound: 2998
; Schema: 0
OpCapability Shader
OpExtension "SPV_KHR_storage_buffer_storage_class"
OpMemoryModel Logical GLSL450
OpEntryPoint GLCompute %main "main" %dp %image_swapchain %gl_LocalInvocationID
OpExecutionMode %main LocalSize 16 16 1

; Debug Information
OpSource Slang 1
OpName %ii "ii"                                     ; id %18
OpName %jj "jj"                                     ; id %20
OpName %_Array_std430_vector_float_4_16 "_Array_std430_vector<float,4>16"   ; id %25
OpMemberName %_Array_std430_vector_float_4_16 0 "data"
OpName %_Array_std430_array_vector_float_4__16_16 "_Array_std430_array<vector<float,4>,16>16"   ; id %23
OpMemberName %_Array_std430_array_vector_float_4__16_16 0 "data"
OpName %FillPatternBuffer_std430 "FillPatternBuffer_std430"     ; id %22
OpMemberName %FillPatternBuffer_std430 0 "px"
OpName %StructuredBuffer "StructuredBuffer"         ; id %29
OpName %dp "dp"                                     ; id %32
OpName %image_swapchain "image_swapchain"           ; id %154
OpName %main "main"                                 ; id %2

; Annotations
OpDecorate %_arr_v4float_int_16 ArrayStride 16
OpDecorate %_arr__arr_v4float_int_16_int_16 ArrayStride 256
OpDecorate %gl_LocalInvocationID BuiltIn LocalInvocationId
OpDecorate %_arr_v4float_int_16_0 ArrayStride 16
OpMemberDecorate %_Array_std430_vector_float_4_16 0 Offset 0
OpDecorate %_arr__Array_std430_vector_float_4_16_int_16 ArrayStride 256
OpMemberDecorate %_Array_std430_array_vector_float_4__16_16 0 Offset 0
OpMemberDecorate %FillPatternBuffer_std430 0 Offset 0
OpDecorate %_runtimearr_FillPatternBuffer_std430 ArrayStride 4096
OpDecorate %StructuredBuffer Block
OpMemberDecorate %StructuredBuffer 0 Offset 0
OpDecorate %dp Binding 0
OpDecorate %dp DescriptorSet 1
OpDecorate %dp NonWritable
OpDecorate %image_swapchain Binding 0
OpDecorate %image_swapchain DescriptorSet 2

; Types, variables and constants
%void = OpTypeVoid
%3 = OpTypeFunction %void
%float = OpTypeFloat 32
%v4float = OpTypeVector %float 4
%int = OpTypeInt 32 1
%int_16 = OpConstant %int 16
%_arr_v4float_int_16 = OpTypeArray %v4float %int_16     ; ArrayStride 16
%_arr__arr_v4float_int_16_int_16 = OpTypeArray %_arr_v4float_int_16 %int_16     ; ArrayStride 256
%_ptr_Function__arr__arr_v4float_int_16_int_16 = OpTypePointer Function %_arr__arr_v4float_int_16_int_16
%uint = OpTypeInt 32 0
%v3uint = OpTypeVector %uint 3
%_ptr_Input_v3uint = OpTypePointer Input %v3uint
%int_0 = OpConstant %int 0
%_arr_v4float_int_16_0 = OpTypeArray %v4float %int_16   ; ArrayStride 16
%_Array_std430_vector_float_4_16 = OpTypeStruct %_arr_v4float_int_16_0
%_arr__Array_std430_vector_float_4_16_int_16 = OpTypeArray %_Array_std430_vector_float_4_16 %int_16     ; ArrayStride 256
%_Array_std430_array_vector_float_4__16_16 = OpTypeStruct %_arr__Array_std430_vector_float_4_16_int_16
%FillPatternBuffer_std430 = OpTypeStruct %_Array_std430_array_vector_float_4__16_16
%_ptr_StorageBuffer_FillPatternBuffer_std430 = OpTypePointer StorageBuffer %FillPatternBuffer_std430
%_runtimearr_FillPatternBuffer_std430 = OpTypeRuntimeArray %FillPatternBuffer_std430    ; ArrayStride 4096
%StructuredBuffer = OpTypeStruct %_runtimearr_FillPatternBuffer_std430                  ; Block
%_ptr_StorageBuffer_StructuredBuffer = OpTypePointer StorageBuffer %StructuredBuffer
%_ptr_Function__arr_v4float_int_16 = OpTypePointer Function %_arr_v4float_int_16
%_ptr_Function_v4float = OpTypePointer Function %v4float
%151 = OpTypeImage %float 2D 2 0 0 2 Rgba8
%_ptr_UniformConstant_151 = OpTypePointer UniformConstant %151
%v2uint = OpTypeVector %uint 2
%uint_128 = OpConstant %uint 128
%156 = OpConstantComposite %v2uint %uint_128 %uint_128
%float_1 = OpConstant %float 1
%float_0 = OpConstant %float 0
%160 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
%gl_LocalInvocationID = OpVariable %_ptr_Input_v3uint Input     ; BuiltIn LocalInvocationId
%dp = OpVariable %_ptr_StorageBuffer_StructuredBuffer StorageBuffer     ; Binding 0, DescriptorSet 1, NonWritable
%image_swapchain = OpVariable %_ptr_UniformConstant_151 UniformConstant     ; Binding 0, DescriptorSet 2

; Function main
%main = OpFunction %void None %3
%4 = OpLabel
%12 = OpVariable %_ptr_Function__arr__arr_v4float_int_16_int_16 Function
%15 = OpLoad %v3uint %gl_LocalInvocationID
%ii = OpCompositeExtract %uint %15 0
%19 = OpLoad %v3uint %gl_LocalInvocationID
%jj = OpCompositeExtract %uint %19 1
%28 = OpAccessChain %_ptr_StorageBuffer_FillPatternBuffer_std430 %dp %int_0 %int_0
%33 = OpLoad %FillPatternBuffer_std430 %28
%169 = OpCompositeExtract %_Array_std430_array_vector_float_4__16_16 %33 0
%190 = OpCompositeExtract %_arr__Array_std430_vector_float_4_16_int_16 %169 0
%191 = OpCompositeExtract %_Array_std430_vector_float_4_16 %190 0
%241 = OpCompositeExtract %_arr_v4float_int_16_0 %191 0
%242 = OpCompositeExtract %v4float %241 0
%243 = OpCompositeExtract %v4float %241 1
%244 = OpCompositeExtract %v4float %241 2
%245 = OpCompositeExtract %v4float %241 3
%246 = OpCompositeExtract %v4float %241 4
%247 = OpCompositeExtract %v4float %241 5
%248 = OpCompositeExtract %v4float %241 6
%249 = OpCompositeExtract %v4float %241 7
%250 = OpCompositeExtract %v4float %241 8
%251 = OpCompositeExtract %v4float %241 9
%252 = OpCompositeExtract %v4float %241 10
%253 = OpCompositeExtract %v4float %241 11
%254 = OpCompositeExtract %v4float %241 12
%255 = OpCompositeExtract %v4float %241 13
%256 = OpCompositeExtract %v4float %241 14
%257 = OpCompositeExtract %v4float %241 15
%194 = OpCompositeExtract %_Array_std430_vector_float_4_16 %190 1
%260 = OpCompositeExtract %_arr_v4float_int_16_0 %194 0
%261 = OpCompositeExtract %v4float %260 0
%262 = OpCompositeExtract %v4float %260 1
%263 = OpCompositeExtract %v4float %260 2
%264 = OpCompositeExtract %v4float %260 3
%265 = OpCompositeExtract %v4float %260 4
%266 = OpCompositeExtract %v4float %260 5
%267 = OpCompositeExtract %v4float %260 6
%268 = OpCompositeExtract %v4float %260 7
%269 = OpCompositeExtract %v4float %260 8
%270 = OpCompositeExtract %v4float %260 9
%271 = OpCompositeExtract %v4float %260 10
%272 = OpCompositeExtract %v4float %260 11
%273 = OpCompositeExtract %v4float %260 12
%274 = OpCompositeExtract %v4float %260 13
%275 = OpCompositeExtract %v4float %260 14
%276 = OpCompositeExtract %v4float %260 15
%197 = OpCompositeExtract %_Array_std430_vector_float_4_16 %190 2
%279 = OpCompositeExtract %_arr_v4float_int_16_0 %197 0
%280 = OpCompositeExtract %v4float %279 0
%281 = OpCompositeExtract %v4float %279 1
%282 = OpCompositeExtract %v4float %279 2
%283 = OpCompositeExtract %v4float %279 3
%284 = OpCompositeExtract %v4float %279 4
%285 = OpCompositeExtract %v4float %279 5
%286 = OpCompositeExtract %v4float %279 6
%287 = OpCompositeExtract %v4float %279 7
%288 = OpCompositeExtract %v4float %279 8
%289 = OpCompositeExtract %v4float %279 9
%290 = OpCompositeExtract %v4float %279 10
%291 = OpCompositeExtract %v4float %279 11
%292 = OpCompositeExtract %v4float %279 12
%293 = OpCompositeExtract %v4float %279 13
%294 = OpCompositeExtract %v4float %279 14
%295 = OpCompositeExtract %v4float %279 15
%200 = OpCompositeExtract %_Array_std430_vector_float_4_16 %190 3
%298 = OpCompositeExtract %_arr_v4float_int_16_0 %200 0
%299 = OpCompositeExtract %v4float %298 0
%300 = OpCompositeExtract %v4float %298 1
%301 = OpCompositeExtract %v4float %298 2
%302 = OpCompositeExtract %v4float %298 3
%303 = OpCompositeExtract %v4float %298 4
%304 = OpCompositeExtract %v4float %298 5
%305 = OpCompositeExtract %v4float %298 6
%306 = OpCompositeExtract %v4float %298 7
%307 = OpCompositeExtract %v4float %298 8
%308 = OpCompositeExtract %v4float %298 9
%309 = OpCompositeExtract %v4float %298 10
%310 = OpCompositeExtract %v4float %298 11
%311 = OpCompositeExtract %v4float %298 12
%312 = OpCompositeExtract %v4float %298 13
%313 = OpCompositeExtract %v4float %298 14
%314 = OpCompositeExtract %v4float %298 15
%203 = OpCompositeExtract %_Array_std430_vector_float_4_16 %190 4
%317 = OpCompositeExtract %_arr_v4float_int_16_0 %203 0
%318 = OpCompositeExtract %v4float %317 0
%319 = OpCompositeExtract %v4float %317 1
%320 = OpCompositeExtract %v4float %317 2
%321 = OpCompositeExtract %v4float %317 3
%322 = OpCompositeExtract %v4float %317 4
%323 = OpCompositeExtract %v4float %317 5
%324 = OpCompositeExtract %v4float %317 6
%325 = OpCompositeExtract %v4float %317 7
%326 = OpCompositeExtract %v4float %317 8
%327 = OpCompositeExtract %v4float %317 9
%328 = OpCompositeExtract %v4float %317 10
%329 = OpCompositeExtract %v4float %317 11
%330 = OpCompositeExtract %v4float %317 12
%331 = OpCompositeExtract %v4float %317 13
%332 = OpCompositeExtract %v4float %317 14
%333 = OpCompositeExtract %v4float %317 15
%206 = OpCompositeExtract %_Array_std430_vector_float_4_16 %190 5
%336 = OpCompositeExtract %_arr_v4float_int_16_0 %206 0
%337 = OpCompositeExtract %v4float %336 0
%338 = OpCompositeExtract %v4float %336 1
%339 = OpCompositeExtract %v4float %336 2
%340 = OpCompositeExtract %v4float %336 3
%341 = OpCompositeExtract %v4float %336 4
%342 = OpCompositeExtract %v4float %336 5
%343 = OpCompositeExtract %v4float %336 6
%344 = OpCompositeExtract %v4float %336 7
%345 = OpCompositeExtract %v4float %336 8
%346 = OpCompositeExtract %v4float %336 9
%347 = OpCompositeExtract %v4float %336 10
%348 = OpCompositeExtract %v4float %336 11
%349 = OpCompositeExtract %v4float %336 12
%350 = OpCompositeExtract %v4float %336 13
%351 = OpCompositeExtract %v4float %336 14
%352 = OpCompositeExtract %v4float %336 15
%209 = OpCompositeExtract %_Array_std430_vector_float_4_16 %190 6
%355 = OpCompositeExtract %_arr_v4float_int_16_0 %209 0
%356 = OpCompositeExtract %v4float %355 0
%357 = OpCompositeExtract %v4float %355 1
%358 = OpCompositeExtract %v4float %355 2
%359 = OpCompositeExtract %v4float %355 3
%360 = OpCompositeExtract %v4float %355 4
%361 = OpCompositeExtract %v4float %355 5
%362 = OpCompositeExtract %v4float %355 6
%363 = OpCompositeExtract %v4float %355 7
%364 = OpCompositeExtract %v4float %355 8
%365 = OpCompositeExtract %v4float %355 9
%366 = OpCompositeExtract %v4float %355 10
%367 = OpCompositeExtract %v4float %355 11
%368 = OpCompositeExtract %v4float %355 12
%369 = OpCompositeExtract %v4float %355 13
%370 = OpCompositeExtract %v4float %355 14
%371 = OpCompositeExtract %v4float %355 15
%212 = OpCompositeExtract %_Array_std430_vector_float_4_16 %190 7
%374 = OpCompositeExtract %_arr_v4float_int_16_0 %212 0
%375 = OpCompositeExtract %v4float %374 0
%376 = OpCompositeExtract %v4float %374 1
%377 = OpCompositeExtract %v4float %374 2
%378 = OpCompositeExtract %v4float %374 3
%379 = OpCompositeExtract %v4float %374 4
%380 = OpCompositeExtract %v4float %374 5
%381 = OpCompositeExtract %v4float %374 6
%382 = OpCompositeExtract %v4float %374 7
%383 = OpCompositeExtract %v4float %374 8
%384 = OpCompositeExtract %v4float %374 9
%385 = OpCompositeExtract %v4float %374 10
%386 = OpCompositeExtract %v4float %374 11
%387 = OpCompositeExtract %v4float %374 12
%388 = OpCompositeExtract %v4float %374 13
%389 = OpCompositeExtract %v4float %374 14
%390 = OpCompositeExtract %v4float %374 15
%215 = OpCompositeExtract %_Array_std430_vector_float_4_16 %190 8
%393 = OpCompositeExtract %_arr_v4float_int_16_0 %215 0
%394 = OpCompositeExtract %v4float %393 0
%395 = OpCompositeExtract %v4float %393 1
%396 = OpCompositeExtract %v4float %393 2
%397 = OpCompositeExtract %v4float %393 3
%398 = OpCompositeExtract %v4float %393 4
%399 = OpCompositeExtract %v4float %393 5
%400 = OpCompositeExtract %v4float %393 6
%401 = OpCompositeExtract %v4float %393 7
%402 = OpCompositeExtract %v4float %393 8
%403 = OpCompositeExtract %v4float %393 9
%404 = OpCompositeExtract %v4float %393 10
%405 = OpCompositeExtract %v4float %393 11
%406 = OpCompositeExtract %v4float %393 12
%407 = OpCompositeExtract %v4float %393 13
%408 = OpCompositeExtract %v4float %393 14
%409 = OpCompositeExtract %v4float %393 15
%218 = OpCompositeExtract %_Array_std430_vector_float_4_16 %190 9
%412 = OpCompositeExtract %_arr_v4float_int_16_0 %218 0
%413 = OpCompositeExtract %v4float %412 0
%414 = OpCompositeExtract %v4float %412 1
%415 = OpCompositeExtract %v4float %412 2
%416 = OpCompositeExtract %v4float %412 3
%417 = OpCompositeExtract %v4float %412 4
%418 = OpCompositeExtract %v4float %412 5
%419 = OpCompositeExtract %v4float %412 6
%420 = OpCompositeExtract %v4float %412 7
%421 = OpCompositeExtract %v4float %412 8
%422 = OpCompositeExtract %v4float %412 9
%423 = OpCompositeExtract %v4float %412 10
%424 = OpCompositeExtract %v4float %412 11
%425 = OpCompositeExtract %v4float %412 12
%426 = OpCompositeExtract %v4float %412 13
%427 = OpCompositeExtract %v4float %412 14
%428 = OpCompositeExtract %v4float %412 15
%221 = OpCompositeExtract %_Array_std430_vector_float_4_16 %190 10
%431 = OpCompositeExtract %_arr_v4float_int_16_0 %221 0
%432 = OpCompositeExtract %v4float %431 0
%433 = OpCompositeExtract %v4float %431 1
%434 = OpCompositeExtract %v4float %431 2
%435 = OpCompositeExtract %v4float %431 3
%436 = OpCompositeExtract %v4float %431 4
%437 = OpCompositeExtract %v4float %431 5
%438 = OpCompositeExtract %v4float %431 6
%439 = OpCompositeExtract %v4float %431 7
%440 = OpCompositeExtract %v4float %431 8
%441 = OpCompositeExtract %v4float %431 9
%442 = OpCompositeExtract %v4float %431 10
%443 = OpCompositeExtract %v4float %431 11
%444 = OpCompositeExtract %v4float %431 12
%445 = OpCompositeExtract %v4float %431 13
%446 = OpCompositeExtract %v4float %431 14
%447 = OpCompositeExtract %v4float %431 15
%224 = OpCompositeExtract %_Array_std430_vector_float_4_16 %190 11
%450 = OpCompositeExtract %_arr_v4float_int_16_0 %224 0
%451 = OpCompositeExtract %v4float %450 0
%452 = OpCompositeExtract %v4float %450 1
%453 = OpCompositeExtract %v4float %450 2
%454 = OpCompositeExtract %v4float %450 3
%455 = OpCompositeExtract %v4float %450 4
%456 = OpCompositeExtract %v4float %450 5
%457 = OpCompositeExtract %v4float %450 6
%458 = OpCompositeExtract %v4float %450 7
%459 = OpCompositeExtract %v4float %450 8
%460 = OpCompositeExtract %v4float %450 9
%461 = OpCompositeExtract %v4float %450 10
%462 = OpCompositeExtract %v4float %450 11
%463 = OpCompositeExtract %v4float %450 12
%464 = OpCompositeExtract %v4float %450 13
%465 = OpCompositeExtract %v4float %450 14
%466 = OpCompositeExtract %v4float %450 15
%227 = OpCompositeExtract %_Array_std430_vector_float_4_16 %190 12
%469 = OpCompositeExtract %_arr_v4float_int_16_0 %227 0
%470 = OpCompositeExtract %v4float %469 0
%471 = OpCompositeExtract %v4float %469 1
%472 = OpCompositeExtract %v4float %469 2
%473 = OpCompositeExtract %v4float %469 3
%474 = OpCompositeExtract %v4float %469 4
%475 = OpCompositeExtract %v4float %469 5
%476 = OpCompositeExtract %v4float %469 6
%477 = OpCompositeExtract %v4float %469 7
%478 = OpCompositeExtract %v4float %469 8
%479 = OpCompositeExtract %v4float %469 9
%480 = OpCompositeExtract %v4float %469 10
%481 = OpCompositeExtract %v4float %469 11
%482 = OpCompositeExtract %v4float %469 12
%483 = OpCompositeExtract %v4float %469 13
%484 = OpCompositeExtract %v4float %469 14
%485 = OpCompositeExtract %v4float %469 15
%230 = OpCompositeExtract %_Array_std430_vector_float_4_16 %190 13
%488 = OpCompositeExtract %_arr_v4float_int_16_0 %230 0
%489 = OpCompositeExtract %v4float %488 0
%490 = OpCompositeExtract %v4float %488 1
%491 = OpCompositeExtract %v4float %488 2
%492 = OpCompositeExtract %v4float %488 3
%493 = OpCompositeExtract %v4float %488 4
%494 = OpCompositeExtract %v4float %488 5
%495 = OpCompositeExtract %v4float %488 6
%496 = OpCompositeExtract %v4float %488 7
%497 = OpCompositeExtract %v4float %488 8
%498 = OpCompositeExtract %v4float %488 9
%499 = OpCompositeExtract %v4float %488 10
%500 = OpCompositeExtract %v4float %488 11
%501 = OpCompositeExtract %v4float %488 12
%502 = OpCompositeExtract %v4float %488 13
%503 = OpCompositeExtract %v4float %488 14
%504 = OpCompositeExtract %v4float %488 15
%233 = OpCompositeExtract %_Array_std430_vector_float_4_16 %190 14
%507 = OpCompositeExtract %_arr_v4float_int_16_0 %233 0
%508 = OpCompositeExtract %v4float %507 0
%509 = OpCompositeExtract %v4float %507 1
%510 = OpCompositeExtract %v4float %507 2
%511 = OpCompositeExtract %v4float %507 3
%512 = OpCompositeExtract %v4float %507 4
%513 = OpCompositeExtract %v4float %507 5
%514 = OpCompositeExtract %v4float %507 6
%515 = OpCompositeExtract %v4float %507 7
%516 = OpCompositeExtract %v4float %507 8
%517 = OpCompositeExtract %v4float %507 9
%518 = OpCompositeExtract %v4float %507 10
%519 = OpCompositeExtract %v4float %507 11
%520 = OpCompositeExtract %v4float %507 12
%521 = OpCompositeExtract %v4float %507 13
%522 = OpCompositeExtract %v4float %507 14
%523 = OpCompositeExtract %v4float %507 15
%236 = OpCompositeExtract %_Array_std430_vector_float_4_16 %190 15
%526 = OpCompositeExtract %_arr_v4float_int_16_0 %236 0
%527 = OpCompositeExtract %v4float %526 0
%528 = OpCompositeExtract %v4float %526 1
%529 = OpCompositeExtract %v4float %526 2
%530 = OpCompositeExtract %v4float %526 3
%531 = OpCompositeExtract %v4float %526 4
%532 = OpCompositeExtract %v4float %526 5
%533 = OpCompositeExtract %v4float %526 6
%534 = OpCompositeExtract %v4float %526 7
%535 = OpCompositeExtract %v4float %526 8
%536 = OpCompositeExtract %v4float %526 9
%537 = OpCompositeExtract %v4float %526 10
%538 = OpCompositeExtract %v4float %526 11
%539 = OpCompositeExtract %v4float %526 12
%540 = OpCompositeExtract %v4float %526 13
%541 = OpCompositeExtract %v4float %526 14
%542 = OpCompositeExtract %v4float %526 15
%2997 = OpCompositeConstruct %_arr_v4float_int_16 %527 %528 %529 %530 %531 %532 %533 %534 %535 %536 %537 %538 %539 %540 %541 %542
%2948 = OpCompositeConstruct %_arr_v4float_int_16 %508 %509 %510 %511 %512 %513 %514 %515 %516 %517 %518 %519 %520 %521 %522 %523
%2899 = OpCompositeConstruct %_arr_v4float_int_16 %489 %490 %491 %492 %493 %494 %495 %496 %497 %498 %499 %500 %501 %502 %503 %504
%2850 = OpCompositeConstruct %_arr_v4float_int_16 %470 %471 %472 %473 %474 %475 %476 %477 %478 %479 %480 %481 %482 %483 %484 %485
%2801 = OpCompositeConstruct %_arr_v4float_int_16 %451 %452 %453 %454 %455 %456 %457 %458 %459 %460 %461 %462 %463 %464 %465 %466
%2752 = OpCompositeConstruct %_arr_v4float_int_16 %432 %433 %434 %435 %436 %437 %438 %439 %440 %441 %442 %443 %444 %445 %446 %447
%2703 = OpCompositeConstruct %_arr_v4float_int_16 %413 %414 %415 %416 %417 %418 %419 %420 %421 %422 %423 %424 %425 %426 %427 %428
%2654 = OpCompositeConstruct %_arr_v4float_int_16 %394 %395 %396 %397 %398 %399 %400 %401 %402 %403 %404 %405 %406 %407 %408 %409
%2605 = OpCompositeConstruct %_arr_v4float_int_16 %375 %376 %377 %378 %379 %380 %381 %382 %383 %384 %385 %386 %387 %388 %389 %390
%2556 = OpCompositeConstruct %_arr_v4float_int_16 %356 %357 %358 %359 %360 %361 %362 %363 %364 %365 %366 %367 %368 %369 %370 %371
%2507 = OpCompositeConstruct %_arr_v4float_int_16 %337 %338 %339 %340 %341 %342 %343 %344 %345 %346 %347 %348 %349 %350 %351 %352
%2458 = OpCompositeConstruct %_arr_v4float_int_16 %318 %319 %320 %321 %322 %323 %324 %325 %326 %327 %328 %329 %330 %331 %332 %333
%2409 = OpCompositeConstruct %_arr_v4float_int_16 %299 %300 %301 %302 %303 %304 %305 %306 %307 %308 %309 %310 %311 %312 %313 %314
%2360 = OpCompositeConstruct %_arr_v4float_int_16 %280 %281 %282 %283 %284 %285 %286 %287 %288 %289 %290 %291 %292 %293 %294 %295
%2311 = OpCompositeConstruct %_arr_v4float_int_16 %261 %262 %263 %264 %265 %266 %267 %268 %269 %270 %271 %272 %273 %274 %275 %276
%2262 = OpCompositeConstruct %_arr_v4float_int_16 %242 %243 %244 %245 %246 %247 %248 %249 %250 %251 %252 %253 %254 %255 %256 %257
%2213 = OpCompositeConstruct %_arr__arr_v4float_int_16_int_16 %2262 %2311 %2360 %2409 %2458 %2507 %2556 %2605 %2654 %2703 %2752 %2801 %2850 %2899 %2948 %2997
OpStore %12 %2213
%147 = OpAccessChain %_ptr_Function__arr_v4float_int_16 %12 %ii
%149 = OpAccessChain %_ptr_Function_v4float %147 %jj
%150 = OpLoad %v4float %149
%152 = OpLoad %151 %image_swapchain
OpImageWrite %152 %156 %150
%159 = OpLoad %151 %image_swapchain
OpImageWrite %159 %156 %160
OpReturn
OpFunctionEnd
@csyonghe
Copy link
Collaborator

Thank you for providing a detailed repro. I will look into this today.

@csyonghe csyonghe added the goal:client support Feature or fix needed for a current slang user. label Nov 12, 2024
@csyonghe csyonghe self-assigned this Nov 12, 2024
@csyonghe csyonghe added this to the Q4 2024 (Fall) milestone Nov 12, 2024
@csyonghe
Copy link
Collaborator

csyonghe commented Nov 12, 2024

This is now fixed with PR 5544. We now generate this code:

; SPIR-V
; Version: 1.5
; Generator: Khronos; 40
; Bound: 50
; Schema: 0
               OpCapability Shader
               OpExtension "SPV_KHR_storage_buffer_storage_class"
               OpMemoryModel Logical GLSL450
               OpEntryPoint GLCompute %main "main" %dp %outputBuffer %gl_LocalInvocationID %gl_LocalInvocationIndex
               OpExecutionMode %main LocalSize 4 4 1
               OpSource Slang 1
               OpName %ii "ii"
               OpName %jj "jj"
               OpName %_Array_std430_vector_float_4_16 "_Array_std430_vector<float,4>16"
               OpMemberName %_Array_std430_vector_float_4_16 0 "data"
               OpName %_Array_std430_array_vector_float_4__16_16 "_Array_std430_array<vector<float,4>,16>16"
               OpMemberName %_Array_std430_array_vector_float_4__16_16 0 "data"
               OpName %FillPatternBuffer_std430 "FillPatternBuffer_std430"
               OpMemberName %FillPatternBuffer_std430 0 "px"
               OpName %StructuredBuffer "StructuredBuffer"
               OpName %dp "dp"
               OpName %RWStructuredBuffer "RWStructuredBuffer"
               OpName %outputBuffer "outputBuffer"
               OpName %main "main"
               OpDecorate %gl_LocalInvocationID BuiltIn LocalInvocationId
               OpDecorate %_arr_v4float_int_16 ArrayStride 16
               OpMemberDecorate %_Array_std430_vector_float_4_16 0 Offset 0
               OpDecorate %_arr__Array_std430_vector_float_4_16_int_16 ArrayStride 256
               OpMemberDecorate %_Array_std430_array_vector_float_4__16_16 0 Offset 0
               OpMemberDecorate %FillPatternBuffer_std430 0 Offset 0
               OpDecorate %_runtimearr_FillPatternBuffer_std430 ArrayStride 4096
               OpDecorate %StructuredBuffer Block
               OpMemberDecorate %StructuredBuffer 0 Offset 0
               OpDecorate %dp Binding 0
               OpDecorate %dp DescriptorSet 0
               OpDecorate %dp NonWritable
               OpDecorate %gl_LocalInvocationIndex BuiltIn LocalInvocationIndex
               OpDecorate %_runtimearr_v4float ArrayStride 16
               OpDecorate %RWStructuredBuffer Block
               OpMemberDecorate %RWStructuredBuffer 0 Offset 0
               OpDecorate %outputBuffer Binding 1
               OpDecorate %outputBuffer DescriptorSet 0
       %void = OpTypeVoid
          %3 = OpTypeFunction %void
       %uint = OpTypeInt 32 0
     %v3uint = OpTypeVector %uint 3
%_ptr_Input_v3uint = OpTypePointer Input %v3uint
        %int = OpTypeInt 32 1
      %int_0 = OpConstant %int 0
      %float = OpTypeFloat 32
    %v4float = OpTypeVector %float 4
     %int_16 = OpConstant %int 16
%_arr_v4float_int_16 = OpTypeArray %v4float %int_16
%_Array_std430_vector_float_4_16 = OpTypeStruct %_arr_v4float_int_16
%_arr__Array_std430_vector_float_4_16_int_16 = OpTypeArray %_Array_std430_vector_float_4_16 %int_16
%_Array_std430_array_vector_float_4__16_16 = OpTypeStruct %_arr__Array_std430_vector_float_4_16_int_16
%FillPatternBuffer_std430 = OpTypeStruct %_Array_std430_array_vector_float_4__16_16
%_ptr_StorageBuffer_FillPatternBuffer_std430 = OpTypePointer StorageBuffer %FillPatternBuffer_std430
%_runtimearr_FillPatternBuffer_std430 = OpTypeRuntimeArray %FillPatternBuffer_std430
%StructuredBuffer = OpTypeStruct %_runtimearr_FillPatternBuffer_std430
%_ptr_StorageBuffer_StructuredBuffer = OpTypePointer StorageBuffer %StructuredBuffer
%_ptr_StorageBuffer__Array_std430_array_vector_float_4__16_16 = OpTypePointer StorageBuffer %_Array_std430_array_vector_float_4__16_16
%_ptr_StorageBuffer__arr__Array_std430_vector_float_4_16_int_16 = OpTypePointer StorageBuffer %_arr__Array_std430_vector_float_4_16_int_16
%_ptr_StorageBuffer__Array_std430_vector_float_4_16 = OpTypePointer StorageBuffer %_Array_std430_vector_float_4_16
%_ptr_StorageBuffer__arr_v4float_int_16 = OpTypePointer StorageBuffer %_arr_v4float_int_16
%_ptr_StorageBuffer_v4float = OpTypePointer StorageBuffer %v4float
%_ptr_Input_uint = OpTypePointer Input %uint
%_runtimearr_v4float = OpTypeRuntimeArray %v4float
%RWStructuredBuffer = OpTypeStruct %_runtimearr_v4float
%_ptr_StorageBuffer_RWStructuredBuffer = OpTypePointer StorageBuffer %RWStructuredBuffer
%gl_LocalInvocationID = OpVariable %_ptr_Input_v3uint Input
         %dp = OpVariable %_ptr_StorageBuffer_StructuredBuffer StorageBuffer
%gl_LocalInvocationIndex = OpVariable %_ptr_Input_uint Input
%outputBuffer = OpVariable %_ptr_StorageBuffer_RWStructuredBuffer StorageBuffer
       %main = OpFunction %void None %3
          %4 = OpLabel
          %7 = OpLoad %v3uint %gl_LocalInvocationID
         %ii = OpCompositeExtract %uint %7 0
         %11 = OpLoad %v3uint %gl_LocalInvocationID
         %jj = OpCompositeExtract %uint %11 1
         %24 = OpAccessChain %_ptr_StorageBuffer_FillPatternBuffer_std430 %dp %int_0 %int_0
         %30 = OpAccessChain %_ptr_StorageBuffer__Array_std430_array_vector_float_4__16_16 %24 %int_0
         %32 = OpAccessChain %_ptr_StorageBuffer__arr__Array_std430_vector_float_4_16_int_16 %30 %int_0
         %34 = OpAccessChain %_ptr_StorageBuffer__Array_std430_vector_float_4_16 %32 %ii
         %36 = OpAccessChain %_ptr_StorageBuffer__arr_v4float_int_16 %34 %int_0
         %38 = OpAccessChain %_ptr_StorageBuffer_v4float %36 %jj
         %39 = OpLoad %v4float %38
         %40 = OpLoad %uint %gl_LocalInvocationIndex
         %43 = OpAccessChain %_ptr_StorageBuffer_v4float %outputBuffer %int_0 %40
               OpStore %43 %39
               OpReturn
               OpFunctionEnd

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
goal:client support Feature or fix needed for a current slang user.
Projects
None yet
Development

Successfully merging a pull request may close this issue.

2 participants