1#!amber
2
3# SPIR-V Spec: OpImageQuerySamples must have a MS of 1
4DEVICE_FEATURE shaderStorageImageMultisample
5
6SHADER compute compute_shader SPIRV-ASM
7; Test OpImageQuerySamples can be used with
8; an OpTypeImage with Sampled set to 2 (storage image)
9;
10;#version 450
11;layout(local_size_x = 1, local_size_y = 1) in;
12;
13;layout(set = 0, binding = 0, rgba8) uniform image2DMS storageImageMS;
14;layout(set = 0, binding = 1) buffer dataBuffer {
15;   int outValue;
16;};
17;
18;void main()
19;{
20;    outValue = imageSamples(storageImageMS);
21;}
22;
23; SPIR-V
24; Version: 1.0
25; Generator: Khronos Glslang Reference Front End; 10
26; Bound: 24
27; Schema: 0
28               OpCapability Shader
29               OpCapability StorageImageMultisample
30               OpCapability ImageQuery
31          %1 = OpExtInstImport "GLSL.std.450"
32               OpMemoryModel Logical GLSL450
33               OpEntryPoint GLCompute %main "main"
34               OpExecutionMode %main LocalSize 1 1 1
35               OpSource GLSL 450
36               OpName %main "main"
37               OpName %dataBuffer "dataBuffer"
38               OpMemberName %dataBuffer 0 "outValue"
39               OpName %_ ""
40               OpName %storageImageMS "storageImageMS"
41               OpMemberDecorate %dataBuffer 0 Offset 0
42               OpDecorate %dataBuffer BufferBlock
43               OpDecorate %_ DescriptorSet 0
44               OpDecorate %_ Binding 1
45               OpDecorate %storageImageMS DescriptorSet 0
46               OpDecorate %storageImageMS Binding 0
47               OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize
48       %void = OpTypeVoid
49          %3 = OpTypeFunction %void
50        %int = OpTypeInt 32 1
51 %dataBuffer = OpTypeStruct %int
52%_ptr_Uniform_dataBuffer = OpTypePointer Uniform %dataBuffer
53          %_ = OpVariable %_ptr_Uniform_dataBuffer Uniform
54      %int_0 = OpConstant %int 0
55      %float = OpTypeFloat 32
56         %12 = OpTypeImage %float 2D 0 0 1 2 Rgba8
57%_ptr_UniformConstant_12 = OpTypePointer UniformConstant %12
58%storageImageMS = OpVariable %_ptr_UniformConstant_12 UniformConstant
59%_ptr_Uniform_int = OpTypePointer Uniform %int
60       %uint = OpTypeInt 32 0
61     %v3uint = OpTypeVector %uint 3
62    %uint_16 = OpConstant %uint 16
63     %uint_1 = OpConstant %uint 1
64%gl_WorkGroupSize = OpConstantComposite %v3uint %uint_16 %uint_16 %uint_1
65       %main = OpFunction %void None %3
66          %5 = OpLabel
67         %15 = OpLoad %12 %storageImageMS
68         %16 = OpImageQuerySamples %int %15
69         %18 = OpAccessChain %_ptr_Uniform_int %_ %int_0
70               OpStore %18 %16
71               OpReturn
72               OpFunctionEnd
73END
74
75IMAGE texture FORMAT R8G8B8A8_UNORM DIM_2D WIDTH 256 HEIGHT 256 SAMPLES 4
76BUFFER dataBuffer DATA_TYPE int32 SIZE 1 FILL 0
77
78PIPELINE compute pipeline
79  ATTACH compute_shader
80  BIND BUFFER texture AS storage_image DESCRIPTOR_SET 0 BINDING 0
81  BIND BUFFER dataBuffer AS storage DESCRIPTOR_SET 0 BINDING 1
82END
83
84RUN pipeline 1 1 1
85
86BUFFER result DATA_TYPE int32 DATA
87 4
88END
89EXPECT dataBuffer EQ_BUFFER result