This commit is contained in:
2026-05-06 23:44:13 +02:00
parent a5f787d80f
commit fd7038b853
1574 changed files with 365439 additions and 0 deletions
@@ -0,0 +1,76 @@
#!amber
# Test GLSL.std.450 FindUMsb instruction
SHADER compute test SPIRV-ASM
OpCapability Shader
%glsl = OpExtInstImport "GLSL.std.450"
OpMemoryModel Logical GLSL450
OpEntryPoint GLCompute %main "main" %gl_GlobalInvocationId
OpExecutionMode %main LocalSize 1 1 1
OpDecorate %gl_GlobalInvocationId BuiltIn GlobalInvocationId
OpDecorate %ra_int ArrayStride 4
OpDecorate %struct_int2 BufferBlock
OpMemberDecorate %struct_int2 0 Offset 0
OpDecorate %input DescriptorSet 0
OpDecorate %input Binding 0
OpDecorate %output DescriptorSet 0
OpDecorate %output Binding 1
%uint = OpTypeInt 32 0
%ptr_uint = OpTypePointer Uniform %uint
%ptr_input_uint = OpTypePointer Input %uint
%uint3 = OpTypeVector %uint 3
%ptr_input_uint3 = OpTypePointer Input %uint3
%void = OpTypeVoid
%voidFn = OpTypeFunction %void
%uint_0 = OpConstant %uint 0
%uint_1 = OpConstant %uint 1
%int = OpTypeInt 32 1
%ra_int = OpTypeRuntimeArray %int
%int2 = OpTypeVector %int 2
%ptr_int = OpTypePointer Uniform %int
%struct_int2 = OpTypeStruct %ra_int
%ptr_struct_int2 = OpTypePointer Uniform %struct_int2
%gl_GlobalInvocationId = OpVariable %ptr_input_uint3 Input
%input = OpVariable %ptr_struct_int2 Uniform
%output = OpVariable %ptr_struct_int2 Uniform
%main = OpFunction %void None %voidFn
%mainStart = OpLabel
%index_ptr = OpAccessChain %ptr_input_uint %gl_GlobalInvocationId %uint_0
%index = OpLoad %uint %index_ptr
%in_ptr = OpAccessChain %ptr_int %input %uint_0 %index
%invalue = OpLoad %int %in_ptr
%outvalue = OpExtInst %int %glsl FindUMsb %invalue
%out_ptr = OpAccessChain %ptr_int %output %uint_0 %index
OpStore %out_ptr %outvalue
OpReturn
OpFunctionEnd
END
BUFFER data0 DATA_TYPE int32 DATA
0 -1
END
BUFFER data1 DATA_TYPE int32 DATA
8 8
END
BUFFER expected0 DATA_TYPE int32 DATA
-1 31
END
PIPELINE compute compute_pipeline
ATTACH test
BIND BUFFER data0 AS storage DESCRIPTOR_SET 0 BINDING 0
BIND BUFFER data1 AS storage DESCRIPTOR_SET 0 BINDING 1
END
RUN compute_pipeline 2 1 1
EXPECT data1 EQ_BUFFER expected0
@@ -0,0 +1,97 @@
#!amber
# Test GLSL.std.450 UClamp instruction
SHADER compute test SPIRV-ASM
OpCapability Shader
%glsl = OpExtInstImport "GLSL.std.450"
OpMemoryModel Logical GLSL450
OpEntryPoint GLCompute %main "main" %gl_GlobalInvocationId
OpExecutionMode %main LocalSize 1 1 1
OpDecorate %gl_GlobalInvocationId BuiltIn GlobalInvocationId
OpDecorate %ra_int ArrayStride 4
OpDecorate %struct_int4 BufferBlock
OpMemberDecorate %struct_int4 0 Offset 0
OpDecorate %input0 DescriptorSet 0
OpDecorate %input0 Binding 0
OpDecorate %input1 DescriptorSet 0
OpDecorate %input1 Binding 1
OpDecorate %input2 DescriptorSet 0
OpDecorate %input2 Binding 2
OpDecorate %output DescriptorSet 0
OpDecorate %output Binding 3
%uint = OpTypeInt 32 0
%ptr_uint = OpTypePointer Uniform %uint
%ptr_input_uint = OpTypePointer Input %uint
%uint3 = OpTypeVector %uint 3
%ptr_input_uint3 = OpTypePointer Input %uint3
%void = OpTypeVoid
%voidFn = OpTypeFunction %void
%uint_0 = OpConstant %uint 0
%uint_1 = OpConstant %uint 1
%int = OpTypeInt 32 1
%ra_int = OpTypeRuntimeArray %int
%int4 = OpTypeVector %int 4
%ptr_input_int = OpTypePointer Input %int
%ptr_int = OpTypePointer Uniform %int
%struct_int4 = OpTypeStruct %ra_int
%ptr_struct_int4 = OpTypePointer Uniform %struct_int4
%gl_GlobalInvocationId = OpVariable %ptr_input_uint3 Input
%input0 = OpVariable %ptr_struct_int4 Uniform
%input1 = OpVariable %ptr_struct_int4 Uniform
%input2 = OpVariable %ptr_struct_int4 Uniform
%output = OpVariable %ptr_struct_int4 Uniform
%main = OpFunction %void None %voidFn
%mainStart = OpLabel
%index_ptr = OpAccessChain %ptr_input_uint %gl_GlobalInvocationId %uint_0
%index = OpLoad %uint %index_ptr
%in_ptr0 = OpAccessChain %ptr_int %input0 %uint_0 %index
%invalue0 = OpLoad %int %in_ptr0
%in_ptr1 = OpAccessChain %ptr_int %input1 %uint_0 %index
%invalue1 = OpLoad %int %in_ptr1
%in_ptr2 = OpAccessChain %ptr_int %input2 %uint_0 %index
%invalue2 = OpLoad %int %in_ptr2
%outvalue = OpExtInst %int %glsl UClamp %invalue0 %invalue1 %invalue2
%out_ptr = OpAccessChain %ptr_int %output %uint_0 %index
OpStore %out_ptr %outvalue
OpReturn
OpFunctionEnd
END
BUFFER data0 DATA_TYPE int32 DATA
-9 -5 -3
END
BUFFER data1 DATA_TYPE int32 DATA
5 4 -2
END
BUFFER data2 DATA_TYPE int32 DATA
5 -4 -1
END
BUFFER data3 DATA_TYPE int32 DATA
8 8 8
END
BUFFER expected0 DATA_TYPE int32 DATA
5 -5 -2
END
PIPELINE compute compute_pipeline
ATTACH test
BIND BUFFER data0 AS storage DESCRIPTOR_SET 0 BINDING 0
BIND BUFFER data1 AS storage DESCRIPTOR_SET 0 BINDING 1
BIND BUFFER data2 AS storage DESCRIPTOR_SET 0 BINDING 2
BIND BUFFER data3 AS storage DESCRIPTOR_SET 0 BINDING 3
END
RUN compute_pipeline 3 1 1
EXPECT data3 EQ_BUFFER expected0
@@ -0,0 +1,91 @@
#!amber
# Test GLSL.std.450 UMax instruction
SHADER compute test SPIRV-ASM
OpCapability Shader
%glsl = OpExtInstImport "GLSL.std.450"
OpMemoryModel Logical GLSL450
OpEntryPoint GLCompute %main "main" %gl_GlobalInvocationId
OpExecutionMode %main LocalSize 1 1 1
OpDecorate %gl_GlobalInvocationId BuiltIn GlobalInvocationId
OpDecorate %ra_int ArrayStride 4
OpDecorate %struct_uint3 BufferBlock
OpMemberDecorate %struct_uint3 0 Offset 0
OpDecorate %struct_int3 BufferBlock
OpMemberDecorate %struct_int3 0 Offset 0
OpDecorate %input0 DescriptorSet 0
OpDecorate %input0 Binding 0
OpDecorate %input1 DescriptorSet 0
OpDecorate %input1 Binding 1
OpDecorate %output DescriptorSet 0
OpDecorate %output Binding 2
%uint = OpTypeInt 32 0
%ptr_uint = OpTypePointer Uniform %uint
%ptr_input_uint = OpTypePointer Input %uint
%uint3 = OpTypeVector %uint 3
%ptr_input_uint3 = OpTypePointer Input %uint3
%void = OpTypeVoid
%voidFn = OpTypeFunction %void
%uint_0 = OpConstant %uint 0
%uint_1 = OpConstant %uint 1
%int = OpTypeInt 32 1
%ra_int = OpTypeRuntimeArray %int
%ra_uint = OpTypeRuntimeArray %uint
%struct_uint3 = OpTypeStruct %ra_uint
%ptr_struct_uint3 = OpTypePointer Uniform %struct_uint3
%int3 = OpTypeVector %int 3
%ptr_int = OpTypePointer Uniform %int
%struct_int3 = OpTypeStruct %ra_int
%ptr_struct_int3 = OpTypePointer Uniform %struct_int3
%gl_GlobalInvocationId = OpVariable %ptr_input_uint3 Input
%input0 = OpVariable %ptr_struct_int3 Uniform
%input1 = OpVariable %ptr_struct_int3 Uniform
%output = OpVariable %ptr_struct_int3 Uniform
%main = OpFunction %void None %voidFn
%mainStart = OpLabel
%index_ptr = OpAccessChain %ptr_input_uint %gl_GlobalInvocationId %uint_0
%index = OpLoad %uint %index_ptr
%in_ptr0 = OpAccessChain %ptr_int %input0 %uint_0 %index
%invalue0 = OpLoad %int %in_ptr0
%in_ptr1 = OpAccessChain %ptr_int %input1 %uint_0 %index
%invalue1 = OpLoad %int %in_ptr1
%outvalue = OpExtInst %int %glsl UMax %invalue0 %invalue1
%out_ptr = OpAccessChain %ptr_int %output %uint_0 %index
OpStore %out_ptr %outvalue
OpReturn
OpFunctionEnd
END
BUFFER data0 DATA_TYPE int32 DATA
-7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7
END
BUFFER data1 DATA_TYPE int32 DATA
7 6 5 4 3 2 1 0 -1 -2 -3 -4 -5 -6 -7
END
BUFFER data2 DATA_TYPE int32 DATA
8 8 8 8 8 8 8 8 8 8 8 8 8 8 8
END
BUFFER expected0 DATA_TYPE int32 DATA
-7 -6 -5 -4 -3 -2 -1 0 -1 -2 -3 -4 -5 -6 -7
END
PIPELINE compute compute_pipeline
ATTACH test
BIND BUFFER data0 AS storage DESCRIPTOR_SET 0 BINDING 0
BIND BUFFER data1 AS storage DESCRIPTOR_SET 0 BINDING 1
BIND BUFFER data2 AS storage DESCRIPTOR_SET 0 BINDING 2
END
RUN compute_pipeline 15 1 1
EXPECT data2 EQ_BUFFER expected0
@@ -0,0 +1,91 @@
#!amber
# Test GLSL.std.450 UMin instruction
SHADER compute test SPIRV-ASM
OpCapability Shader
%glsl = OpExtInstImport "GLSL.std.450"
OpMemoryModel Logical GLSL450
OpEntryPoint GLCompute %main "main" %gl_GlobalInvocationId
OpExecutionMode %main LocalSize 1 1 1
OpDecorate %gl_GlobalInvocationId BuiltIn GlobalInvocationId
OpDecorate %ra_int ArrayStride 4
OpDecorate %struct_uint3 BufferBlock
OpMemberDecorate %struct_uint3 0 Offset 0
OpDecorate %struct_int3 BufferBlock
OpMemberDecorate %struct_int3 0 Offset 0
OpDecorate %input0 DescriptorSet 0
OpDecorate %input0 Binding 0
OpDecorate %input1 DescriptorSet 0
OpDecorate %input1 Binding 1
OpDecorate %output DescriptorSet 0
OpDecorate %output Binding 2
%uint = OpTypeInt 32 0
%ptr_uint = OpTypePointer Uniform %uint
%ptr_input_uint = OpTypePointer Input %uint
%uint3 = OpTypeVector %uint 3
%ptr_input_uint3 = OpTypePointer Input %uint3
%void = OpTypeVoid
%voidFn = OpTypeFunction %void
%uint_0 = OpConstant %uint 0
%uint_1 = OpConstant %uint 1
%int = OpTypeInt 32 1
%ra_int = OpTypeRuntimeArray %int
%ra_uint = OpTypeRuntimeArray %uint
%struct_uint3 = OpTypeStruct %ra_uint
%ptr_struct_uint3 = OpTypePointer Uniform %struct_uint3
%int3 = OpTypeVector %int 3
%ptr_int = OpTypePointer Uniform %int
%struct_int3 = OpTypeStruct %ra_int
%ptr_struct_int3 = OpTypePointer Uniform %struct_int3
%gl_GlobalInvocationId = OpVariable %ptr_input_uint3 Input
%input0 = OpVariable %ptr_struct_int3 Uniform
%input1 = OpVariable %ptr_struct_int3 Uniform
%output = OpVariable %ptr_struct_int3 Uniform
%main = OpFunction %void None %voidFn
%mainStart = OpLabel
%index_ptr = OpAccessChain %ptr_input_uint %gl_GlobalInvocationId %uint_0
%index = OpLoad %uint %index_ptr
%in_ptr0 = OpAccessChain %ptr_int %input0 %uint_0 %index
%invalue0 = OpLoad %int %in_ptr0
%in_ptr1 = OpAccessChain %ptr_int %input1 %uint_0 %index
%invalue1 = OpLoad %int %in_ptr1
%outvalue = OpExtInst %int %glsl UMin %invalue0 %invalue1
%out_ptr = OpAccessChain %ptr_int %output %uint_0 %index
OpStore %out_ptr %outvalue
OpReturn
OpFunctionEnd
END
BUFFER data0 DATA_TYPE int32 DATA
-7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7
END
BUFFER data1 DATA_TYPE int32 DATA
7 6 5 4 3 2 1 0 -1 -2 -3 -4 -5 -6 -7
END
BUFFER data2 DATA_TYPE int32 DATA
8 8 8 8 8 8 8 8 8 8 8 8 8 8 8
END
BUFFER expected0 DATA_TYPE int32 DATA
7 6 5 4 3 2 1 0 1 2 3 4 5 6 7
END
PIPELINE compute compute_pipeline
ATTACH test
BIND BUFFER data0 AS storage DESCRIPTOR_SET 0 BINDING 0
BIND BUFFER data1 AS storage DESCRIPTOR_SET 0 BINDING 1
BIND BUFFER data2 AS storage DESCRIPTOR_SET 0 BINDING 2
END
RUN compute_pipeline 15 1 1
EXPECT data2 EQ_BUFFER expected0
@@ -0,0 +1,74 @@
#!amber
# Test GLSL.std.450 FindSMsb instruction
SHADER compute test SPIRV-ASM
OpCapability Shader
%glsl = OpExtInstImport "GLSL.std.450"
OpMemoryModel Logical GLSL450
OpEntryPoint GLCompute %main "main" %gl_GlobalInvocationId
OpExecutionMode %main LocalSize 1 1 1
OpDecorate %gl_GlobalInvocationId BuiltIn GlobalInvocationId
OpDecorate %ra_uint ArrayStride 4
OpDecorate %struct_uint2 BufferBlock
OpMemberDecorate %struct_uint2 0 Offset 0
OpDecorate %input DescriptorSet 0
OpDecorate %input Binding 0
OpDecorate %output DescriptorSet 0
OpDecorate %output Binding 1
%uint = OpTypeInt 32 0
%ptr_uint = OpTypePointer Uniform %uint
%ptr_input_uint = OpTypePointer Input %uint
%uint3 = OpTypeVector %uint 3
%ptr_input_uint3 = OpTypePointer Input %uint3
%void = OpTypeVoid
%voidFn = OpTypeFunction %void
%uint_0 = OpConstant %uint 0
%uint_1 = OpConstant %uint 1
%ra_uint = OpTypeRuntimeArray %uint
%uint2 = OpTypeVector %uint 2
%struct_uint2 = OpTypeStruct %ra_uint
%ptr_struct_uint2 = OpTypePointer Uniform %struct_uint2
%gl_GlobalInvocationId = OpVariable %ptr_input_uint3 Input
%input = OpVariable %ptr_struct_uint2 Uniform
%output = OpVariable %ptr_struct_uint2 Uniform
%main = OpFunction %void None %voidFn
%mainStart = OpLabel
%index_ptr = OpAccessChain %ptr_input_uint %gl_GlobalInvocationId %uint_0
%index = OpLoad %uint %index_ptr
%in_ptr = OpAccessChain %ptr_uint %input %uint_0 %index
%invalue = OpLoad %uint %in_ptr
%outvalue = OpExtInst %uint %glsl FindSMsb %invalue
%out_ptr = OpAccessChain %ptr_uint %output %uint_0 %index
OpStore %out_ptr %outvalue
OpReturn
OpFunctionEnd
END
BUFFER data0 DATA_TYPE int32 DATA
0 -8 -7 -6 -5 -4 -3 -2 0 -1 1 2 3 4 5 6
END
BUFFER data1 DATA_TYPE int32 DATA
8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8
END
BUFFER expected0 DATA_TYPE int32 DATA
-1 2 2 2 2 1 1 0 -1 -1 0 1 1 2 2 2
END
PIPELINE compute compute_pipeline
ATTACH test
BIND BUFFER data0 AS storage DESCRIPTOR_SET 0 BINDING 0
BIND BUFFER data1 AS storage DESCRIPTOR_SET 0 BINDING 1
END
RUN compute_pipeline 16 1 1
EXPECT data1 EQ_BUFFER expected0
@@ -0,0 +1,74 @@
#!amber
# Test GLSL.std.450 SAbs instruction
SHADER compute test SPIRV-ASM
OpCapability Shader
%glsl = OpExtInstImport "GLSL.std.450"
OpMemoryModel Logical GLSL450
OpEntryPoint GLCompute %main "main" %gl_GlobalInvocationId
OpExecutionMode %main LocalSize 1 1 1
OpDecorate %gl_GlobalInvocationId BuiltIn GlobalInvocationId
OpDecorate %ra_uint ArrayStride 4
OpDecorate %struct_uint2 BufferBlock
OpMemberDecorate %struct_uint2 0 Offset 0
OpDecorate %input DescriptorSet 0
OpDecorate %input Binding 0
OpDecorate %output DescriptorSet 0
OpDecorate %output Binding 1
%uint = OpTypeInt 32 0
%ptr_uint = OpTypePointer Uniform %uint
%ptr_input_uint = OpTypePointer Input %uint
%uint3 = OpTypeVector %uint 3
%ptr_input_uint3 = OpTypePointer Input %uint3
%void = OpTypeVoid
%voidFn = OpTypeFunction %void
%uint_0 = OpConstant %uint 0
%uint_1 = OpConstant %uint 1
%ra_uint = OpTypeRuntimeArray %uint
%uint2 = OpTypeVector %uint 2
%struct_uint2 = OpTypeStruct %ra_uint
%ptr_struct_uint2 = OpTypePointer Uniform %struct_uint2
%gl_GlobalInvocationId = OpVariable %ptr_input_uint3 Input
%input = OpVariable %ptr_struct_uint2 Uniform
%output = OpVariable %ptr_struct_uint2 Uniform
%main = OpFunction %void None %voidFn
%mainStart = OpLabel
%index_ptr = OpAccessChain %ptr_input_uint %gl_GlobalInvocationId %uint_0
%index = OpLoad %uint %index_ptr
%in_ptr = OpAccessChain %ptr_uint %input %uint_0 %index
%invalue = OpLoad %uint %in_ptr
%outvalue = OpExtInst %uint %glsl SAbs %invalue
%out_ptr = OpAccessChain %ptr_uint %output %uint_0 %index
OpStore %out_ptr %outvalue
OpReturn
OpFunctionEnd
END
BUFFER data0 DATA_TYPE int32 DATA
-7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7
END
BUFFER data1 DATA_TYPE int32 DATA
8 8 8 8 8 8 8 8 8 8 8 8 8 8 8
END
BUFFER expected0 DATA_TYPE int32 DATA
7 6 5 4 3 2 1 0 1 2 3 4 5 6 7
END
PIPELINE compute compute_pipeline
ATTACH test
BIND BUFFER data0 AS storage DESCRIPTOR_SET 0 BINDING 0
BIND BUFFER data1 AS storage DESCRIPTOR_SET 0 BINDING 1
END
RUN compute_pipeline 15 1 1
EXPECT data1 EQ_BUFFER expected0
@@ -0,0 +1,94 @@
#!amber
# Test GLSL.std.450 SClamp instruction
SHADER compute test SPIRV-ASM
OpCapability Shader
%glsl = OpExtInstImport "GLSL.std.450"
OpMemoryModel Logical GLSL450
OpEntryPoint GLCompute %main "main" %gl_GlobalInvocationId
OpExecutionMode %main LocalSize 1 1 1
OpDecorate %gl_GlobalInvocationId BuiltIn GlobalInvocationId
OpDecorate %ra_uint ArrayStride 4
OpDecorate %struct_uint4 BufferBlock
OpMemberDecorate %struct_uint4 0 Offset 0
OpDecorate %input0 DescriptorSet 0
OpDecorate %input0 Binding 0
OpDecorate %input1 DescriptorSet 0
OpDecorate %input1 Binding 1
OpDecorate %input2 DescriptorSet 0
OpDecorate %input2 Binding 2
OpDecorate %output DescriptorSet 0
OpDecorate %output Binding 3
%uint = OpTypeInt 32 0
%ptr_uint = OpTypePointer Uniform %uint
%ptr_input_uint = OpTypePointer Input %uint
%uint3 = OpTypeVector %uint 3
%ptr_input_uint3 = OpTypePointer Input %uint3
%void = OpTypeVoid
%voidFn = OpTypeFunction %void
%uint_0 = OpConstant %uint 0
%uint_1 = OpConstant %uint 1
%ra_uint = OpTypeRuntimeArray %uint
%uint4 = OpTypeVector %uint 4
%struct_uint4 = OpTypeStruct %ra_uint
%ptr_struct_uint4 = OpTypePointer Uniform %struct_uint4
%gl_GlobalInvocationId = OpVariable %ptr_input_uint3 Input
%input0 = OpVariable %ptr_struct_uint4 Uniform
%input1 = OpVariable %ptr_struct_uint4 Uniform
%input2 = OpVariable %ptr_struct_uint4 Uniform
%output = OpVariable %ptr_struct_uint4 Uniform
%main = OpFunction %void None %voidFn
%mainStart = OpLabel
%index_ptr = OpAccessChain %ptr_input_uint %gl_GlobalInvocationId %uint_0
%index = OpLoad %uint %index_ptr
%in_ptr0 = OpAccessChain %ptr_uint %input0 %uint_0 %index
%invalue0 = OpLoad %uint %in_ptr0
%in_ptr1 = OpAccessChain %ptr_uint %input1 %uint_0 %index
%invalue1 = OpLoad %uint %in_ptr1
%in_ptr2 = OpAccessChain %ptr_uint %input2 %uint_0 %index
%invalue2 = OpLoad %uint %in_ptr2
%outvalue = OpExtInst %uint %glsl SClamp %invalue0 %invalue1 %invalue2
%out_ptr = OpAccessChain %ptr_uint %output %uint_0 %index
OpStore %out_ptr %outvalue
OpReturn
OpFunctionEnd
END
BUFFER data0 DATA_TYPE int32 DATA
-9 -5 -3 0 0 3 5 9
END
BUFFER data1 DATA_TYPE int32 DATA
-5 -4 -3 -1 0 1 4 5
END
BUFFER data2 DATA_TYPE int32 DATA
5 4 3 2 1 2 5 6
END
BUFFER data3 DATA_TYPE int32 DATA
8 8 8 8 8 8 8 8
END
BUFFER expected0 DATA_TYPE int32 DATA
-5 -4 -3 0 0 2 5 6
END
PIPELINE compute compute_pipeline
ATTACH test
BIND BUFFER data0 AS storage DESCRIPTOR_SET 0 BINDING 0
BIND BUFFER data1 AS storage DESCRIPTOR_SET 0 BINDING 1
BIND BUFFER data2 AS storage DESCRIPTOR_SET 0 BINDING 2
BIND BUFFER data3 AS storage DESCRIPTOR_SET 0 BINDING 3
END
RUN compute_pipeline 8 1 1
EXPECT data3 EQ_BUFFER expected0
@@ -0,0 +1,83 @@
#!amber
# Test GLSL.std.450 SMax instruction
SHADER compute test SPIRV-ASM
OpCapability Shader
%glsl = OpExtInstImport "GLSL.std.450"
OpMemoryModel Logical GLSL450
OpEntryPoint GLCompute %main "main" %gl_GlobalInvocationId
OpExecutionMode %main LocalSize 1 1 1
OpDecorate %gl_GlobalInvocationId BuiltIn GlobalInvocationId
OpDecorate %ra_uint ArrayStride 4
OpDecorate %struct_uint3 BufferBlock
OpMemberDecorate %struct_uint3 0 Offset 0
OpDecorate %input0 DescriptorSet 0
OpDecorate %input0 Binding 0
OpDecorate %input1 DescriptorSet 0
OpDecorate %input1 Binding 1
OpDecorate %output DescriptorSet 0
OpDecorate %output Binding 2
%uint = OpTypeInt 32 0
%ptr_uint = OpTypePointer Uniform %uint
%ptr_input_uint = OpTypePointer Input %uint
%uint3 = OpTypeVector %uint 3
%ptr_input_uint3 = OpTypePointer Input %uint3
%void = OpTypeVoid
%voidFn = OpTypeFunction %void
%uint_0 = OpConstant %uint 0
%uint_1 = OpConstant %uint 1
%ra_uint = OpTypeRuntimeArray %uint
%struct_uint3 = OpTypeStruct %ra_uint
%ptr_struct_uint3 = OpTypePointer Uniform %struct_uint3
%gl_GlobalInvocationId = OpVariable %ptr_input_uint3 Input
%input0 = OpVariable %ptr_struct_uint3 Uniform
%input1 = OpVariable %ptr_struct_uint3 Uniform
%output = OpVariable %ptr_struct_uint3 Uniform
%main = OpFunction %void None %voidFn
%mainStart = OpLabel
%index_ptr = OpAccessChain %ptr_input_uint %gl_GlobalInvocationId %uint_0
%index = OpLoad %uint %index_ptr
%in_ptr0 = OpAccessChain %ptr_uint %input0 %uint_0 %index
%invalue0 = OpLoad %uint %in_ptr0
%in_ptr1 = OpAccessChain %ptr_uint %input1 %uint_0 %index
%invalue1 = OpLoad %uint %in_ptr1
%outvalue = OpExtInst %uint %glsl SMax %invalue0 %invalue1
%out_ptr = OpAccessChain %ptr_uint %output %uint_0 %index
OpStore %out_ptr %outvalue
OpReturn
OpFunctionEnd
END
BUFFER data0 DATA_TYPE int32 DATA
-7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7
END
BUFFER data1 DATA_TYPE int32 DATA
7 6 5 4 3 2 1 0 -1 -2 -3 -4 -5 -6 -7
END
BUFFER data2 DATA_TYPE int32 DATA
8 8 8 8 8 8 8 8 8 8 8 8 8 8 8
END
BUFFER expected0 DATA_TYPE int32 DATA
7 6 5 4 3 2 1 0 1 2 3 4 5 6 7
END
PIPELINE compute compute_pipeline
ATTACH test
BIND BUFFER data0 AS storage DESCRIPTOR_SET 0 BINDING 0
BIND BUFFER data1 AS storage DESCRIPTOR_SET 0 BINDING 1
BIND BUFFER data2 AS storage DESCRIPTOR_SET 0 BINDING 2
END
RUN compute_pipeline 15 1 1
EXPECT data2 EQ_BUFFER expected0
@@ -0,0 +1,83 @@
#!amber
# Test GLSL.std.450 SMin instruction
SHADER compute test SPIRV-ASM
OpCapability Shader
%glsl = OpExtInstImport "GLSL.std.450"
OpMemoryModel Logical GLSL450
OpEntryPoint GLCompute %main "main" %gl_GlobalInvocationId
OpExecutionMode %main LocalSize 1 1 1
OpDecorate %gl_GlobalInvocationId BuiltIn GlobalInvocationId
OpDecorate %ra_uint ArrayStride 4
OpDecorate %struct_uint3 BufferBlock
OpMemberDecorate %struct_uint3 0 Offset 0
OpDecorate %input0 DescriptorSet 0
OpDecorate %input0 Binding 0
OpDecorate %input1 DescriptorSet 0
OpDecorate %input1 Binding 1
OpDecorate %output DescriptorSet 0
OpDecorate %output Binding 2
%uint = OpTypeInt 32 0
%ptr_uint = OpTypePointer Uniform %uint
%ptr_input_uint = OpTypePointer Input %uint
%uint3 = OpTypeVector %uint 3
%ptr_input_uint3 = OpTypePointer Input %uint3
%void = OpTypeVoid
%voidFn = OpTypeFunction %void
%uint_0 = OpConstant %uint 0
%uint_1 = OpConstant %uint 1
%ra_uint = OpTypeRuntimeArray %uint
%struct_uint3 = OpTypeStruct %ra_uint
%ptr_struct_uint3 = OpTypePointer Uniform %struct_uint3
%gl_GlobalInvocationId = OpVariable %ptr_input_uint3 Input
%input0 = OpVariable %ptr_struct_uint3 Uniform
%input1 = OpVariable %ptr_struct_uint3 Uniform
%output = OpVariable %ptr_struct_uint3 Uniform
%main = OpFunction %void None %voidFn
%mainStart = OpLabel
%index_ptr = OpAccessChain %ptr_input_uint %gl_GlobalInvocationId %uint_0
%index = OpLoad %uint %index_ptr
%in_ptr0 = OpAccessChain %ptr_uint %input0 %uint_0 %index
%invalue0 = OpLoad %uint %in_ptr0
%in_ptr1 = OpAccessChain %ptr_uint %input1 %uint_0 %index
%invalue1 = OpLoad %uint %in_ptr1
%outvalue = OpExtInst %uint %glsl SMin %invalue0 %invalue1
%out_ptr = OpAccessChain %ptr_uint %output %uint_0 %index
OpStore %out_ptr %outvalue
OpReturn
OpFunctionEnd
END
BUFFER data0 DATA_TYPE int32 DATA
-7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7
END
BUFFER data1 DATA_TYPE int32 DATA
7 6 5 4 3 2 1 0 -1 -2 -3 -4 -5 -6 -7
END
BUFFER data2 DATA_TYPE int32 DATA
8 8 8 8 8 8 8 8 8 8 8 8 8 8 8
END
BUFFER expected0 DATA_TYPE int32 DATA
-7 -6 -5 -4 -3 -2 -1 0 -1 -2 -3 -4 -5 -6 -7
END
PIPELINE compute compute_pipeline
ATTACH test
BIND BUFFER data0 AS storage DESCRIPTOR_SET 0 BINDING 0
BIND BUFFER data1 AS storage DESCRIPTOR_SET 0 BINDING 1
BIND BUFFER data2 AS storage DESCRIPTOR_SET 0 BINDING 2
END
RUN compute_pipeline 15 1 1
EXPECT data2 EQ_BUFFER expected0
@@ -0,0 +1,74 @@
#!amber
# Test GLSL.std.450 SSign instruction
SHADER compute test SPIRV-ASM
OpCapability Shader
%glsl = OpExtInstImport "GLSL.std.450"
OpMemoryModel Logical GLSL450
OpEntryPoint GLCompute %main "main" %gl_GlobalInvocationId
OpExecutionMode %main LocalSize 1 1 1
OpDecorate %gl_GlobalInvocationId BuiltIn GlobalInvocationId
OpDecorate %ra_uint ArrayStride 4
OpDecorate %struct_uint2 BufferBlock
OpMemberDecorate %struct_uint2 0 Offset 0
OpDecorate %input DescriptorSet 0
OpDecorate %input Binding 0
OpDecorate %output DescriptorSet 0
OpDecorate %output Binding 1
%uint = OpTypeInt 32 0
%ptr_uint = OpTypePointer Uniform %uint
%ptr_input_uint = OpTypePointer Input %uint
%uint3 = OpTypeVector %uint 3
%ptr_input_uint3 = OpTypePointer Input %uint3
%void = OpTypeVoid
%voidFn = OpTypeFunction %void
%uint_0 = OpConstant %uint 0
%uint_1 = OpConstant %uint 1
%ra_uint = OpTypeRuntimeArray %uint
%uint2 = OpTypeVector %uint 2
%struct_uint2 = OpTypeStruct %ra_uint
%ptr_struct_uint2 = OpTypePointer Uniform %struct_uint2
%gl_GlobalInvocationId = OpVariable %ptr_input_uint3 Input
%input = OpVariable %ptr_struct_uint2 Uniform
%output = OpVariable %ptr_struct_uint2 Uniform
%main = OpFunction %void None %voidFn
%mainStart = OpLabel
%index_ptr = OpAccessChain %ptr_input_uint %gl_GlobalInvocationId %uint_0
%index = OpLoad %uint %index_ptr
%in_ptr = OpAccessChain %ptr_uint %input %uint_0 %index
%invalue = OpLoad %uint %in_ptr
%outvalue = OpExtInst %uint %glsl SSign %invalue
%out_ptr = OpAccessChain %ptr_uint %output %uint_0 %index
OpStore %out_ptr %outvalue
OpReturn
OpFunctionEnd
END
BUFFER data0 DATA_TYPE int32 DATA
-7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7
END
BUFFER data1 DATA_TYPE int32 DATA
8 8 8 8 8 8 8 8 8 8 8 8 8 8 8
END
BUFFER expected0 DATA_TYPE int32 DATA
-1 -1 -1 -1 -1 -1 -1 0 1 1 1 1 1 1 1
END
PIPELINE compute compute_pipeline
ATTACH test
BIND BUFFER data0 AS storage DESCRIPTOR_SET 0 BINDING 0
BIND BUFFER data1 AS storage DESCRIPTOR_SET 0 BINDING 1
END
RUN compute_pipeline 15 1 1
EXPECT data1 EQ_BUFFER expected0
@@ -0,0 +1,76 @@
#!amber
# Test OpAtomicUMax instruction
SHADER compute test SPIRV-ASM
OpCapability Shader
%glsl = OpExtInstImport "GLSL.std.450"
OpMemoryModel Logical GLSL450
OpEntryPoint GLCompute %main "main" %gl_GlobalInvocationId
OpExecutionMode %main LocalSize 1 1 1
OpDecorate %gl_GlobalInvocationId BuiltIn GlobalInvocationId
OpDecorate %ra_int ArrayStride 4
OpDecorate %struct_int2 BufferBlock
OpMemberDecorate %struct_int2 0 Offset 0
OpDecorate %input DescriptorSet 0
OpDecorate %input Binding 0
OpDecorate %output DescriptorSet 0
OpDecorate %output Binding 1
%uint = OpTypeInt 32 0
%ptr_uint = OpTypePointer Uniform %uint
%ptr_input_uint = OpTypePointer Input %uint
%uint3 = OpTypeVector %uint 3
%ptr_input_uint3 = OpTypePointer Input %uint3
%void = OpTypeVoid
%voidFn = OpTypeFunction %void
%uint_0 = OpConstant %uint 0
%uint_1 = OpConstant %uint 1
%int = OpTypeInt 32 1
%ra_int = OpTypeRuntimeArray %int
%int2 = OpTypeVector %int 2
%ptr_int = OpTypePointer Uniform %int
%struct_int2 = OpTypeStruct %ra_int
%ptr_struct_int2 = OpTypePointer Uniform %struct_int2
%gl_GlobalInvocationId = OpVariable %ptr_input_uint3 Input
%input = OpVariable %ptr_struct_int2 Uniform
%output = OpVariable %ptr_struct_int2 Uniform
%main = OpFunction %void None %voidFn
%mainStart = OpLabel
%index_ptr = OpAccessChain %ptr_input_uint %gl_GlobalInvocationId %uint_0
%index = OpLoad %uint %index_ptr
%in_ptr = OpAccessChain %ptr_int %input %uint_0 %index
%invalue = OpLoad %int %in_ptr
%out_ptr = OpAccessChain %ptr_int %output %uint_0 %index
%result = OpAtomicUMax %int %out_ptr %uint_1 %uint_0 %invalue
OpReturn
OpFunctionEnd
END
BUFFER data0 DATA_TYPE int32 DATA
-7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7
END
BUFFER data1 DATA_TYPE int32 DATA
7 6 5 4 3 2 1 0 -1 -2 -3 -4 -5 -6 -7
END
BUFFER expected0 DATA_TYPE int32 DATA
-7 -6 -5 -4 -3 -2 -1 0 -1 -2 -3 -4 -5 -6 -7
END
PIPELINE compute compute_pipeline
ATTACH test
BIND BUFFER data0 AS storage DESCRIPTOR_SET 0 BINDING 0
BIND BUFFER data1 AS storage DESCRIPTOR_SET 0 BINDING 1
END
RUN compute_pipeline 15 1 1
EXPECT data1 EQ_BUFFER expected0
@@ -0,0 +1,76 @@
#!amber
# Test OpAtomicUMin instruction
SHADER compute test SPIRV-ASM
OpCapability Shader
%glsl = OpExtInstImport "GLSL.std.450"
OpMemoryModel Logical GLSL450
OpEntryPoint GLCompute %main "main" %gl_GlobalInvocationId
OpExecutionMode %main LocalSize 1 1 1
OpDecorate %gl_GlobalInvocationId BuiltIn GlobalInvocationId
OpDecorate %ra_int ArrayStride 4
OpDecorate %struct_int2 BufferBlock
OpMemberDecorate %struct_int2 0 Offset 0
OpDecorate %input DescriptorSet 0
OpDecorate %input Binding 0
OpDecorate %output DescriptorSet 0
OpDecorate %output Binding 1
%uint = OpTypeInt 32 0
%ptr_uint = OpTypePointer Uniform %uint
%ptr_input_uint = OpTypePointer Input %uint
%uint3 = OpTypeVector %uint 3
%ptr_input_uint3 = OpTypePointer Input %uint3
%void = OpTypeVoid
%voidFn = OpTypeFunction %void
%uint_0 = OpConstant %uint 0
%uint_1 = OpConstant %uint 1
%int = OpTypeInt 32 1
%ra_int = OpTypeRuntimeArray %int
%int2 = OpTypeVector %int 2
%ptr_int = OpTypePointer Uniform %int
%struct_int2 = OpTypeStruct %ra_int
%ptr_struct_int2 = OpTypePointer Uniform %struct_int2
%gl_GlobalInvocationId = OpVariable %ptr_input_uint3 Input
%input = OpVariable %ptr_struct_int2 Uniform
%output = OpVariable %ptr_struct_int2 Uniform
%main = OpFunction %void None %voidFn
%mainStart = OpLabel
%index_ptr = OpAccessChain %ptr_input_uint %gl_GlobalInvocationId %uint_0
%index = OpLoad %uint %index_ptr
%in_ptr = OpAccessChain %ptr_int %input %uint_0 %index
%invalue = OpLoad %int %in_ptr
%out_ptr = OpAccessChain %ptr_int %output %uint_0 %index
%result = OpAtomicUMin %int %out_ptr %uint_1 %uint_0 %invalue
OpReturn
OpFunctionEnd
END
BUFFER data0 DATA_TYPE int32 DATA
-7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7
END
BUFFER data1 DATA_TYPE int32 DATA
7 6 5 4 3 2 1 0 -1 -2 -3 -4 -5 -6 -7
END
BUFFER expected0 DATA_TYPE int32 DATA
7 6 5 4 3 2 1 0 1 2 3 4 5 6 7
END
PIPELINE compute compute_pipeline
ATTACH test
BIND BUFFER data0 AS storage DESCRIPTOR_SET 0 BINDING 0
BIND BUFFER data1 AS storage DESCRIPTOR_SET 0 BINDING 1
END
RUN compute_pipeline 15 1 1
EXPECT data1 EQ_BUFFER expected0
@@ -0,0 +1,94 @@
#!amber
# Test OpUGreaterThan instruction
SHADER compute test SPIRV-ASM
OpCapability Shader
OpMemoryModel Logical GLSL450
OpEntryPoint GLCompute %main "main" %gl_GlobalInvocationId
OpExecutionMode %main LocalSize 1 1 1
OpDecorate %gl_GlobalInvocationId BuiltIn GlobalInvocationId
OpDecorate %ra_int ArrayStride 4
OpDecorate %struct_uint3 BufferBlock
OpMemberDecorate %struct_uint3 0 Offset 0
OpDecorate %struct_int3 BufferBlock
OpMemberDecorate %struct_int3 0 Offset 0
OpDecorate %input0 DescriptorSet 0
OpDecorate %input0 Binding 0
OpDecorate %input1 DescriptorSet 0
OpDecorate %input1 Binding 1
OpDecorate %output DescriptorSet 0
OpDecorate %output Binding 2
%uint = OpTypeInt 32 0
%ptr_uint = OpTypePointer Uniform %uint
%ptr_input_uint = OpTypePointer Input %uint
%uint3 = OpTypeVector %uint 3
%ptr_input_uint3 = OpTypePointer Input %uint3
%void = OpTypeVoid
%voidFn = OpTypeFunction %void
%uint_0 = OpConstant %uint 0
%uint_1 = OpConstant %uint 1
%int = OpTypeInt 32 1
%ra_int = OpTypeRuntimeArray %int
%ra_uint = OpTypeRuntimeArray %uint
%struct_uint3 = OpTypeStruct %ra_uint
%ptr_struct_uint3 = OpTypePointer Uniform %struct_uint3
%int3 = OpTypeVector %int 3
%ptr_int = OpTypePointer Uniform %int
%struct_int3 = OpTypeStruct %ra_int
%ptr_struct_int3 = OpTypePointer Uniform %struct_int3
%bool = OpTypeBool
%int_0 = OpConstant %int 0
%int_1 = OpConstant %int 1
%gl_GlobalInvocationId = OpVariable %ptr_input_uint3 Input
%input0 = OpVariable %ptr_struct_int3 Uniform
%input1 = OpVariable %ptr_struct_int3 Uniform
%output = OpVariable %ptr_struct_int3 Uniform
%main = OpFunction %void None %voidFn
%mainStart = OpLabel
%index_ptr = OpAccessChain %ptr_input_uint %gl_GlobalInvocationId %uint_0
%index = OpLoad %uint %index_ptr
%in_ptr0 = OpAccessChain %ptr_int %input0 %uint_0 %index
%invalue0 = OpLoad %int %in_ptr0
%in_ptr1 = OpAccessChain %ptr_int %input1 %uint_0 %index
%invalue1 = OpLoad %int %in_ptr1
%result = OpUGreaterThan %bool %invalue0 %invalue1
%outvalue = OpSelect %int %result %int_1 %int_0
%out_ptr = OpAccessChain %ptr_int %output %uint_0 %index
OpStore %out_ptr %outvalue
OpReturn
OpFunctionEnd
END
BUFFER data0 DATA_TYPE int32 DATA
0 -65536 0 1 32768
END
BUFFER data1 DATA_TYPE int32 DATA
1 32768 0 0 -65536
END
BUFFER data2 DATA_TYPE int32 DATA
8 8 8 8 8
END
BUFFER expected0 DATA_TYPE int32 DATA
0 1 0 1 0
END
PIPELINE compute compute_pipeline
ATTACH test
BIND BUFFER data0 AS storage DESCRIPTOR_SET 0 BINDING 0
BIND BUFFER data1 AS storage DESCRIPTOR_SET 0 BINDING 1
BIND BUFFER data2 AS storage DESCRIPTOR_SET 0 BINDING 2
END
RUN compute_pipeline 5 1 1
EXPECT data2 EQ_BUFFER expected0
@@ -0,0 +1,94 @@
#!amber
# Test OpUGreaterThanEqual instruction
SHADER compute test SPIRV-ASM
OpCapability Shader
OpMemoryModel Logical GLSL450
OpEntryPoint GLCompute %main "main" %gl_GlobalInvocationId
OpExecutionMode %main LocalSize 1 1 1
OpDecorate %gl_GlobalInvocationId BuiltIn GlobalInvocationId
OpDecorate %ra_int ArrayStride 4
OpDecorate %struct_uint3 BufferBlock
OpMemberDecorate %struct_uint3 0 Offset 0
OpDecorate %struct_int3 BufferBlock
OpMemberDecorate %struct_int3 0 Offset 0
OpDecorate %input0 DescriptorSet 0
OpDecorate %input0 Binding 0
OpDecorate %input1 DescriptorSet 0
OpDecorate %input1 Binding 1
OpDecorate %output DescriptorSet 0
OpDecorate %output Binding 2
%uint = OpTypeInt 32 0
%ptr_uint = OpTypePointer Uniform %uint
%ptr_input_uint = OpTypePointer Input %uint
%uint3 = OpTypeVector %uint 3
%ptr_input_uint3 = OpTypePointer Input %uint3
%void = OpTypeVoid
%voidFn = OpTypeFunction %void
%uint_0 = OpConstant %uint 0
%uint_1 = OpConstant %uint 1
%int = OpTypeInt 32 1
%ra_int = OpTypeRuntimeArray %int
%ra_uint = OpTypeRuntimeArray %uint
%struct_uint3 = OpTypeStruct %ra_uint
%ptr_struct_uint3 = OpTypePointer Uniform %struct_uint3
%int3 = OpTypeVector %int 3
%ptr_int = OpTypePointer Uniform %int
%struct_int3 = OpTypeStruct %ra_int
%ptr_struct_int3 = OpTypePointer Uniform %struct_int3
%bool = OpTypeBool
%int_0 = OpConstant %int 0
%int_1 = OpConstant %int 1
%gl_GlobalInvocationId = OpVariable %ptr_input_uint3 Input
%input0 = OpVariable %ptr_struct_int3 Uniform
%input1 = OpVariable %ptr_struct_int3 Uniform
%output = OpVariable %ptr_struct_int3 Uniform
%main = OpFunction %void None %voidFn
%mainStart = OpLabel
%index_ptr = OpAccessChain %ptr_input_uint %gl_GlobalInvocationId %uint_0
%index = OpLoad %uint %index_ptr
%in_ptr0 = OpAccessChain %ptr_int %input0 %uint_0 %index
%invalue0 = OpLoad %int %in_ptr0
%in_ptr1 = OpAccessChain %ptr_int %input1 %uint_0 %index
%invalue1 = OpLoad %int %in_ptr1
%result = OpUGreaterThanEqual %bool %invalue0 %invalue1
%outvalue = OpSelect %int %result %int_1 %int_0
%out_ptr = OpAccessChain %ptr_int %output %uint_0 %index
OpStore %out_ptr %outvalue
OpReturn
OpFunctionEnd
END
BUFFER data0 DATA_TYPE int32 DATA
0 -65536 0 1 32768
END
BUFFER data1 DATA_TYPE int32 DATA
1 32768 0 0 -65536
END
BUFFER data2 DATA_TYPE int32 DATA
8 8 8 8 8
END
BUFFER expected0 DATA_TYPE int32 DATA
0 1 1 1 0
END
PIPELINE compute compute_pipeline
ATTACH test
BIND BUFFER data0 AS storage DESCRIPTOR_SET 0 BINDING 0
BIND BUFFER data1 AS storage DESCRIPTOR_SET 0 BINDING 1
BIND BUFFER data2 AS storage DESCRIPTOR_SET 0 BINDING 2
END
RUN compute_pipeline 5 1 1
EXPECT data2 EQ_BUFFER expected0
@@ -0,0 +1,94 @@
#!amber
# Test OpULessThan instruction
SHADER compute test SPIRV-ASM
OpCapability Shader
OpMemoryModel Logical GLSL450
OpEntryPoint GLCompute %main "main" %gl_GlobalInvocationId
OpExecutionMode %main LocalSize 1 1 1
OpDecorate %gl_GlobalInvocationId BuiltIn GlobalInvocationId
OpDecorate %ra_int ArrayStride 4
OpDecorate %struct_uint3 BufferBlock
OpMemberDecorate %struct_uint3 0 Offset 0
OpDecorate %struct_int3 BufferBlock
OpMemberDecorate %struct_int3 0 Offset 0
OpDecorate %input0 DescriptorSet 0
OpDecorate %input0 Binding 0
OpDecorate %input1 DescriptorSet 0
OpDecorate %input1 Binding 1
OpDecorate %output DescriptorSet 0
OpDecorate %output Binding 2
%uint = OpTypeInt 32 0
%ptr_uint = OpTypePointer Uniform %uint
%ptr_input_uint = OpTypePointer Input %uint
%uint3 = OpTypeVector %uint 3
%ptr_input_uint3 = OpTypePointer Input %uint3
%void = OpTypeVoid
%voidFn = OpTypeFunction %void
%uint_0 = OpConstant %uint 0
%uint_1 = OpConstant %uint 1
%int = OpTypeInt 32 1
%ra_int = OpTypeRuntimeArray %int
%ra_uint = OpTypeRuntimeArray %uint
%struct_uint3 = OpTypeStruct %ra_uint
%ptr_struct_uint3 = OpTypePointer Uniform %struct_uint3
%int3 = OpTypeVector %int 3
%ptr_int = OpTypePointer Uniform %int
%struct_int3 = OpTypeStruct %ra_int
%ptr_struct_int3 = OpTypePointer Uniform %struct_int3
%bool = OpTypeBool
%int_0 = OpConstant %int 0
%int_1 = OpConstant %int 1
%gl_GlobalInvocationId = OpVariable %ptr_input_uint3 Input
%input0 = OpVariable %ptr_struct_int3 Uniform
%input1 = OpVariable %ptr_struct_int3 Uniform
%output = OpVariable %ptr_struct_int3 Uniform
%main = OpFunction %void None %voidFn
%mainStart = OpLabel
%index_ptr = OpAccessChain %ptr_input_uint %gl_GlobalInvocationId %uint_0
%index = OpLoad %uint %index_ptr
%in_ptr0 = OpAccessChain %ptr_int %input0 %uint_0 %index
%invalue0 = OpLoad %int %in_ptr0
%in_ptr1 = OpAccessChain %ptr_int %input1 %uint_0 %index
%invalue1 = OpLoad %int %in_ptr1
%result = OpULessThan %bool %invalue0 %invalue1
%outvalue = OpSelect %int %result %int_1 %int_0
%out_ptr = OpAccessChain %ptr_int %output %uint_0 %index
OpStore %out_ptr %outvalue
OpReturn
OpFunctionEnd
END
BUFFER data0 DATA_TYPE int32 DATA
0 -65536 0 1 32768
END
BUFFER data1 DATA_TYPE int32 DATA
1 32768 0 0 -65536
END
BUFFER data2 DATA_TYPE int32 DATA
8 8 8 8 8
END
BUFFER expected0 DATA_TYPE int32 DATA
1 0 0 0 1
END
PIPELINE compute compute_pipeline
ATTACH test
BIND BUFFER data0 AS storage DESCRIPTOR_SET 0 BINDING 0
BIND BUFFER data1 AS storage DESCRIPTOR_SET 0 BINDING 1
BIND BUFFER data2 AS storage DESCRIPTOR_SET 0 BINDING 2
END
RUN compute_pipeline 5 1 1
EXPECT data2 EQ_BUFFER expected0
@@ -0,0 +1,94 @@
#!amber
# Test OpULessThanEqual instruction
SHADER compute test SPIRV-ASM
OpCapability Shader
OpMemoryModel Logical GLSL450
OpEntryPoint GLCompute %main "main" %gl_GlobalInvocationId
OpExecutionMode %main LocalSize 1 1 1
OpDecorate %gl_GlobalInvocationId BuiltIn GlobalInvocationId
OpDecorate %ra_int ArrayStride 4
OpDecorate %struct_uint3 BufferBlock
OpMemberDecorate %struct_uint3 0 Offset 0
OpDecorate %struct_int3 BufferBlock
OpMemberDecorate %struct_int3 0 Offset 0
OpDecorate %input0 DescriptorSet 0
OpDecorate %input0 Binding 0
OpDecorate %input1 DescriptorSet 0
OpDecorate %input1 Binding 1
OpDecorate %output DescriptorSet 0
OpDecorate %output Binding 2
%uint = OpTypeInt 32 0
%ptr_uint = OpTypePointer Uniform %uint
%ptr_input_uint = OpTypePointer Input %uint
%uint3 = OpTypeVector %uint 3
%ptr_input_uint3 = OpTypePointer Input %uint3
%void = OpTypeVoid
%voidFn = OpTypeFunction %void
%uint_0 = OpConstant %uint 0
%uint_1 = OpConstant %uint 1
%int = OpTypeInt 32 1
%ra_int = OpTypeRuntimeArray %int
%ra_uint = OpTypeRuntimeArray %uint
%struct_uint3 = OpTypeStruct %ra_uint
%ptr_struct_uint3 = OpTypePointer Uniform %struct_uint3
%int3 = OpTypeVector %int 3
%ptr_int = OpTypePointer Uniform %int
%struct_int3 = OpTypeStruct %ra_int
%ptr_struct_int3 = OpTypePointer Uniform %struct_int3
%bool = OpTypeBool
%int_0 = OpConstant %int 0
%int_1 = OpConstant %int 1
%gl_GlobalInvocationId = OpVariable %ptr_input_uint3 Input
%input0 = OpVariable %ptr_struct_int3 Uniform
%input1 = OpVariable %ptr_struct_int3 Uniform
%output = OpVariable %ptr_struct_int3 Uniform
%main = OpFunction %void None %voidFn
%mainStart = OpLabel
%index_ptr = OpAccessChain %ptr_input_uint %gl_GlobalInvocationId %uint_0
%index = OpLoad %uint %index_ptr
%in_ptr0 = OpAccessChain %ptr_int %input0 %uint_0 %index
%invalue0 = OpLoad %int %in_ptr0
%in_ptr1 = OpAccessChain %ptr_int %input1 %uint_0 %index
%invalue1 = OpLoad %int %in_ptr1
%result = OpULessThanEqual %bool %invalue0 %invalue1
%outvalue = OpSelect %int %result %int_1 %int_0
%out_ptr = OpAccessChain %ptr_int %output %uint_0 %index
OpStore %out_ptr %outvalue
OpReturn
OpFunctionEnd
END
BUFFER data0 DATA_TYPE int32 DATA
0 -65536 0 1 32768
END
BUFFER data1 DATA_TYPE int32 DATA
1 32768 0 0 -65536
END
BUFFER data2 DATA_TYPE int32 DATA
8 8 8 8 8
END
BUFFER expected0 DATA_TYPE int32 DATA
1 0 1 0 1
END
PIPELINE compute compute_pipeline
ATTACH test
BIND BUFFER data0 AS storage DESCRIPTOR_SET 0 BINDING 0
BIND BUFFER data1 AS storage DESCRIPTOR_SET 0 BINDING 1
BIND BUFFER data2 AS storage DESCRIPTOR_SET 0 BINDING 2
END
RUN compute_pipeline 5 1 1
EXPECT data2 EQ_BUFFER expected0
@@ -0,0 +1,74 @@
#!amber
# Test OpAtomicSMax instruction
SHADER compute test SPIRV-ASM
OpCapability Shader
%glsl = OpExtInstImport "GLSL.std.450"
OpMemoryModel Logical GLSL450
OpEntryPoint GLCompute %main "main" %gl_GlobalInvocationId
OpExecutionMode %main LocalSize 1 1 1
OpDecorate %gl_GlobalInvocationId BuiltIn GlobalInvocationId
OpDecorate %ra_uint ArrayStride 4
OpDecorate %struct_uint2 BufferBlock
OpMemberDecorate %struct_uint2 0 Offset 0
OpDecorate %input DescriptorSet 0
OpDecorate %input Binding 0
OpDecorate %output DescriptorSet 0
OpDecorate %output Binding 1
%uint = OpTypeInt 32 0
%ptr_uint = OpTypePointer Uniform %uint
%ptr_input_uint = OpTypePointer Input %uint
%uint3 = OpTypeVector %uint 3
%ptr_input_uint3 = OpTypePointer Input %uint3
%void = OpTypeVoid
%voidFn = OpTypeFunction %void
%uint_0 = OpConstant %uint 0
%uint_1 = OpConstant %uint 1
%ra_uint = OpTypeRuntimeArray %uint
%uint2 = OpTypeVector %uint 2
%struct_uint2 = OpTypeStruct %ra_uint
%ptr_struct_uint2 = OpTypePointer Uniform %struct_uint2
%gl_GlobalInvocationId = OpVariable %ptr_input_uint3 Input
%input = OpVariable %ptr_struct_uint2 Uniform
%output = OpVariable %ptr_struct_uint2 Uniform
%main = OpFunction %void None %voidFn
%mainStart = OpLabel
%index_ptr = OpAccessChain %ptr_input_uint %gl_GlobalInvocationId %uint_0
%index = OpLoad %uint %index_ptr
%in_ptr = OpAccessChain %ptr_uint %input %uint_0 %index
%invalue = OpLoad %uint %in_ptr
%out_ptr = OpAccessChain %ptr_uint %output %uint_0 %index
%result = OpAtomicSMax %uint %out_ptr %uint_1 %uint_0 %invalue
OpReturn
OpFunctionEnd
END
BUFFER data0 DATA_TYPE int32 DATA
-7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7
END
BUFFER data1 DATA_TYPE int32 DATA
7 6 5 4 3 2 1 0 -1 -2 -3 -4 -5 -6 -7
END
BUFFER expected0 DATA_TYPE int32 DATA
7 6 5 4 3 2 1 0 1 2 3 4 5 6 7
END
PIPELINE compute compute_pipeline
ATTACH test
BIND BUFFER data0 AS storage DESCRIPTOR_SET 0 BINDING 0
BIND BUFFER data1 AS storage DESCRIPTOR_SET 0 BINDING 1
END
RUN compute_pipeline 15 1 1
EXPECT data1 EQ_BUFFER expected0
@@ -0,0 +1,73 @@
#!amber
# Test OpAtomicSMin instruction
SHADER compute test SPIRV-ASM
OpCapability Shader
OpMemoryModel Logical GLSL450
OpEntryPoint GLCompute %main "main" %gl_GlobalInvocationId
OpExecutionMode %main LocalSize 1 1 1
OpDecorate %gl_GlobalInvocationId BuiltIn GlobalInvocationId
OpDecorate %ra_uint ArrayStride 4
OpDecorate %struct_uint2 BufferBlock
OpMemberDecorate %struct_uint2 0 Offset 0
OpDecorate %input DescriptorSet 0
OpDecorate %input Binding 0
OpDecorate %output DescriptorSet 0
OpDecorate %output Binding 1
%uint = OpTypeInt 32 0
%ptr_uint = OpTypePointer Uniform %uint
%ptr_input_uint = OpTypePointer Input %uint
%uint3 = OpTypeVector %uint 3
%ptr_input_uint3 = OpTypePointer Input %uint3
%void = OpTypeVoid
%voidFn = OpTypeFunction %void
%uint_0 = OpConstant %uint 0
%uint_1 = OpConstant %uint 1
%ra_uint = OpTypeRuntimeArray %uint
%uint2 = OpTypeVector %uint 2
%struct_uint2 = OpTypeStruct %ra_uint
%ptr_struct_uint2 = OpTypePointer Uniform %struct_uint2
%gl_GlobalInvocationId = OpVariable %ptr_input_uint3 Input
%input = OpVariable %ptr_struct_uint2 Uniform
%output = OpVariable %ptr_struct_uint2 Uniform
%main = OpFunction %void None %voidFn
%mainStart = OpLabel
%index_ptr = OpAccessChain %ptr_input_uint %gl_GlobalInvocationId %uint_0
%index = OpLoad %uint %index_ptr
%in_ptr = OpAccessChain %ptr_uint %input %uint_0 %index
%invalue = OpLoad %uint %in_ptr
%out_ptr = OpAccessChain %ptr_uint %output %uint_0 %index
%result = OpAtomicSMin %uint %out_ptr %uint_1 %uint_0 %invalue
OpReturn
OpFunctionEnd
END
BUFFER data0 DATA_TYPE int32 DATA
-7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7
END
BUFFER data1 DATA_TYPE int32 DATA
7 6 5 4 3 2 1 0 -1 -2 -3 -4 -5 -6 -7
END
BUFFER expected0 DATA_TYPE int32 DATA
-7 -6 -5 -4 -3 -2 -1 0 -1 -2 -3 -4 -5 -6 -7
END
PIPELINE compute compute_pipeline
ATTACH test
BIND BUFFER data0 AS storage DESCRIPTOR_SET 0 BINDING 0
BIND BUFFER data1 AS storage DESCRIPTOR_SET 0 BINDING 1
END
RUN compute_pipeline 15 1 1
EXPECT data1 EQ_BUFFER expected0
@@ -0,0 +1,82 @@
#!amber
# Test OpSDiv instruction
SHADER compute test SPIRV-ASM
OpCapability Shader
OpMemoryModel Logical GLSL450
OpEntryPoint GLCompute %main "main" %gl_GlobalInvocationId
OpExecutionMode %main LocalSize 1 1 1
OpDecorate %gl_GlobalInvocationId BuiltIn GlobalInvocationId
OpDecorate %ra_uint ArrayStride 4
OpDecorate %struct_uint3 BufferBlock
OpMemberDecorate %struct_uint3 0 Offset 0
OpDecorate %input0 DescriptorSet 0
OpDecorate %input0 Binding 0
OpDecorate %input1 DescriptorSet 0
OpDecorate %input1 Binding 1
OpDecorate %output DescriptorSet 0
OpDecorate %output Binding 2
%uint = OpTypeInt 32 0
%ptr_uint = OpTypePointer Uniform %uint
%ptr_input_uint = OpTypePointer Input %uint
%uint3 = OpTypeVector %uint 3
%ptr_input_uint3 = OpTypePointer Input %uint3
%void = OpTypeVoid
%voidFn = OpTypeFunction %void
%uint_0 = OpConstant %uint 0
%uint_1 = OpConstant %uint 1
%ra_uint = OpTypeRuntimeArray %uint
%struct_uint3 = OpTypeStruct %ra_uint
%ptr_struct_uint3 = OpTypePointer Uniform %struct_uint3
%gl_GlobalInvocationId = OpVariable %ptr_input_uint3 Input
%input0 = OpVariable %ptr_struct_uint3 Uniform
%input1 = OpVariable %ptr_struct_uint3 Uniform
%output = OpVariable %ptr_struct_uint3 Uniform
%main = OpFunction %void None %voidFn
%mainStart = OpLabel
%index_ptr = OpAccessChain %ptr_input_uint %gl_GlobalInvocationId %uint_0
%index = OpLoad %uint %index_ptr
%in_ptr0 = OpAccessChain %ptr_uint %input0 %uint_0 %index
%invalue0 = OpLoad %uint %in_ptr0
%in_ptr1 = OpAccessChain %ptr_uint %input1 %uint_0 %index
%invalue1 = OpLoad %uint %in_ptr1
%outvalue = OpSDiv %uint %invalue0 %invalue1
%out_ptr = OpAccessChain %ptr_uint %output %uint_0 %index
OpStore %out_ptr %outvalue
OpReturn
OpFunctionEnd
END
BUFFER data0 DATA_TYPE int32 DATA
0 -2 3 4 -5
END
BUFFER data1 DATA_TYPE int32 DATA
1 -1 -1 1 1
END
BUFFER data2 DATA_TYPE int32 DATA
8 8 8 8 8
END
BUFFER expected0 DATA_TYPE int32 DATA
0 2 -3 4 -5
END
PIPELINE compute compute_pipeline
ATTACH test
BIND BUFFER data0 AS storage DESCRIPTOR_SET 0 BINDING 0
BIND BUFFER data1 AS storage DESCRIPTOR_SET 0 BINDING 1
BIND BUFFER data2 AS storage DESCRIPTOR_SET 0 BINDING 2
END
RUN compute_pipeline 5 1 1
EXPECT data2 EQ_BUFFER expected0
@@ -0,0 +1,102 @@
#!amber
# Test OpSMulExtended instruction
SHADER compute test SPIRV-ASM
OpCapability Shader
OpMemoryModel Logical GLSL450
OpEntryPoint GLCompute %main "main" %gl_GlobalInvocationId
OpExecutionMode %main LocalSize 1 1 1
OpDecorate %gl_GlobalInvocationId BuiltIn GlobalInvocationId
OpDecorate %ra_uint ArrayStride 4
OpDecorate %struct_uint4 BufferBlock
OpMemberDecorate %struct_uint4 0 Offset 0
OpDecorate %input0 DescriptorSet 0
OpDecorate %input0 Binding 0
OpDecorate %input1 DescriptorSet 0
OpDecorate %input1 Binding 1
OpDecorate %output0 DescriptorSet 0
OpDecorate %output0 Binding 2
OpDecorate %output1 DescriptorSet 0
OpDecorate %output1 Binding 3
%uint = OpTypeInt 32 0
%ptr_uint = OpTypePointer Uniform %uint
%ptr_input_uint = OpTypePointer Input %uint
%uint3 = OpTypeVector %uint 3
%ptr_input_uint3 = OpTypePointer Input %uint3
%void = OpTypeVoid
%voidFn = OpTypeFunction %void
%uint_0 = OpConstant %uint 0
%uint_1 = OpConstant %uint 1
%ra_uint = OpTypeRuntimeArray %uint
%uint4 = OpTypeVector %uint 4
%struct_uint4 = OpTypeStruct %ra_uint
%ptr_struct_uint4 = OpTypePointer Uniform %struct_uint4
%resulttype = OpTypeStruct %uint %uint
%gl_GlobalInvocationId = OpVariable %ptr_input_uint3 Input
%input0 = OpVariable %ptr_struct_uint4 Uniform
%input1 = OpVariable %ptr_struct_uint4 Uniform
%output0 = OpVariable %ptr_struct_uint4 Uniform
%output1 = OpVariable %ptr_struct_uint4 Uniform
%main = OpFunction %void None %voidFn
%mainStart = OpLabel
%index_ptr = OpAccessChain %ptr_input_uint %gl_GlobalInvocationId %uint_0
%index = OpLoad %uint %index_ptr
%in_ptr0 = OpAccessChain %ptr_uint %input0 %uint_0 %index
%invalue0 = OpLoad %uint %in_ptr0
%in_ptr1 = OpAccessChain %ptr_uint %input1 %uint_0 %index
%invalue1 = OpLoad %uint %in_ptr1
%outvalue = OpSMulExtended %resulttype %invalue0 %invalue1
%outvalue0 = OpCompositeExtract %uint %outvalue 0
%out_ptr0 = OpAccessChain %ptr_uint %output0 %uint_0 %index
OpStore %out_ptr0 %outvalue0
%outvalue1 = OpCompositeExtract %uint %outvalue 1
%out_ptr1 = OpAccessChain %ptr_uint %output1 %uint_0 %index
OpStore %out_ptr1 %outvalue1
OpReturn
OpFunctionEnd
END
BUFFER data0 DATA_TYPE int32 DATA
-7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7
END
BUFFER data1 DATA_TYPE int32 DATA
7 6 5 4 3 2 1 0 -1 -2 -3 -4 -5 -6 -7
END
BUFFER data2 DATA_TYPE int32 DATA
8 8 8 8 8 8 8 8 8 8 8 8 8 8 8
END
BUFFER data3 DATA_TYPE int32 DATA
8 8 8 8 8 8 8 8 8 8 8 8 8 8 8
END
BUFFER expected0 DATA_TYPE int32 DATA
-49 -36 -25 -16 -9 -4 -1 0 -1 -4 -9 -16 -25 -36 -49
END
BUFFER expected1 DATA_TYPE int32 DATA
-1 -1 -1 -1 -1 -1 -1 0 -1 -1 -1 -1 -1 -1 -1
END
PIPELINE compute compute_pipeline
ATTACH test
BIND BUFFER data0 AS storage DESCRIPTOR_SET 0 BINDING 0
BIND BUFFER data1 AS storage DESCRIPTOR_SET 0 BINDING 1
BIND BUFFER data2 AS storage DESCRIPTOR_SET 0 BINDING 2
BIND BUFFER data3 AS storage DESCRIPTOR_SET 0 BINDING 3
END
RUN compute_pipeline 15 1 1
EXPECT data2 EQ_BUFFER expected0
EXPECT data3 EQ_BUFFER expected1
@@ -0,0 +1,73 @@
#!amber
# Test OpSNegate instruction
SHADER compute test SPIRV-ASM
OpCapability Shader
OpMemoryModel Logical GLSL450
OpEntryPoint GLCompute %main "main" %gl_GlobalInvocationId
OpExecutionMode %main LocalSize 1 1 1
OpDecorate %gl_GlobalInvocationId BuiltIn GlobalInvocationId
OpDecorate %ra_uint ArrayStride 4
OpDecorate %struct_uint2 BufferBlock
OpMemberDecorate %struct_uint2 0 Offset 0
OpDecorate %input DescriptorSet 0
OpDecorate %input Binding 0
OpDecorate %output DescriptorSet 0
OpDecorate %output Binding 1
%uint = OpTypeInt 32 0
%ptr_uint = OpTypePointer Uniform %uint
%ptr_input_uint = OpTypePointer Input %uint
%uint3 = OpTypeVector %uint 3
%ptr_input_uint3 = OpTypePointer Input %uint3
%void = OpTypeVoid
%voidFn = OpTypeFunction %void
%uint_0 = OpConstant %uint 0
%uint_1 = OpConstant %uint 1
%ra_uint = OpTypeRuntimeArray %uint
%uint2 = OpTypeVector %uint 2
%struct_uint2 = OpTypeStruct %ra_uint
%ptr_struct_uint2 = OpTypePointer Uniform %struct_uint2
%gl_GlobalInvocationId = OpVariable %ptr_input_uint3 Input
%input = OpVariable %ptr_struct_uint2 Uniform
%output = OpVariable %ptr_struct_uint2 Uniform
%main = OpFunction %void None %voidFn
%mainStart = OpLabel
%index_ptr = OpAccessChain %ptr_input_uint %gl_GlobalInvocationId %uint_0
%index = OpLoad %uint %index_ptr
%in_ptr = OpAccessChain %ptr_uint %input %uint_0 %index
%invalue = OpLoad %uint %in_ptr
%outvalue = OpSNegate %uint %invalue
%out_ptr = OpAccessChain %ptr_uint %output %uint_0 %index
OpStore %out_ptr %outvalue
OpReturn
OpFunctionEnd
END
BUFFER data0 DATA_TYPE int32 DATA
0 -1 1
END
BUFFER data1 DATA_TYPE int32 DATA
8 8 8
END
BUFFER expected0 DATA_TYPE int32 DATA
0 1 -1
END
PIPELINE compute compute_pipeline
ATTACH test
BIND BUFFER data0 AS storage DESCRIPTOR_SET 0 BINDING 0
BIND BUFFER data1 AS storage DESCRIPTOR_SET 0 BINDING 1
END
RUN compute_pipeline 3 1 1
EXPECT data1 EQ_BUFFER expected0
@@ -0,0 +1,100 @@
#!amber
# Test OpUMulExtended instruction
SHADER compute test SPIRV-ASM
OpCapability Shader
OpMemoryModel Logical GLSL450
OpEntryPoint GLCompute %main "main" %gl_GlobalInvocationId
OpExecutionMode %main LocalSize 1 1 1
OpDecorate %gl_GlobalInvocationId BuiltIn GlobalInvocationId
OpDecorate %struct_uint4 BufferBlock
OpMemberDecorate %struct_uint4 0 Offset 0
OpDecorate %input0 DescriptorSet 0
OpDecorate %input0 Binding 0
OpDecorate %input1 DescriptorSet 0
OpDecorate %input1 Binding 1
OpDecorate %output0 DescriptorSet 0
OpDecorate %output0 Binding 2
OpDecorate %output1 DescriptorSet 0
OpDecorate %output1 Binding 3
%uint = OpTypeInt 32 0
%ptr_uint = OpTypePointer Uniform %uint
%ptr_input_uint = OpTypePointer Input %uint
%uint3 = OpTypeVector %uint 3
%ptr_input_uint3 = OpTypePointer Input %uint3
%void = OpTypeVoid
%voidFn = OpTypeFunction %void
%uint_0 = OpConstant %uint 0
%uint_1 = OpConstant %uint 1
%uint4 = OpTypeVector %uint 4
%struct_uint4 = OpTypeStruct %uint4
%ptr_struct_uint4 = OpTypePointer Uniform %struct_uint4
%resulttype = OpTypeStruct %uint %uint
%gl_GlobalInvocationId = OpVariable %ptr_input_uint3 Input
%input0 = OpVariable %ptr_struct_uint4 Uniform
%input1 = OpVariable %ptr_struct_uint4 Uniform
%output0 = OpVariable %ptr_struct_uint4 Uniform
%output1 = OpVariable %ptr_struct_uint4 Uniform
%main = OpFunction %void None %voidFn
%mainStart = OpLabel
%index_ptr = OpAccessChain %ptr_input_uint %gl_GlobalInvocationId %uint_0
%index = OpLoad %uint %index_ptr
%in_ptr0 = OpAccessChain %ptr_uint %input0 %uint_0 %index
%invalue0 = OpLoad %uint %in_ptr0
%in_ptr1 = OpAccessChain %ptr_uint %input1 %uint_0 %index
%invalue1 = OpLoad %uint %in_ptr1
%outvalue = OpUMulExtended %resulttype %invalue0 %invalue1
%outvalue0 = OpCompositeExtract %uint %outvalue 0
%out_ptr0 = OpAccessChain %ptr_uint %output0 %uint_0 %index
OpStore %out_ptr0 %outvalue0
%outvalue1 = OpCompositeExtract %uint %outvalue 1
%out_ptr1 = OpAccessChain %ptr_uint %output1 %uint_0 %index
OpStore %out_ptr1 %outvalue1
OpReturn
OpFunctionEnd
END
BUFFER data0 DATA_TYPE int32 DATA
-7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7
END
BUFFER data1 DATA_TYPE int32 DATA
7 6 5 4 3 2 1 0 -1 -2 -3 -4 -5 -6 -7
END
BUFFER data2 DATA_TYPE int32 DATA
8 8 8 8 8 8 8 8 8 8 8 8 8 8 8
END
BUFFER data3 DATA_TYPE int32 DATA
8 8 8 8 8 8 8 8 8 8 8 8 8 8 8
END
BUFFER expected0 DATA_TYPE int32 DATA
-49 -36 -25 -16 -9 -4 -1 0 -1 -4 -9 -16 -25 -36 -49
END
BUFFER expected1 DATA_TYPE int32 DATA
6 5 4 3 2 1 0 0 0 1 2 3 4 5 6
END
PIPELINE compute compute_pipeline
ATTACH test
BIND BUFFER data0 AS storage DESCRIPTOR_SET 0 BINDING 0
BIND BUFFER data1 AS storage DESCRIPTOR_SET 0 BINDING 1
BIND BUFFER data2 AS storage DESCRIPTOR_SET 0 BINDING 2
BIND BUFFER data3 AS storage DESCRIPTOR_SET 0 BINDING 3
END
RUN compute_pipeline 15 1 1
EXPECT data2 EQ_BUFFER expected0
EXPECT data3 EQ_BUFFER expected1