Extra tests for SPIR-V 1.4
authorAlan Baker <alanbaker@google.com>
Thu, 20 Jun 2019 17:46:57 +0000 (13:46 -0400)
committerAlexander Galazin <Alexander.Galazin@arm.com>
Thu, 10 Oct 2019 13:25:05 +0000 (09:25 -0400)
New tests
 * OpPtrEqual and OpPtrNotEqual comparisons against different buffers
 * NonWritable on a function variable in a non-entrypoint function
 * Select between arrays
 * Select between nested arrays and structs
 * Select between pointers
 * Selet between vectors with vector condition

Components: Vulkan

Affects:
dEQP-VK.spirv_assembly.instruction.spirv1p4.nonwritable.*
dEQP-VK.spirv_assembly.instruction.spirv1p4.opptrequal.*
dEQP-VK.spirv_assembly.instruction.spirv1p4.opptrnotequal.*
dEQP-VK.spirv_assembly.instruction.spirv1p4.opselect.*

VK-GL-CTS issue: 1855

Change-Id: Ie49d7a914cd7346d7da83d02f515a2772ae5bf94
(cherry picked from commit fbd39ed4f897735c22bb3472c18eed7756a476bb)

18 files changed:
android/cts/master/vk-master.txt
external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/nonwritable/non_main_function_nonwritable.amber [new file with mode: 0644]
external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opptrequal/different_ssbos_equal.amber [new file with mode: 0644]
external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opptrequal/different_wgs_equal.amber [new file with mode: 0644]
external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opptrnotequal/different_ssbos_not_equal.amber [new file with mode: 0644]
external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opptrnotequal/different_wgs_not_equal.amber [new file with mode: 0644]
external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opselect/array_select.amber [new file with mode: 0644]
external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opselect/array_stride_select.amber [new file with mode: 0644]
external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opselect/nested_array_select.amber [new file with mode: 0644]
external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opselect/nested_struct_select.amber [new file with mode: 0644]
external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opselect/ssbo_pointers_2_select.amber [new file with mode: 0644]
external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opselect/ssbo_pointers_select.amber [new file with mode: 0644]
external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opselect/vector_element_select.amber [new file with mode: 0644]
external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opselect/wg_pointers_2_select.amber [new file with mode: 0644]
external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opselect/wg_pointers_select.amber [new file with mode: 0644]
external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmSpirvVersion1p4Tests.cpp
external/vulkancts/mustpass/master/vk-default-no-waivers.txt
external/vulkancts/mustpass/master/vk-default.txt

index 17bdf9d..5a79155 100644 (file)
@@ -284652,6 +284652,8 @@ dEQP-VK.spirv_assembly.instruction.spirv1p4.opptrdiff.variable_pointers_vars_ssb
 dEQP-VK.spirv_assembly.instruction.spirv1p4.opptrdiff.variable_pointers_vars_ssbo_diff
 dEQP-VK.spirv_assembly.instruction.spirv1p4.opptrdiff.variable_pointers_vars_wg_diff
 dEQP-VK.spirv_assembly.instruction.spirv1p4.opptrdiff.wg_comparisons_diff
+dEQP-VK.spirv_assembly.instruction.spirv1p4.opptrequal.different_ssbos_equal
+dEQP-VK.spirv_assembly.instruction.spirv1p4.opptrequal.different_wgs_equal
 dEQP-VK.spirv_assembly.instruction.spirv1p4.opptrequal.null_comparisons_ssbo_equal
 dEQP-VK.spirv_assembly.instruction.spirv1p4.opptrequal.null_comparisons_wg_equal
 dEQP-VK.spirv_assembly.instruction.spirv1p4.opptrequal.ssbo_comparisons_equal
@@ -284661,6 +284663,8 @@ dEQP-VK.spirv_assembly.instruction.spirv1p4.opptrequal.variable_pointers_vars_ss
 dEQP-VK.spirv_assembly.instruction.spirv1p4.opptrequal.variable_pointers_vars_wg_equal
 dEQP-VK.spirv_assembly.instruction.spirv1p4.opptrequal.variable_pointers_wg_equal
 dEQP-VK.spirv_assembly.instruction.spirv1p4.opptrequal.wg_comparisons_equal
+dEQP-VK.spirv_assembly.instruction.spirv1p4.opptrnotequal.different_ssbos_not_equal
+dEQP-VK.spirv_assembly.instruction.spirv1p4.opptrnotequal.different_wgs_not_equal
 dEQP-VK.spirv_assembly.instruction.spirv1p4.opptrnotequal.null_comparisons_ssbo_not_equal
 dEQP-VK.spirv_assembly.instruction.spirv1p4.opptrnotequal.null_comparisons_wg_not_equal
 dEQP-VK.spirv_assembly.instruction.spirv1p4.opptrnotequal.ssbo_comparisons_not_equal
@@ -284680,6 +284684,7 @@ dEQP-VK.spirv_assembly.instruction.spirv1p4.uniformid.workgroup_cfg_uniform_id
 dEQP-VK.spirv_assembly.instruction.spirv1p4.uniformid.workgroup_uniform
 dEQP-VK.spirv_assembly.instruction.spirv1p4.nonwritable.function_2_nonwritable
 dEQP-VK.spirv_assembly.instruction.spirv1p4.nonwritable.function_nonwritable
+dEQP-VK.spirv_assembly.instruction.spirv1p4.nonwritable.non_main_function_nonwritable
 dEQP-VK.spirv_assembly.instruction.spirv1p4.nonwritable.private_2_nonwritable
 dEQP-VK.spirv_assembly.instruction.spirv1p4.nonwritable.private_nonwritable
 dEQP-VK.spirv_assembly.instruction.spirv1p4.entrypoint.comp_pc_entry_point
@@ -284708,9 +284713,18 @@ dEQP-VK.spirv_assembly.instruction.spirv1p4.loop_control.max_iterations
 dEQP-VK.spirv_assembly.instruction.spirv1p4.loop_control.min_iterations
 dEQP-VK.spirv_assembly.instruction.spirv1p4.loop_control.partial_count
 dEQP-VK.spirv_assembly.instruction.spirv1p4.loop_control.peel_count
+dEQP-VK.spirv_assembly.instruction.spirv1p4.opselect.array_select
+dEQP-VK.spirv_assembly.instruction.spirv1p4.opselect.array_stride_select
+dEQP-VK.spirv_assembly.instruction.spirv1p4.opselect.nested_array_select
+dEQP-VK.spirv_assembly.instruction.spirv1p4.opselect.nested_struct_select
 dEQP-VK.spirv_assembly.instruction.spirv1p4.opselect.scalar_select
+dEQP-VK.spirv_assembly.instruction.spirv1p4.opselect.ssbo_pointers_2_select
+dEQP-VK.spirv_assembly.instruction.spirv1p4.opselect.ssbo_pointers_select
 dEQP-VK.spirv_assembly.instruction.spirv1p4.opselect.struct_select
+dEQP-VK.spirv_assembly.instruction.spirv1p4.opselect.vector_element_select
 dEQP-VK.spirv_assembly.instruction.spirv1p4.opselect.vector_select
+dEQP-VK.spirv_assembly.instruction.spirv1p4.opselect.wg_pointers_2_select
+dEQP-VK.spirv_assembly.instruction.spirv1p4.opselect.wg_pointers_select
 dEQP-VK.spirv_assembly.instruction.spirv1p4.uconvert.spec_const_opt_extend_16_64_bit
 dEQP-VK.spirv_assembly.instruction.spirv1p4.uconvert.spec_const_opt_extend_16
 dEQP-VK.spirv_assembly.instruction.spirv1p4.uconvert.spec_const_opt_extend_251658240_64_bits
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/nonwritable/non_main_function_nonwritable.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/nonwritable/non_main_function_nonwritable.amber
new file mode 100644 (file)
index 0000000..cb94cd5
--- /dev/null
@@ -0,0 +1,45 @@
+[require]
+VK_KHR_spirv_1_4
+
+[compute shader spirv]
+OpCapability Shader
+OpMemoryModel Logical GLSL450
+OpEntryPoint GLCompute %main "main" %out_var
+OpExecutionMode %main LocalSize 1 1 1
+OpDecorate %func_var NonWritable
+OpDecorate %block Block
+OpMemberDecorate %block 0 Offset 0
+OpDecorate %out_var DescriptorSet 0
+OpDecorate %out_var Binding 0
+%void = OpTypeVoid
+%int = OpTypeInt 32 0
+%int_0 = OpConstant %int 0
+%int_2 = OpConstant %int 2
+%block = OpTypeStruct %int
+%ptr_ssbo_block = OpTypePointer StorageBuffer %block
+%ptr_ssbo_int = OpTypePointer StorageBuffer %int
+%out_var = OpVariable %ptr_ssbo_block StorageBuffer
+%void_fn = OpTypeFunction %void
+%int_fn = OpTypeFunction %int
+%ptr_func_int = OpTypePointer Function %int
+%main = OpFunction %void None %void_fn
+%entry = OpLabel
+%call = OpFunctionCall %int %func
+%gep = OpAccessChain %ptr_ssbo_int %out_var %int_0
+OpStore %gep %call
+OpReturn
+OpFunctionEnd
+%func = OpFunction %int None %int_fn
+%func_entry = OpLabel
+%func_var = OpVariable %ptr_func_int Function %int_2
+%ld = OpLoad %int %func_var
+OpReturnValue %ld
+OpFunctionEnd
+
+[test]
+ssbo 0:0 4
+
+compute entrypoint main
+compute 1 1 1
+
+probe ssbo uint 0:0 0 == 2
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opptrequal/different_ssbos_equal.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opptrequal/different_ssbos_equal.amber
new file mode 100644 (file)
index 0000000..1b9321e
--- /dev/null
@@ -0,0 +1,112 @@
+[require]
+VK_KHR_spirv_1_4
+VK_KHR_variable_pointers
+VariablePointerFeatures.variablePointers
+VariablePointerFeatures.variablePointersStorageBuffer
+VK_KHR_get_physical_device_properties2
+
+[compute shader spirv]
+OpCapability Shader
+OpCapability VariablePointers
+OpMemoryModel Logical GLSL450
+OpEntryPoint GLCompute %main "main" %var1 %var2 %var3 %out_var
+OpExecutionMode %main LocalSize 1 1 1
+OpDecorate %rta ArrayStride 4
+OpDecorate %struct Block
+OpMemberDecorate %struct 0 Offset 0
+OpDecorate %var1 DescriptorSet 0
+OpDecorate %var1 Binding 0
+OpDecorate %var2 DescriptorSet 0
+OpDecorate %var2 Binding 1
+OpDecorate %var3 DescriptorSet 0
+OpDecorate %var3 Binding 2
+OpDecorate %out_var DescriptorSet 0
+OpDecorate %out_var Binding 3
+%void = OpTypeVoid
+%bool = OpTypeBool
+%int = OpTypeInt 32 0
+%int_0 = OpConstant %int 0
+%int_1 = OpConstant %int 1
+%rta = OpTypeRuntimeArray %int
+%struct = OpTypeStruct %rta
+%ptr_ssbo_struct = OpTypePointer StorageBuffer %struct
+%ptr_ssbo_rta = OpTypePointer StorageBuffer %rta
+%ptr_ssbo_int = OpTypePointer StorageBuffer %int
+%var1 = OpVariable %ptr_ssbo_struct StorageBuffer
+%var2 = OpVariable %ptr_ssbo_struct StorageBuffer
+%var3 = OpVariable %ptr_ssbo_struct StorageBuffer
+%out_var = OpVariable %ptr_ssbo_struct StorageBuffer
+%void_fn = OpTypeFunction %void
+%main = OpFunction %void None %void_fn
+%entry = OpLabel
+%out_idx0 = OpCopyObject %int %int_0
+%var1_rta_gep = OpAccessChain %ptr_ssbo_rta %var1 %int_0
+%var1_int_gep = OpAccessChain %ptr_ssbo_int %var1 %int_0 %int_0
+%var2_rta_gep = OpAccessChain %ptr_ssbo_rta %var2 %int_0
+%var2_int_gep = OpAccessChain %ptr_ssbo_int %var2 %int_0 %int_0
+%var3_rta_gep = OpAccessChain %ptr_ssbo_rta %var3 %int_0
+%var3_int_gep = OpAccessChain %ptr_ssbo_int %var3 %int_0 %int_0
+; var1 vs var2
+%v1_eq_v2 = OpPtrEqual %bool %var1 %var2
+%v1_eq_v2_sel = OpSelect %int %v1_eq_v2 %int_1 %int_0
+%out_gep1 = OpAccessChain %ptr_ssbo_int %out_var %int_0 %out_idx0
+%out_idx1 = OpIAdd %int %out_idx0 %int_1
+OpStore %out_gep1 %v1_eq_v2_sel
+%v1_eq_v2_rta = OpPtrEqual %bool %var1_rta_gep %var2_rta_gep
+%v1_eq_v2_rta_sel = OpSelect %int %v1_eq_v2_rta %int_1 %int_0
+%out_gep2 = OpAccessChain %ptr_ssbo_int %out_var %int_0 %out_idx1
+%out_idx2 = OpIAdd %int %out_idx1 %int_1
+OpStore %out_gep2 %v1_eq_v2_rta_sel
+%v1_eq_v2_int = OpPtrEqual %bool %var1_int_gep %var2_int_gep
+%v1_eq_v2_int_sel = OpSelect %int %v1_eq_v2_int %int_1 %int_0
+%out_gep3 = OpAccessChain %ptr_ssbo_int %out_var %int_0 %out_idx2
+%out_idx3 = OpIAdd %int %out_idx2 %int_1
+OpStore %out_gep3 %v1_eq_v2_int_sel
+; var1 vs var3
+%v1_eq_v3 = OpPtrEqual %bool %var1 %var3
+%v1_eq_v3_sel = OpSelect %int %v1_eq_v3 %int_1 %int_0
+%out_gep4 = OpAccessChain %ptr_ssbo_int %out_var %int_0 %out_idx3
+%out_idx4 = OpIAdd %int %out_idx3 %int_1
+OpStore %out_gep4 %v1_eq_v3_sel
+%v1_eq_v3_rta = OpPtrEqual %bool %var1_rta_gep %var3_rta_gep
+%v1_eq_v3_rta_sel = OpSelect %int %v1_eq_v3_rta %int_1 %int_0
+%out_gep5 = OpAccessChain %ptr_ssbo_int %out_var %int_0 %out_idx4
+%out_idx5 = OpIAdd %int %out_idx4 %int_1
+OpStore %out_gep5 %v1_eq_v3_rta_sel
+%v1_eq_v3_int = OpPtrEqual %bool %var1_int_gep %var3_int_gep
+%v1_eq_v3_int_sel = OpSelect %int %v1_eq_v3_int %int_1 %int_0
+%out_gep6 = OpAccessChain %ptr_ssbo_int %out_var %int_0 %out_idx5
+%out_idx6 = OpIAdd %int %out_idx5 %int_1
+OpStore %out_gep6 %v1_eq_v3_int_sel
+; var2 vs var3
+%v2_eq_v3 = OpPtrEqual %bool %var2 %var3
+%v2_eq_v3_sel = OpSelect %int %v2_eq_v3 %int_1 %int_0
+%out_gep7 = OpAccessChain %ptr_ssbo_int %out_var %int_0 %out_idx6
+%out_idx7 = OpIAdd %int %out_idx6 %int_1
+OpStore %out_gep7 %v2_eq_v3_sel
+%v2_eq_v3_rta = OpPtrEqual %bool %var2_rta_gep %var3_rta_gep
+%v2_eq_v3_rta_sel = OpSelect %int %v2_eq_v3_rta %int_1 %int_0
+%out_gep8 = OpAccessChain %ptr_ssbo_int %out_var %int_0 %out_idx7
+%out_idx8 = OpIAdd %int %out_idx7 %int_1
+OpStore %out_gep8 %v2_eq_v3_rta_sel
+%v2_eq_v3_int = OpPtrEqual %bool %var2_int_gep %var3_int_gep
+%v2_eq_v3_int_sel = OpSelect %int %v2_eq_v3_int %int_1 %int_0
+%out_gep9 = OpAccessChain %ptr_ssbo_int %out_var %int_0 %out_idx8
+%out_idx9 = OpIAdd %int %out_idx8 %int_1
+OpStore %out_gep9 %v2_eq_v3_int_sel
+%v1_eq_v1 = OpPtrEqual %bool %var1 %var1
+%v1_eq_v1_sel = OpSelect %int %v1_eq_v1 %int_1 %int_0
+%out_gep10 = OpAccessChain %ptr_ssbo_int %out_var %int_0 %out_idx9
+OpStore %out_gep10 %v1_eq_v1_sel
+OpReturn
+OpFunctionEnd
+[test]
+ssbo 0:0 4
+ssbo 0:1 4
+ssbo 0:2 4
+ssbo 0:3 40
+
+compute entrypoint main
+compute 1 1 1
+
+probe ssbo uint 0:3 0  == 0 0 0 0 0 0 0 0 0 1
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opptrequal/different_wgs_equal.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opptrequal/different_wgs_equal.amber
new file mode 100644 (file)
index 0000000..117baa4
--- /dev/null
@@ -0,0 +1,107 @@
+[require]
+VK_KHR_spirv_1_4
+VK_KHR_variable_pointers
+VariablePointerFeatures.variablePointers
+VariablePointerFeatures.variablePointersStorageBuffer
+VK_KHR_get_physical_device_properties2
+
+[compute shader spirv]
+OpCapability Shader
+OpCapability VariablePointers
+OpMemoryModel Logical GLSL450
+OpEntryPoint GLCompute %main "main" %var1 %var2 %var3 %out_var
+OpExecutionMode %main LocalSize 1 1 1
+OpDecorate %rta ArrayStride 4
+OpDecorate %struct Block
+OpMemberDecorate %struct 0 Offset 0
+OpDecorate %out_var DescriptorSet 0
+OpDecorate %out_var Binding 0
+%void = OpTypeVoid
+%bool = OpTypeBool
+%int = OpTypeInt 32 0
+%int_0 = OpConstant %int 0
+%int_1 = OpConstant %int 1
+%rta = OpTypeRuntimeArray %int
+%struct = OpTypeStruct %rta
+%int2 = OpTypeVector %int 2
+%wg_struct = OpTypeStruct %int2
+%ptr_wg_struct = OpTypePointer Workgroup %wg_struct
+%ptr_wg_int2 = OpTypePointer Workgroup %int2
+%ptr_wg_int = OpTypePointer Workgroup %int
+%var1 = OpVariable %ptr_wg_struct Workgroup
+%var2 = OpVariable %ptr_wg_struct Workgroup
+%var3 = OpVariable %ptr_wg_struct Workgroup
+%ptr_ssbo_struct = OpTypePointer StorageBuffer %struct
+%ptr_ssbo_int = OpTypePointer StorageBuffer %int
+%out_var = OpVariable %ptr_ssbo_struct StorageBuffer
+%void_fn = OpTypeFunction %void
+%main = OpFunction %void None %void_fn
+%entry = OpLabel
+%out_idx0 = OpCopyObject %int %int_0
+%var1_int2_gep = OpAccessChain %ptr_wg_int2 %var1 %int_0
+%var1_int_gep = OpAccessChain %ptr_wg_int %var1 %int_0 %int_0
+%var2_int2_gep = OpAccessChain %ptr_wg_int2 %var2 %int_0
+%var2_int_gep = OpAccessChain %ptr_wg_int %var2 %int_0 %int_0
+%var3_int2_gep = OpAccessChain %ptr_wg_int2 %var3 %int_0
+%var3_int_gep = OpAccessChain %ptr_wg_int %var3 %int_0 %int_0
+; var1 vs var2
+%v1_eq_v2 = OpPtrEqual %bool %var1 %var2
+%v1_eq_v2_sel = OpSelect %int %v1_eq_v2 %int_1 %int_0
+%out_gep1 = OpAccessChain %ptr_ssbo_int %out_var %int_0 %out_idx0
+%out_idx1 = OpIAdd %int %out_idx0 %int_1
+OpStore %out_gep1 %v1_eq_v2_sel
+%v1_eq_v2_rta = OpPtrEqual %bool %var1_int2_gep %var2_int2_gep
+%v1_eq_v2_rta_sel = OpSelect %int %v1_eq_v2_rta %int_1 %int_0
+%out_gep2 = OpAccessChain %ptr_ssbo_int %out_var %int_0 %out_idx1
+%out_idx2 = OpIAdd %int %out_idx1 %int_1
+OpStore %out_gep2 %v1_eq_v2_rta_sel
+%v1_eq_v2_int = OpPtrEqual %bool %var1_int_gep %var2_int_gep
+%v1_eq_v2_int_sel = OpSelect %int %v1_eq_v2_int %int_1 %int_0
+%out_gep3 = OpAccessChain %ptr_ssbo_int %out_var %int_0 %out_idx2
+%out_idx3 = OpIAdd %int %out_idx2 %int_1
+OpStore %out_gep3 %v1_eq_v2_int_sel
+; var1 vs var3
+%v1_eq_v3 = OpPtrEqual %bool %var1 %var3
+%v1_eq_v3_sel = OpSelect %int %v1_eq_v3 %int_1 %int_0
+%out_gep4 = OpAccessChain %ptr_ssbo_int %out_var %int_0 %out_idx3
+%out_idx4 = OpIAdd %int %out_idx3 %int_1
+OpStore %out_gep4 %v1_eq_v3_sel
+%v1_eq_v3_rta = OpPtrEqual %bool %var1_int2_gep %var3_int2_gep
+%v1_eq_v3_rta_sel = OpSelect %int %v1_eq_v3_rta %int_1 %int_0
+%out_gep5 = OpAccessChain %ptr_ssbo_int %out_var %int_0 %out_idx4
+%out_idx5 = OpIAdd %int %out_idx4 %int_1
+OpStore %out_gep5 %v1_eq_v3_rta_sel
+%v1_eq_v3_int = OpPtrEqual %bool %var1_int_gep %var3_int_gep
+%v1_eq_v3_int_sel = OpSelect %int %v1_eq_v3_int %int_1 %int_0
+%out_gep6 = OpAccessChain %ptr_ssbo_int %out_var %int_0 %out_idx5
+%out_idx6 = OpIAdd %int %out_idx5 %int_1
+OpStore %out_gep6 %v1_eq_v3_int_sel
+; var2 vs var3
+%v2_eq_v3 = OpPtrEqual %bool %var2 %var3
+%v2_eq_v3_sel = OpSelect %int %v2_eq_v3 %int_1 %int_0
+%out_gep7 = OpAccessChain %ptr_ssbo_int %out_var %int_0 %out_idx6
+%out_idx7 = OpIAdd %int %out_idx6 %int_1
+OpStore %out_gep7 %v2_eq_v3_sel
+%v2_eq_v3_rta = OpPtrEqual %bool %var2_int2_gep %var3_int2_gep
+%v2_eq_v3_rta_sel = OpSelect %int %v2_eq_v3_rta %int_1 %int_0
+%out_gep8 = OpAccessChain %ptr_ssbo_int %out_var %int_0 %out_idx7
+%out_idx8 = OpIAdd %int %out_idx7 %int_1
+OpStore %out_gep8 %v2_eq_v3_rta_sel
+%v2_eq_v3_int = OpPtrEqual %bool %var2_int_gep %var3_int_gep
+%v2_eq_v3_int_sel = OpSelect %int %v2_eq_v3_int %int_1 %int_0
+%out_gep9 = OpAccessChain %ptr_ssbo_int %out_var %int_0 %out_idx8
+%out_idx9 = OpIAdd %int %out_idx8 %int_1
+OpStore %out_gep9 %v2_eq_v3_int_sel
+%v1_eq_v1 = OpPtrEqual %bool %var1 %var1
+%v1_eq_v1_sel = OpSelect %int %v1_eq_v1 %int_1 %int_0
+%out_gep10 = OpAccessChain %ptr_ssbo_int %out_var %int_0 %out_idx9
+OpStore %out_gep10 %v1_eq_v1_sel
+OpReturn
+OpFunctionEnd
+[test]
+ssbo 0:0 40
+
+compute entrypoint main
+compute 1 1 1
+
+probe ssbo uint 0:0 0  == 0 0 0 0 0 0 0 0 0 1
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opptrnotequal/different_ssbos_not_equal.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opptrnotequal/different_ssbos_not_equal.amber
new file mode 100644 (file)
index 0000000..e4226b9
--- /dev/null
@@ -0,0 +1,112 @@
+[require]
+VK_KHR_spirv_1_4
+VK_KHR_variable_pointers
+VariablePointerFeatures.variablePointers
+VariablePointerFeatures.variablePointersStorageBuffer
+VK_KHR_get_physical_device_properties2
+
+[compute shader spirv]
+OpCapability Shader
+OpCapability VariablePointers
+OpMemoryModel Logical GLSL450
+OpEntryPoint GLCompute %main "main" %var1 %var2 %var3 %out_var
+OpExecutionMode %main LocalSize 1 1 1
+OpDecorate %rta ArrayStride 4
+OpDecorate %struct Block
+OpMemberDecorate %struct 0 Offset 0
+OpDecorate %var1 DescriptorSet 0
+OpDecorate %var1 Binding 0
+OpDecorate %var2 DescriptorSet 0
+OpDecorate %var2 Binding 1
+OpDecorate %var3 DescriptorSet 0
+OpDecorate %var3 Binding 2
+OpDecorate %out_var DescriptorSet 0
+OpDecorate %out_var Binding 3
+%void = OpTypeVoid
+%bool = OpTypeBool
+%int = OpTypeInt 32 0
+%int_0 = OpConstant %int 0
+%int_1 = OpConstant %int 1
+%rta = OpTypeRuntimeArray %int
+%struct = OpTypeStruct %rta
+%ptr_ssbo_struct = OpTypePointer StorageBuffer %struct
+%ptr_ssbo_rta = OpTypePointer StorageBuffer %rta
+%ptr_ssbo_int = OpTypePointer StorageBuffer %int
+%var1 = OpVariable %ptr_ssbo_struct StorageBuffer
+%var2 = OpVariable %ptr_ssbo_struct StorageBuffer
+%var3 = OpVariable %ptr_ssbo_struct StorageBuffer
+%out_var = OpVariable %ptr_ssbo_struct StorageBuffer
+%void_fn = OpTypeFunction %void
+%main = OpFunction %void None %void_fn
+%entry = OpLabel
+%out_idx0 = OpCopyObject %int %int_0
+%var1_rta_gep = OpAccessChain %ptr_ssbo_rta %var1 %int_0
+%var1_int_gep = OpAccessChain %ptr_ssbo_int %var1 %int_0 %int_0
+%var2_rta_gep = OpAccessChain %ptr_ssbo_rta %var2 %int_0
+%var2_int_gep = OpAccessChain %ptr_ssbo_int %var2 %int_0 %int_0
+%var3_rta_gep = OpAccessChain %ptr_ssbo_rta %var3 %int_0
+%var3_int_gep = OpAccessChain %ptr_ssbo_int %var3 %int_0 %int_0
+; var1 vs var2
+%v1_neq_v2 = OpPtrNotEqual %bool %var1 %var2
+%v1_neq_v2_sel = OpSelect %int %v1_neq_v2 %int_1 %int_0
+%out_gep1 = OpAccessChain %ptr_ssbo_int %out_var %int_0 %out_idx0
+%out_idx1 = OpIAdd %int %out_idx0 %int_1
+OpStore %out_gep1 %v1_neq_v2_sel
+%v1_neq_v2_rta = OpPtrNotEqual %bool %var1_rta_gep %var2_rta_gep
+%v1_neq_v2_rta_sel = OpSelect %int %v1_neq_v2_rta %int_1 %int_0
+%out_gep2 = OpAccessChain %ptr_ssbo_int %out_var %int_0 %out_idx1
+%out_idx2 = OpIAdd %int %out_idx1 %int_1
+OpStore %out_gep2 %v1_neq_v2_rta_sel
+%v1_neq_v2_int = OpPtrNotEqual %bool %var1_int_gep %var2_int_gep
+%v1_neq_v2_int_sel = OpSelect %int %v1_neq_v2_int %int_1 %int_0
+%out_gep3 = OpAccessChain %ptr_ssbo_int %out_var %int_0 %out_idx2
+%out_idx3 = OpIAdd %int %out_idx2 %int_1
+OpStore %out_gep3 %v1_neq_v2_int_sel
+; var1 vs var3
+%v1_neq_v3 = OpPtrNotEqual %bool %var1 %var3
+%v1_neq_v3_sel = OpSelect %int %v1_neq_v3 %int_1 %int_0
+%out_gep4 = OpAccessChain %ptr_ssbo_int %out_var %int_0 %out_idx3
+%out_idx4 = OpIAdd %int %out_idx3 %int_1
+OpStore %out_gep4 %v1_neq_v3_sel
+%v1_neq_v3_rta = OpPtrNotEqual %bool %var1_rta_gep %var3_rta_gep
+%v1_neq_v3_rta_sel = OpSelect %int %v1_neq_v3_rta %int_1 %int_0
+%out_gep5 = OpAccessChain %ptr_ssbo_int %out_var %int_0 %out_idx4
+%out_idx5 = OpIAdd %int %out_idx4 %int_1
+OpStore %out_gep5 %v1_neq_v3_rta_sel
+%v1_neq_v3_int = OpPtrNotEqual %bool %var1_int_gep %var3_int_gep
+%v1_neq_v3_int_sel = OpSelect %int %v1_neq_v3_int %int_1 %int_0
+%out_gep6 = OpAccessChain %ptr_ssbo_int %out_var %int_0 %out_idx5
+%out_idx6 = OpIAdd %int %out_idx5 %int_1
+OpStore %out_gep6 %v1_neq_v3_int_sel
+; var2 vs var3
+%v2_neq_v3 = OpPtrNotEqual %bool %var2 %var3
+%v2_neq_v3_sel = OpSelect %int %v2_neq_v3 %int_1 %int_0
+%out_gep7 = OpAccessChain %ptr_ssbo_int %out_var %int_0 %out_idx6
+%out_idx7 = OpIAdd %int %out_idx6 %int_1
+OpStore %out_gep7 %v2_neq_v3_sel
+%v2_neq_v3_rta = OpPtrNotEqual %bool %var2_rta_gep %var3_rta_gep
+%v2_neq_v3_rta_sel = OpSelect %int %v2_neq_v3_rta %int_1 %int_0
+%out_gep8 = OpAccessChain %ptr_ssbo_int %out_var %int_0 %out_idx7
+%out_idx8 = OpIAdd %int %out_idx7 %int_1
+OpStore %out_gep8 %v2_neq_v3_rta_sel
+%v2_neq_v3_int = OpPtrNotEqual %bool %var2_int_gep %var3_int_gep
+%v2_neq_v3_int_sel = OpSelect %int %v2_neq_v3_int %int_1 %int_0
+%out_gep9 = OpAccessChain %ptr_ssbo_int %out_var %int_0 %out_idx8
+%out_idx9 = OpIAdd %int %out_idx8 %int_1
+OpStore %out_gep9 %v2_neq_v3_int_sel
+%v1_neq_v1 = OpPtrNotEqual %bool %var1 %var1
+%v1_neq_v1_sel = OpSelect %int %v1_neq_v1 %int_1 %int_0
+%out_gep10 = OpAccessChain %ptr_ssbo_int %out_var %int_0 %out_idx9
+OpStore %out_gep10 %v1_neq_v1_sel
+OpReturn
+OpFunctionEnd
+[test]
+ssbo 0:0 4
+ssbo 0:1 4
+ssbo 0:2 4
+ssbo 0:3 40
+
+compute entrypoint main
+compute 1 1 1
+
+probe ssbo uint 0:3 0  == 1 1 1 1 1 1 1 1 1 0
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opptrnotequal/different_wgs_not_equal.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opptrnotequal/different_wgs_not_equal.amber
new file mode 100644 (file)
index 0000000..718ec3b
--- /dev/null
@@ -0,0 +1,109 @@
+[require]
+VK_KHR_spirv_1_4
+VK_KHR_variable_pointers
+VariablePointerFeatures.variablePointers
+VariablePointerFeatures.variablePointersStorageBuffer
+VK_KHR_get_physical_device_properties2
+
+[compute shader spirv]
+OpCapability Shader
+OpCapability VariablePointers
+OpMemoryModel Logical GLSL450
+OpEntryPoint GLCompute %main "main" %var1 %var2 %var3 %out_var
+OpExecutionMode %main LocalSize 1 1 1
+OpDecorate %rta ArrayStride 4
+OpDecorate %struct Block
+OpMemberDecorate %struct 0 Offset 0
+OpDecorate %out_var DescriptorSet 0
+OpDecorate %out_var Binding 0
+%void = OpTypeVoid
+%bool = OpTypeBool
+%int = OpTypeInt 32 0
+%int_0 = OpConstant %int 0
+%int_1 = OpConstant %int 1
+%rta = OpTypeRuntimeArray %int
+%struct = OpTypeStruct %rta
+%int2 = OpTypeVector %int 2
+%wg_struct = OpTypeStruct %int2
+%ptr_wg_struct = OpTypePointer Workgroup %wg_struct
+%ptr_wg_int2 = OpTypePointer Workgroup %int2
+%ptr_wg_int = OpTypePointer Workgroup %int
+%var1 = OpVariable %ptr_wg_struct Workgroup
+%var2 = OpVariable %ptr_wg_struct Workgroup
+%var3 = OpVariable %ptr_wg_struct Workgroup
+%ptr_ssbo_struct = OpTypePointer StorageBuffer %struct
+%ptr_ssbo_rta = OpTypePointer StorageBuffer %rta
+%ptr_ssbo_int = OpTypePointer StorageBuffer %int
+%out_var = OpVariable %ptr_ssbo_struct StorageBuffer
+%void_fn = OpTypeFunction %void
+%main = OpFunction %void None %void_fn
+%entry = OpLabel
+%out_idx0 = OpCopyObject %int %int_0
+%var1_int2_gep = OpAccessChain %ptr_wg_int2 %var1 %int_0
+%var1_int_gep = OpAccessChain %ptr_wg_int %var1 %int_0 %int_0
+%var2_int2_gep = OpAccessChain %ptr_wg_int2 %var2 %int_0
+%var2_int_gep = OpAccessChain %ptr_wg_int %var2 %int_0 %int_0
+%var3_int2_gep = OpAccessChain %ptr_wg_int2 %var3 %int_0
+%var3_int_gep = OpAccessChain %ptr_wg_int %var3 %int_0 %int_0
+; var1 vs var2
+%v1_neq_v2 = OpPtrNotEqual %bool %var1 %var2
+%v1_neq_v2_sel = OpSelect %int %v1_neq_v2 %int_1 %int_0
+%out_gep1 = OpAccessChain %ptr_ssbo_int %out_var %int_0 %out_idx0
+%out_idx1 = OpIAdd %int %out_idx0 %int_1
+OpStore %out_gep1 %v1_neq_v2_sel
+%v1_neq_v2_rta = OpPtrNotEqual %bool %var1_int2_gep %var2_int2_gep
+%v1_neq_v2_rta_sel = OpSelect %int %v1_neq_v2_rta %int_1 %int_0
+%out_gep2 = OpAccessChain %ptr_ssbo_int %out_var %int_0 %out_idx1
+%out_idx2 = OpIAdd %int %out_idx1 %int_1
+OpStore %out_gep2 %v1_neq_v2_rta_sel
+%v1_neq_v2_int = OpPtrNotEqual %bool %var1_int_gep %var2_int_gep
+%v1_neq_v2_int_sel = OpSelect %int %v1_neq_v2_int %int_1 %int_0
+%out_gep3 = OpAccessChain %ptr_ssbo_int %out_var %int_0 %out_idx2
+%out_idx3 = OpIAdd %int %out_idx2 %int_1
+OpStore %out_gep3 %v1_neq_v2_int_sel
+; var1 vs var3
+%v1_neq_v3 = OpPtrNotEqual %bool %var1 %var3
+%v1_neq_v3_sel = OpSelect %int %v1_neq_v3 %int_1 %int_0
+%out_gep4 = OpAccessChain %ptr_ssbo_int %out_var %int_0 %out_idx3
+%out_idx4 = OpIAdd %int %out_idx3 %int_1
+OpStore %out_gep4 %v1_neq_v3_sel
+%v1_neq_v3_rta = OpPtrNotEqual %bool %var1_int2_gep %var3_int2_gep
+%v1_neq_v3_rta_sel = OpSelect %int %v1_neq_v3_rta %int_1 %int_0
+%out_gep5 = OpAccessChain %ptr_ssbo_int %out_var %int_0 %out_idx4
+%out_idx5 = OpIAdd %int %out_idx4 %int_1
+OpStore %out_gep5 %v1_neq_v3_rta_sel
+%v1_neq_v3_int = OpPtrNotEqual %bool %var1_int_gep %var3_int_gep
+%v1_neq_v3_int_sel = OpSelect %int %v1_neq_v3_int %int_1 %int_0
+%out_gep6 = OpAccessChain %ptr_ssbo_int %out_var %int_0 %out_idx5
+%out_idx6 = OpIAdd %int %out_idx5 %int_1
+OpStore %out_gep6 %v1_neq_v3_int_sel
+; var2 vs var3
+%v2_neq_v3 = OpPtrNotEqual %bool %var2 %var3
+%v2_neq_v3_sel = OpSelect %int %v2_neq_v3 %int_1 %int_0
+%out_gep7 = OpAccessChain %ptr_ssbo_int %out_var %int_0 %out_idx6
+%out_idx7 = OpIAdd %int %out_idx6 %int_1
+OpStore %out_gep7 %v2_neq_v3_sel
+%v2_neq_v3_rta = OpPtrNotEqual %bool %var2_int2_gep %var3_int2_gep
+%v2_neq_v3_rta_sel = OpSelect %int %v2_neq_v3_rta %int_1 %int_0
+%out_gep8 = OpAccessChain %ptr_ssbo_int %out_var %int_0 %out_idx7
+%out_idx8 = OpIAdd %int %out_idx7 %int_1
+OpStore %out_gep8 %v2_neq_v3_rta_sel
+%v2_neq_v3_int = OpPtrNotEqual %bool %var2_int_gep %var3_int_gep
+%v2_neq_v3_int_sel = OpSelect %int %v2_neq_v3_int %int_1 %int_0
+%out_gep9 = OpAccessChain %ptr_ssbo_int %out_var %int_0 %out_idx8
+%out_idx9 = OpIAdd %int %out_idx8 %int_1
+OpStore %out_gep9 %v2_neq_v3_int_sel
+%v1_neq_v1 = OpPtrNotEqual %bool %var1 %var1
+%v1_neq_v1_sel = OpSelect %int %v1_neq_v1 %int_1 %int_0
+%out_gep10 = OpAccessChain %ptr_ssbo_int %out_var %int_0 %out_idx9
+OpStore %out_gep10 %v1_neq_v1_sel
+OpReturn
+OpFunctionEnd
+[test]
+ssbo 0:0 40
+
+compute entrypoint main
+compute 1 1 1
+
+probe ssbo uint 0:0 0  == 1 1 1 1 1 1 1 1 1 0
+
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opselect/array_select.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opselect/array_select.amber
new file mode 100644 (file)
index 0000000..f8ae803
--- /dev/null
@@ -0,0 +1,66 @@
+[require]
+VK_KHR_spirv_1_4
+
+[compute shader spirv]
+OpCapability Shader
+OpMemoryModel Logical GLSL450
+OpEntryPoint GLCompute %main "main" %gid_var %in_var %out_var
+OpExecutionMode %main LocalSize 1 1 1
+OpDecorate %gid_var BuiltIn GlobalInvocationId
+OpDecorate %int_array ArrayStride 4
+OpDecorate %rta ArrayStride 4
+OpDecorate %rta_array ArrayStride 16
+OpDecorate %struct Block
+OpMemberDecorate %struct 0 Offset 0
+OpDecorate %out_struct Block
+OpMemberDecorate %out_struct 0 Offset 0
+OpDecorate %in_var DescriptorSet 0
+OpDecorate %in_var Binding 0
+OpDecorate %out_var DescriptorSet 0
+OpDecorate %out_var Binding 1
+%void = OpTypeVoid
+%bool = OpTypeBool
+%int = OpTypeInt 32 0
+%int_0 = OpConstant %int 0
+%int_1 = OpConstant %int 1
+%int_2 = OpConstant %int 2
+%int_3 = OpConstant %int 3
+%int_4 = OpConstant %int 4
+%int3 = OpTypeVector %int 3
+%int_array = OpTypeArray %int %int_4
+%const_array1 = OpConstantComposite %int_array %int_0 %int_1 %int_2 %int_3
+%const_array2 = OpConstantComposite %int_array %int_3 %int_2 %int_1 %int_0
+%rta_array = OpTypeRuntimeArray %int_array
+%out_struct = OpTypeStruct %rta_array
+%rta = OpTypeRuntimeArray %int
+%struct = OpTypeStruct %rta
+%ptr_input_int3 = OpTypePointer Input %int3
+%gid_var = OpVariable %ptr_input_int3 Input
+%ptr_ssbo_struct = OpTypePointer StorageBuffer %struct
+%ptr_ssbo_out_struct = OpTypePointer StorageBuffer %out_struct
+%ptr_ssbo_array = OpTypePointer StorageBuffer %int_array
+%ptr_ssbo_int = OpTypePointer StorageBuffer %int
+%in_var = OpVariable %ptr_ssbo_struct StorageBuffer
+%out_var = OpVariable %ptr_ssbo_out_struct StorageBuffer
+%void_fn = OpTypeFunction %void
+%main = OpFunction %void None %void_fn
+%entry = OpLabel
+%gid = OpLoad %int3 %gid_var
+%gid_x = OpCompositeExtract %int %gid 0
+%in_gep = OpAccessChain %ptr_ssbo_int %in_var %int_0 %gid_x
+%ld = OpLoad %int %in_gep
+%eq_0 = OpIEqual %bool %ld %int_0
+%select = OpSelect %int_array %eq_0 %const_array1 %const_array2
+%out_gep = OpAccessChain %ptr_ssbo_array %out_var %int_0 %gid_x
+OpStore %out_gep %select
+OpReturn
+OpFunctionEnd
+
+[test]
+ssbo 0:0 subdata uint 0 0 1 1 0
+ssbo 0:1 64
+
+compute entrypoint main
+compute 4 1 1
+
+probe ssbo uint 0:1 0 == 0 1 2 3 3 2 1 0 3 2 1 0 0 1 2 3
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opselect/array_stride_select.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opselect/array_stride_select.amber
new file mode 100644 (file)
index 0000000..194902a
--- /dev/null
@@ -0,0 +1,74 @@
+[require]
+VK_KHR_spirv_1_4
+
+[compute shader spirv]
+OpCapability Shader
+OpMemoryModel Logical GLSL450
+OpEntryPoint GLCompute %main "main" %gid_var %in_var %out_var
+OpExecutionMode %main LocalSize 1 1 1
+OpDecorate %gid_var BuiltIn GlobalInvocationId
+OpDecorate %int_array ArrayStride 8
+OpDecorate %rta ArrayStride 4
+OpDecorate %rta_array ArrayStride 32
+OpDecorate %struct Block
+OpMemberDecorate %struct 0 Offset 0
+OpDecorate %out_struct Block
+OpMemberDecorate %out_struct 0 Offset 0
+OpDecorate %in_var DescriptorSet 0
+OpDecorate %in_var Binding 0
+OpDecorate %out_var DescriptorSet 0
+OpDecorate %out_var Binding 1
+%void = OpTypeVoid
+%bool = OpTypeBool
+%int = OpTypeInt 32 0
+%int_0 = OpConstant %int 0
+%int_1 = OpConstant %int 1
+%int_2 = OpConstant %int 2
+%int_3 = OpConstant %int 3
+%int_4 = OpConstant %int 4
+%int3 = OpTypeVector %int 3
+%int_array = OpTypeArray %int %int_4
+%const_array1 = OpConstantComposite %int_array %int_0 %int_1 %int_2 %int_3
+%const_array2 = OpConstantComposite %int_array %int_3 %int_2 %int_1 %int_0
+%rta_array = OpTypeRuntimeArray %int_array
+%out_struct = OpTypeStruct %rta_array
+%rta = OpTypeRuntimeArray %int
+%struct = OpTypeStruct %rta
+%ptr_input_int3 = OpTypePointer Input %int3
+%gid_var = OpVariable %ptr_input_int3 Input
+%ptr_ssbo_struct = OpTypePointer StorageBuffer %struct
+%ptr_ssbo_out_struct = OpTypePointer StorageBuffer %out_struct
+%ptr_ssbo_array = OpTypePointer StorageBuffer %int_array
+%ptr_ssbo_int = OpTypePointer StorageBuffer %int
+%in_var = OpVariable %ptr_ssbo_struct StorageBuffer
+%out_var = OpVariable %ptr_ssbo_out_struct StorageBuffer
+%void_fn = OpTypeFunction %void
+%main = OpFunction %void None %void_fn
+%entry = OpLabel
+%gid = OpLoad %int3 %gid_var
+%gid_x = OpCompositeExtract %int %gid 0
+%in_gep = OpAccessChain %ptr_ssbo_int %in_var %int_0 %gid_x
+%ld = OpLoad %int %in_gep
+%eq_0 = OpIEqual %bool %ld %int_0
+%select = OpSelect %int_array %eq_0 %const_array1 %const_array2
+%out_gep = OpAccessChain %ptr_ssbo_array %out_var %int_0 %gid_x
+OpStore %out_gep %select
+OpReturn
+OpFunctionEnd
+
+[test]
+ssbo 0:0 subdata uint 0 0 1
+ssbo 0:1 64
+
+compute entrypoint main
+compute 2 1 1
+
+probe ssbo uint 0:1 0  == 0
+probe ssbo uint 0:1 8  == 1
+probe ssbo uint 0:1 16 == 2
+probe ssbo uint 0:1 24 == 3
+probe ssbo uint 0:1 32 == 3
+probe ssbo uint 0:1 40 == 2
+probe ssbo uint 0:1 48 == 1
+probe ssbo uint 0:1 56 == 0
+
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opselect/nested_array_select.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opselect/nested_array_select.amber
new file mode 100644 (file)
index 0000000..bf26973
--- /dev/null
@@ -0,0 +1,75 @@
+[require]
+VK_KHR_spirv_1_4
+
+[compute shader spirv]
+OpCapability Shader
+OpMemoryModel Logical GLSL450
+OpEntryPoint GLCompute %main "main" %gid_var %sel_var %in_var %out_var
+OpExecutionMode %main LocalSize 1 1 1
+OpDecorate %gid_var BuiltIn GlobalInvocationId
+OpDecorate %inner ArrayStride 4
+OpMemberDecorate %outer 0 Offset 0
+OpMemberDecorate %outer 1 Offset 8
+OpDecorate %rta ArrayStride 4
+OpDecorate %rta_out ArrayStride 16
+OpDecorate %block Block
+OpMemberDecorate %block 0 Offset 0
+OpDecorate %out_block Block
+OpMemberDecorate %out_block 0 Offset 0
+OpDecorate %sel_var DescriptorSet 0
+OpDecorate %sel_var Binding 0
+OpDecorate %in_var DescriptorSet 0
+OpDecorate %in_var Binding 1
+OpDecorate %out_var DescriptorSet 0
+OpDecorate %out_var Binding 2
+%void = OpTypeVoid
+%bool = OpTypeBool
+%int = OpTypeInt 32 0
+%int_0 = OpConstant %int 0
+%int_1 = OpConstant %int 1
+%int_2 = OpConstant %int 2
+%int3 = OpTypeVector %int 3
+%inner = OpTypeArray %int %int_2
+%outer = OpTypeStruct %inner %inner
+%rta_out = OpTypeRuntimeArray %outer
+%out_block = OpTypeStruct %rta_out
+%rta = OpTypeRuntimeArray %int
+%block = OpTypeStruct %rta
+%ptr_input_int3 = OpTypePointer Input %int3
+%gid_var = OpVariable %ptr_input_int3 Input
+%ptr_ssbo_block = OpTypePointer StorageBuffer %block
+%ptr_ssbo_int = OpTypePointer StorageBuffer %int
+%ptr_ssbo_out_block = OpTypePointer StorageBuffer %out_block
+%ptr_ssbo_outer = OpTypePointer StorageBuffer %outer
+%sel_var = OpVariable %ptr_ssbo_block StorageBuffer
+%in_var = OpVariable %ptr_ssbo_out_block StorageBuffer
+%out_var = OpVariable %ptr_ssbo_out_block StorageBuffer
+%void_fn = OpTypeFunction %void
+%main = OpFunction %void None %void_fn
+%entry = OpLabel
+%gid = OpLoad %int3 %gid_var
+%gid_x = OpCompositeExtract %int %gid 0
+%in_gep0 = OpAccessChain %ptr_ssbo_outer %in_var %int_0 %int_0
+%in0 = OpLoad %outer %in_gep0
+%in_gep1 = OpAccessChain %ptr_ssbo_outer %in_var %int_0 %int_1
+%in1 = OpLoad %outer %in_gep1
+%sel_gep = OpAccessChain %ptr_ssbo_int %sel_var %int_0 %gid_x
+%sel_val = OpLoad %int %sel_gep
+%eq_0 = OpIEqual %bool %sel_val %int_0
+%select = OpSelect %outer %eq_0 %in0 %in1
+%out_gep = OpAccessChain %ptr_ssbo_outer %out_var %int_0 %gid_x
+OpStore %out_gep %select
+OpReturn
+OpFunctionEnd
+
+[test]
+ssbo 0:0 subdata uint 0 1 0
+ssbo 0:1 subdata uint 0 1 1 1 1 2 2 2 2
+ssbo 0:2 32
+
+compute entrypoint main
+compute 2 1 1
+
+probe ssbo uint 0:2 0  == 2 2 2 2
+probe ssbo uint 0:2 16 == 1 1 1 1
+
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opselect/nested_struct_select.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opselect/nested_struct_select.amber
new file mode 100644 (file)
index 0000000..23bcd8f
--- /dev/null
@@ -0,0 +1,74 @@
+[require]
+VK_KHR_spirv_1_4
+
+[compute shader spirv]
+OpCapability Shader
+OpMemoryModel Logical GLSL450
+OpEntryPoint GLCompute %main "main" %gid_var %sel_var %in_var %out_var
+OpExecutionMode %main LocalSize 1 1 1
+OpDecorate %gid_var BuiltIn GlobalInvocationId
+OpMemberDecorate %inner 0 Offset 0
+OpMemberDecorate %inner 1 Offset 4
+OpMemberDecorate %outer 0 Offset 0
+OpMemberDecorate %outer 1 Offset 8
+OpDecorate %rta ArrayStride 4
+OpDecorate %rta_out ArrayStride 16
+OpDecorate %block Block
+OpMemberDecorate %block 0 Offset 0
+OpDecorate %out_block Block
+OpMemberDecorate %out_block 0 Offset 0
+OpDecorate %sel_var DescriptorSet 0
+OpDecorate %sel_var Binding 0
+OpDecorate %in_var DescriptorSet 0
+OpDecorate %in_var Binding 1
+OpDecorate %out_var DescriptorSet 0
+OpDecorate %out_var Binding 2
+%void = OpTypeVoid
+%bool = OpTypeBool
+%int = OpTypeInt 32 0
+%int_0 = OpConstant %int 0
+%int_1 = OpConstant %int 1
+%int3 = OpTypeVector %int 3
+%inner = OpTypeStruct %int %int
+%outer = OpTypeStruct %inner %inner
+%rta_out = OpTypeRuntimeArray %outer
+%out_block = OpTypeStruct %rta_out
+%rta = OpTypeRuntimeArray %int
+%block = OpTypeStruct %rta
+%ptr_input_int3 = OpTypePointer Input %int3
+%gid_var = OpVariable %ptr_input_int3 Input
+%ptr_ssbo_block = OpTypePointer StorageBuffer %block
+%ptr_ssbo_int = OpTypePointer StorageBuffer %int
+%ptr_ssbo_out_block = OpTypePointer StorageBuffer %out_block
+%ptr_ssbo_outer = OpTypePointer StorageBuffer %outer
+%sel_var = OpVariable %ptr_ssbo_block StorageBuffer
+%in_var = OpVariable %ptr_ssbo_out_block StorageBuffer
+%out_var = OpVariable %ptr_ssbo_out_block StorageBuffer
+%void_fn = OpTypeFunction %void
+%main = OpFunction %void None %void_fn
+%entry = OpLabel
+%gid = OpLoad %int3 %gid_var
+%gid_x = OpCompositeExtract %int %gid 0
+%in_gep0 = OpAccessChain %ptr_ssbo_outer %in_var %int_0 %int_0
+%in0 = OpLoad %outer %in_gep0
+%in_gep1 = OpAccessChain %ptr_ssbo_outer %in_var %int_0 %int_1
+%in1 = OpLoad %outer %in_gep1
+%sel_gep = OpAccessChain %ptr_ssbo_int %sel_var %int_0 %gid_x
+%sel_val = OpLoad %int %sel_gep
+%eq_0 = OpIEqual %bool %sel_val %int_0
+%select = OpSelect %outer %eq_0 %in0 %in1
+%out_gep = OpAccessChain %ptr_ssbo_outer %out_var %int_0 %gid_x
+OpStore %out_gep %select
+OpReturn
+OpFunctionEnd
+
+[test]
+ssbo 0:0 subdata uint 0 1 0
+ssbo 0:1 subdata uint 0 1 1 1 1 2 2 2 2
+ssbo 0:2 32
+
+compute entrypoint main
+compute 2 1 1
+
+probe ssbo uint 0:2 0  == 2 2 2 2
+probe ssbo uint 0:2 16 == 1 1 1 1
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opselect/ssbo_pointers_2_select.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opselect/ssbo_pointers_2_select.amber
new file mode 100644 (file)
index 0000000..60cc75f
--- /dev/null
@@ -0,0 +1,83 @@
+[require]
+VK_KHR_spirv_1_4
+VK_KHR_variable_pointers
+VariablePointerFeatures.variablePointersStorageBuffer
+VariablePointerFeatures.variablePointers
+VK_KHR_get_physical_device_properties2
+
+[compute shader spirv]
+OpCapability Shader
+OpCapability VariablePointers
+OpMemoryModel Logical GLSL450
+OpEntryPoint GLCompute %main "main" %gid_var %sel_var %in1_var %in2_var %out_var
+OpExecutionMode %main LocalSize 1 1 1
+OpDecorate %gid_var BuiltIn GlobalInvocationId
+OpMemberDecorate %inner 0 Offset 0
+OpMemberDecorate %inner 1 Offset 4
+OpMemberDecorate %outer 0 Offset 0
+OpMemberDecorate %outer 1 Offset 8
+OpDecorate %rta ArrayStride 4
+OpDecorate %rta_struct ArrayStride 16
+OpDecorate %block Block
+OpMemberDecorate %block 0 Offset 0
+OpDecorate %data_block Block
+OpMemberDecorate %data_block 0 Offset 0
+OpDecorate %sel_var DescriptorSet 0
+OpDecorate %sel_var Binding 0
+OpDecorate %in1_var DescriptorSet 0
+OpDecorate %in1_var Binding 1
+OpDecorate %in2_var DescriptorSet 0
+OpDecorate %in2_var Binding 2
+OpDecorate %out_var DescriptorSet 0
+OpDecorate %out_var Binding 3
+%void = OpTypeVoid
+%bool = OpTypeBool
+%int = OpTypeInt 32 0
+%int_0 = OpConstant %int 0
+%int_1 = OpConstant %int 1
+%int3 = OpTypeVector %int 3
+%inner = OpTypeStruct %int %int
+%outer = OpTypeStruct %inner %inner
+%rta_struct = OpTypeRuntimeArray %outer
+%rta = OpTypeRuntimeArray %int
+%data_block = OpTypeStruct %rta_struct
+%block = OpTypeStruct %rta
+%ptr_input_int3 = OpTypePointer Input %int3
+%gid_var = OpVariable %ptr_input_int3 Input
+%ptr_ssbo_block = OpTypePointer StorageBuffer %block
+%ptr_ssbo_int = OpTypePointer StorageBuffer %int
+%ptr_ssbo_data_block = OpTypePointer StorageBuffer %data_block
+%ptr_ssbo_outer = OpTypePointer StorageBuffer %outer
+%sel_var = OpVariable %ptr_ssbo_block StorageBuffer
+%in1_var = OpVariable %ptr_ssbo_data_block StorageBuffer
+%in2_var = OpVariable %ptr_ssbo_data_block StorageBuffer
+%out_var = OpVariable %ptr_ssbo_data_block StorageBuffer
+%void_fn = OpTypeFunction %void
+%main = OpFunction %void None %void_fn
+%entry = OpLabel
+%gid = OpLoad %int3 %gid_var
+%gid_x = OpCompositeExtract %int %gid 0
+%in_gep0 = OpAccessChain %ptr_ssbo_outer %in1_var %int_0 %int_0
+%in_gep1 = OpAccessChain %ptr_ssbo_outer %in2_var %int_0 %int_0
+%sel_gep = OpAccessChain %ptr_ssbo_int %sel_var %int_0 %gid_x
+%sel_val = OpLoad %int %sel_gep
+%eq_0 = OpIEqual %bool %sel_val %int_0
+%select = OpSelect %ptr_ssbo_outer %eq_0 %in_gep0 %in_gep1
+%out_gep = OpAccessChain %ptr_ssbo_outer %out_var %int_0 %gid_x
+%ld = OpLoad %outer %select
+OpStore %out_gep %ld
+OpReturn
+OpFunctionEnd
+
+[test]
+ssbo 0:0 subdata uint 0 1 0
+ssbo 0:1 subdata uint 0 1 1 1 1
+ssbo 0:2 subdata uint 0 2 2 2 2
+ssbo 0:3 32
+
+compute entrypoint main
+compute 2 1 1
+
+probe ssbo uint 0:3 0  == 2 2 2 2
+probe ssbo uint 0:3 16 == 1 1 1 1
+
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opselect/ssbo_pointers_select.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opselect/ssbo_pointers_select.amber
new file mode 100644 (file)
index 0000000..bb25bb9
--- /dev/null
@@ -0,0 +1,76 @@
+[require]
+VK_KHR_spirv_1_4
+VK_KHR_variable_pointers
+VariablePointerFeatures.variablePointersStorageBuffer
+VK_KHR_get_physical_device_properties2
+
+[compute shader spirv]
+OpCapability Shader
+OpCapability VariablePointersStorageBuffer
+OpMemoryModel Logical GLSL450
+OpEntryPoint GLCompute %main "main" %gid_var %sel_var %in_var %out_var
+OpExecutionMode %main LocalSize 1 1 1
+OpDecorate %gid_var BuiltIn GlobalInvocationId
+OpMemberDecorate %inner 0 Offset 0
+OpMemberDecorate %inner 1 Offset 4
+OpMemberDecorate %outer 0 Offset 0
+OpMemberDecorate %outer 1 Offset 8
+OpDecorate %rta ArrayStride 4
+OpDecorate %rta_struct ArrayStride 16
+OpDecorate %block Block
+OpMemberDecorate %block 0 Offset 0
+OpDecorate %data_block Block
+OpMemberDecorate %data_block 0 Offset 0
+OpDecorate %sel_var DescriptorSet 0
+OpDecorate %sel_var Binding 0
+OpDecorate %in_var DescriptorSet 0
+OpDecorate %in_var Binding 1
+OpDecorate %out_var DescriptorSet 0
+OpDecorate %out_var Binding 2
+%void = OpTypeVoid
+%bool = OpTypeBool
+%int = OpTypeInt 32 0
+%int_0 = OpConstant %int 0
+%int_1 = OpConstant %int 1
+%int3 = OpTypeVector %int 3
+%inner = OpTypeStruct %int %int
+%outer = OpTypeStruct %inner %inner
+%rta_struct = OpTypeRuntimeArray %outer
+%rta = OpTypeRuntimeArray %int
+%data_block = OpTypeStruct %rta_struct
+%block = OpTypeStruct %rta
+%ptr_input_int3 = OpTypePointer Input %int3
+%gid_var = OpVariable %ptr_input_int3 Input
+%ptr_ssbo_block = OpTypePointer StorageBuffer %block
+%ptr_ssbo_int = OpTypePointer StorageBuffer %int
+%ptr_ssbo_data_block = OpTypePointer StorageBuffer %data_block
+%ptr_ssbo_outer = OpTypePointer StorageBuffer %outer
+%sel_var = OpVariable %ptr_ssbo_block StorageBuffer
+%in_var = OpVariable %ptr_ssbo_data_block StorageBuffer
+%out_var = OpVariable %ptr_ssbo_data_block StorageBuffer
+%void_fn = OpTypeFunction %void
+%main = OpFunction %void None %void_fn
+%entry = OpLabel
+%gid = OpLoad %int3 %gid_var
+%gid_x = OpCompositeExtract %int %gid 0
+%in_gep0 = OpAccessChain %ptr_ssbo_outer %in_var %int_0 %int_0
+%in_gep1 = OpAccessChain %ptr_ssbo_outer %in_var %int_0 %int_1
+%sel_gep = OpAccessChain %ptr_ssbo_int %sel_var %int_0 %gid_x
+%sel_val = OpLoad %int %sel_gep
+%eq_0 = OpIEqual %bool %sel_val %int_0
+%select = OpSelect %ptr_ssbo_outer %eq_0 %in_gep0 %in_gep1
+%out_gep = OpAccessChain %ptr_ssbo_outer %out_var %int_0 %gid_x
+OpCopyMemory %out_gep %select
+OpReturn
+OpFunctionEnd
+
+[test]
+ssbo 0:0 subdata uint 0 1 0
+ssbo 0:1 subdata uint 0 1 1 1 1 2 2 2 2
+ssbo 0:2 32
+
+compute entrypoint main
+compute 2 1 1
+
+probe ssbo uint 0:2 0  == 2 2 2 2
+probe ssbo uint 0:2 16 == 1 1 1 1
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opselect/vector_element_select.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opselect/vector_element_select.amber
new file mode 100644 (file)
index 0000000..88d6724
--- /dev/null
@@ -0,0 +1,64 @@
+[require]
+VK_KHR_spirv_1_4
+
+[compute shader spirv]
+OpCapability Shader
+OpMemoryModel Logical GLSL450
+OpEntryPoint GLCompute %main "main" %gid_var %sel_var %in_var %out_var
+OpExecutionMode %main LocalSize 1 1 1
+OpDecorate %gid_var BuiltIn GlobalInvocationId
+OpDecorate %rta ArrayStride 16
+OpDecorate %block Block
+OpMemberDecorate %block 0 Offset 0
+OpDecorate %sel_var DescriptorSet 0
+OpDecorate %sel_var Binding 0
+OpDecorate %in_var DescriptorSet 0
+OpDecorate %in_var Binding 1
+OpDecorate %out_var DescriptorSet 0
+OpDecorate %out_var Binding 2
+%void = OpTypeVoid
+%bool = OpTypeBool
+%bool4 = OpTypeVector %bool 4
+%int = OpTypeInt 32 0
+%int_0 = OpConstant %int 0
+%int_1 = OpConstant %int 1
+%int3 = OpTypeVector %int 3
+%int4 = OpTypeVector %int 4
+%int4_0 = OpConstantNull %int4
+%rta = OpTypeRuntimeArray %int4
+%block = OpTypeStruct %rta
+%ptr_input_int3 = OpTypePointer Input %int3
+%gid_var = OpVariable %ptr_input_int3 Input
+%ptr_ssbo_block = OpTypePointer StorageBuffer %block
+%ptr_ssbo_int4 = OpTypePointer StorageBuffer %int4
+%sel_var = OpVariable %ptr_ssbo_block StorageBuffer
+%in_var = OpVariable %ptr_ssbo_block StorageBuffer
+%out_var = OpVariable %ptr_ssbo_block StorageBuffer
+%void_fn = OpTypeFunction %void
+%main = OpFunction %void None %void_fn
+%entry = OpLabel
+%gid = OpLoad %int3 %gid_var
+%gid_x = OpCompositeExtract %int %gid 0
+%in_gep0 = OpAccessChain %ptr_ssbo_int4 %in_var %int_0 %int_0
+%in0 = OpLoad %int4 %in_gep0
+%in_gep1 = OpAccessChain %ptr_ssbo_int4 %in_var %int_0 %int_1
+%in1 = OpLoad %int4 %in_gep1
+%sel_gep = OpAccessChain %ptr_ssbo_int4 %sel_var %int_0 %gid_x
+%sel_ld = OpLoad %int4 %sel_gep
+%eq_0 = OpIEqual %bool4 %sel_ld %int4_0
+%select = OpSelect %int4 %eq_0 %in0 %in1
+%out_gep = OpAccessChain %ptr_ssbo_int4 %out_var %int_0 %gid_x
+OpStore %out_gep %select
+OpReturn
+OpFunctionEnd
+
+[test]
+ssbo 0:0 subdata uint 0 0 1 0 1 1 0 1 0
+ssbo 0:1 subdata uint 0 1 1 1 1 2 2 2 2
+ssbo 0:2 32
+
+compute entrypoint main
+compute 2 1 1
+
+probe ssbo uint 0:2 0  == 1 2 1 2
+probe ssbo uint 0:2 16 == 2 1 2 1
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opselect/wg_pointers_2_select.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opselect/wg_pointers_2_select.amber
new file mode 100644 (file)
index 0000000..52eabd9
--- /dev/null
@@ -0,0 +1,84 @@
+[require]
+VK_KHR_spirv_1_4
+VK_KHR_variable_pointers
+VariablePointerFeatures.variablePointersStorageBuffer
+VariablePointerFeatures.variablePointers
+VK_KHR_get_physical_device_properties2
+
+[compute shader spirv]
+OpCapability Shader
+OpCapability VariablePointers
+OpMemoryModel Logical GLSL450
+OpEntryPoint GLCompute %main "main" %gid_var %sel_var %wg1_var %wg2_var %out_var
+OpExecutionMode %main LocalSize 1 1 1
+OpDecorate %gid_var BuiltIn GlobalInvocationId
+OpMemberDecorate %inner 0 Offset 0
+OpMemberDecorate %inner 1 Offset 4
+OpMemberDecorate %outer 0 Offset 0
+OpMemberDecorate %outer 1 Offset 8
+OpDecorate %rta ArrayStride 4
+OpDecorate %rta_struct ArrayStride 16
+OpDecorate %block Block
+OpMemberDecorate %block 0 Offset 0
+OpDecorate %data_block Block
+OpMemberDecorate %data_block 0 Offset 0
+OpDecorate %sel_var DescriptorSet 0
+OpDecorate %sel_var Binding 0
+OpDecorate %out_var DescriptorSet 0
+OpDecorate %out_var Binding 1
+%void = OpTypeVoid
+%bool = OpTypeBool
+%int = OpTypeInt 32 0
+%int_0 = OpConstant %int 0
+%int_1 = OpConstant %int 1
+%int_2 = OpConstant %int 2
+%int3 = OpTypeVector %int 3
+%inner = OpTypeStruct %int %int
+%outer = OpTypeStruct %inner %inner
+%rta_struct = OpTypeRuntimeArray %outer
+%rta = OpTypeRuntimeArray %int
+%data_block = OpTypeStruct %rta_struct
+%block = OpTypeStruct %rta
+%ptr_input_int3 = OpTypePointer Input %int3
+%gid_var = OpVariable %ptr_input_int3 Input
+%ptr_ssbo_block = OpTypePointer StorageBuffer %block
+%ptr_ssbo_int = OpTypePointer StorageBuffer %int
+%ptr_ssbo_data_block = OpTypePointer StorageBuffer %data_block
+%ptr_ssbo_outer = OpTypePointer StorageBuffer %outer
+%sel_var = OpVariable %ptr_ssbo_block StorageBuffer
+%ptr_wg_outer = OpTypePointer Workgroup %outer
+%wg1_var = OpVariable %ptr_wg_outer Workgroup
+%wg2_var = OpVariable %ptr_wg_outer Workgroup
+%out_var = OpVariable %ptr_ssbo_data_block StorageBuffer
+%inner_const0 = OpConstantComposite %inner %int_1 %int_1
+%inner_const1 = OpConstantComposite %inner %int_2 %int_2
+%outer_const0 = OpConstantComposite %outer %inner_const0 %inner_const0
+%outer_const1 = OpConstantComposite %outer %inner_const1 %inner_const1
+%void_fn = OpTypeFunction %void
+%main = OpFunction %void None %void_fn
+%entry = OpLabel
+%gid = OpLoad %int3 %gid_var
+%gid_x = OpCompositeExtract %int %gid 0
+OpStore %wg1_var %outer_const0
+OpStore %wg2_var %outer_const1
+%sel_gep = OpAccessChain %ptr_ssbo_int %sel_var %int_0 %gid_x
+%sel_val = OpLoad %int %sel_gep
+%eq_0 = OpIEqual %bool %sel_val %int_0
+%select = OpSelect %ptr_wg_outer %eq_0 %wg1_var %wg2_var
+%out_gep = OpAccessChain %ptr_ssbo_outer %out_var %int_0 %gid_x
+%ld = OpLoad %outer %select
+OpStore %out_gep %ld
+OpReturn
+OpFunctionEnd
+
+[test]
+ssbo 0:0 subdata uint 0 1 0
+ssbo 0:1 32
+
+compute entrypoint main
+compute 2 1 1
+
+probe ssbo uint 0:1 0  == 2 2 2 2
+probe ssbo uint 0:1 16 == 1 1 1 1
+
+
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opselect/wg_pointers_select.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/opselect/wg_pointers_select.amber
new file mode 100644 (file)
index 0000000..6731121
--- /dev/null
@@ -0,0 +1,86 @@
+[require]
+VK_KHR_spirv_1_4
+VK_KHR_variable_pointers
+VariablePointerFeatures.variablePointersStorageBuffer
+VariablePointerFeatures.variablePointers
+VK_KHR_get_physical_device_properties2
+
+[compute shader spirv]
+OpCapability Shader
+OpCapability VariablePointers
+OpMemoryModel Logical GLSL450
+OpEntryPoint GLCompute %main "main" %gid_var %sel_var %wg_var %out_var
+OpExecutionMode %main LocalSize 1 1 1
+OpDecorate %gid_var BuiltIn GlobalInvocationId
+OpMemberDecorate %inner 0 Offset 0
+OpMemberDecorate %inner 1 Offset 4
+OpMemberDecorate %outer 0 Offset 0
+OpMemberDecorate %outer 1 Offset 8
+OpDecorate %rta ArrayStride 4
+OpDecorate %rta_struct ArrayStride 16
+OpDecorate %block Block
+OpMemberDecorate %block 0 Offset 0
+OpDecorate %data_block Block
+OpMemberDecorate %data_block 0 Offset 0
+OpDecorate %sel_var DescriptorSet 0
+OpDecorate %sel_var Binding 0
+OpDecorate %out_var DescriptorSet 0
+OpDecorate %out_var Binding 1
+%void = OpTypeVoid
+%bool = OpTypeBool
+%int = OpTypeInt 32 0
+%int_0 = OpConstant %int 0
+%int_1 = OpConstant %int 1
+%int_2 = OpConstant %int 2
+%int3 = OpTypeVector %int 3
+%inner = OpTypeStruct %int %int
+%outer = OpTypeStruct %inner %inner
+%rta_struct = OpTypeRuntimeArray %outer
+%rta = OpTypeRuntimeArray %int
+%data_block = OpTypeStruct %rta_struct
+%block = OpTypeStruct %rta
+%ptr_input_int3 = OpTypePointer Input %int3
+%gid_var = OpVariable %ptr_input_int3 Input
+%ptr_ssbo_block = OpTypePointer StorageBuffer %block
+%ptr_ssbo_int = OpTypePointer StorageBuffer %int
+%ptr_ssbo_data_block = OpTypePointer StorageBuffer %data_block
+%ptr_ssbo_outer = OpTypePointer StorageBuffer %outer
+%wg_data = OpTypeArray %outer %int_2
+%ptr_wg_data = OpTypePointer Workgroup %wg_data
+%ptr_wg_outer = OpTypePointer Workgroup %outer
+%sel_var = OpVariable %ptr_ssbo_block StorageBuffer
+%wg_var = OpVariable %ptr_wg_data Workgroup
+%out_var = OpVariable %ptr_ssbo_data_block StorageBuffer
+%inner_const0 = OpConstantComposite %inner %int_1 %int_1
+%inner_const1 = OpConstantComposite %inner %int_2 %int_2
+%outer_const0 = OpConstantComposite %outer %inner_const0 %inner_const0
+%outer_const1 = OpConstantComposite %outer %inner_const1 %inner_const1
+%void_fn = OpTypeFunction %void
+%main = OpFunction %void None %void_fn
+%entry = OpLabel
+%gid = OpLoad %int3 %gid_var
+%gid_x = OpCompositeExtract %int %gid 0
+%wg_gep0 = OpAccessChain %ptr_wg_outer %wg_var %int_0
+%wg_gep1 = OpAccessChain %ptr_wg_outer %wg_var %int_1
+OpStore %wg_gep0 %outer_const0
+OpStore %wg_gep1 %outer_const1
+%sel_gep = OpAccessChain %ptr_ssbo_int %sel_var %int_0 %gid_x
+%sel_val = OpLoad %int %sel_gep
+%eq_0 = OpIEqual %bool %sel_val %int_0
+%select = OpSelect %ptr_wg_outer %eq_0 %wg_gep0 %wg_gep1
+%out_gep = OpAccessChain %ptr_ssbo_outer %out_var %int_0 %gid_x
+%ld = OpLoad %outer %select
+OpStore %out_gep %ld
+OpReturn
+OpFunctionEnd
+
+[test]
+ssbo 0:0 subdata uint 0 1 0
+ssbo 0:1 32
+
+compute entrypoint main
+compute 2 1 1
+
+probe ssbo uint 0:1 0  == 2 2 2 2
+probe ssbo uint 0:1 16 == 1 1 1 1
+
index 52701bb..12d57ef 100644 (file)
@@ -165,6 +165,8 @@ tcu::TestCaseGroup* createSpirvVersion1p4Group (tcu::TestContext& testCtx)
        spirv1p4Tests->addChild(createTestGroup(testCtx, "opptrdiff", "OpPtrDiff", addTestsForAmberFiles, group));
 
        group = CaseGroup(data_dir, "opptrequal");
+       group.add("different_ssbos_equal", "ptr equal against different SSBO variables", Varptr_full);
+       group.add("different_wgs_equal", "ptr equal against different WG variables", Varptr_full);
        group.add("null_comparisons_ssbo_equal", "ptr equal null in SSBO", Varptr_ssbo);
        group.add("null_comparisons_wg_equal", "ptr equal null in Workgrop", Varptr_full);
        group.add("ssbo_comparisons_equal", "ptr equal in SSBO", Varptr_ssbo);
@@ -177,6 +179,8 @@ tcu::TestCaseGroup* createSpirvVersion1p4Group (tcu::TestContext& testCtx)
        spirv1p4Tests->addChild(createTestGroup(testCtx, "opptrequal", "OpPtrEqual", addTestsForAmberFiles, group));
 
        group = CaseGroup(data_dir, "opptrnotequal");
+       group.add("different_ssbos_not_equal", "ptr not equal against different SSBO variables", Varptr_full);
+       group.add("different_wgs_not_equal", "ptr not equal against different WG variables", Varptr_full);
        group.add("null_comparisons_ssbo_not_equal", "ptr not equal null SSBO", Varptr_ssbo);
        group.add("null_comparisons_wg_not_equal", "ptr not equal null SSBO", Varptr_full);
        group.add("ssbo_comparisons_not_equal", "ptr not equal SSBO", Varptr_ssbo);
@@ -205,6 +209,7 @@ tcu::TestCaseGroup* createSpirvVersion1p4Group (tcu::TestContext& testCtx)
        group = CaseGroup(data_dir, "nonwritable");
        group.add("function_2_nonwritable", "NonWritable decorates Function variables");
        group.add("function_nonwritable", "NonWritable decorates 2 Function variables");
+       group.add("non_main_function_nonwritable", "NonWritable decorates Function variable in non-entrypoint function");
        group.add("private_2_nonwritable", "NonWritable decorates Private variables");
        group.add("private_nonwritable", "NonWritable decorates 2 Private variables");
        spirv1p4Tests->addChild(createTestGroup(testCtx, "nonwritable", "NonWritable decoration", addTestsForAmberFiles, group));
@@ -245,9 +250,18 @@ tcu::TestCaseGroup* createSpirvVersion1p4Group (tcu::TestContext& testCtx)
        spirv1p4Tests->addChild(createTestGroup(testCtx, "loop_control", "SPIR-V 1.4 loop controls", addTestsForAmberFiles, group));
 
        group = CaseGroup(data_dir, "opselect");
+       group.add("array_select", "OpSelect arrays, new in SPIR-V 1.4");
+       group.add("array_stride_select", "OpSelect arrays with non-standard strides, new in SPIR-V 1.4");
+       group.add("nested_array_select", "OpSelect structs with nested arrays, new in SPIR-V 1.4");
+       group.add("nested_struct_select", "OpSelect structs with nested structs, new in SPIR-V 1.4");
        group.add("scalar_select", "OpSelect scalars, verify SPIR-V 1.0");
+       group.add("ssbo_pointers_2_select", "OpSelect SSBO pointers to different buffers, verify SPIR-V 1.0", Varptr_full);
+       group.add("ssbo_pointers_select", "OpSelect SSBO pointers to same buffer, verify SPIR-V 1.0", Varptr_ssbo);
        group.add("struct_select", "OpSelect structs, new in SPIR-V 1.4");
+       group.add("vector_element_select", "OpSelect vector with vector selector, verify SPIR-V 1.0");
        group.add("vector_select", "OpSelect vector with scalar selector, new in SPIR-V 1.4");
+       group.add("wg_pointers_2_select", "OpSelect Workgroup pointers to different buffers, verify SPIR-V 1.0", Varptr_full);
+       group.add("wg_pointers_select", "OpSelect Workgroup pointers to same buffer, verify SPIR-V 1.0", Varptr_full);
        spirv1p4Tests->addChild(createTestGroup(testCtx, "opselect", "SPIR-V 1.4 OpSelect more cases", addTestsForAmberFiles, group));
 
        group = CaseGroup(data_dir, "uconvert");
index 352e442..619df38 100644 (file)
@@ -284557,6 +284557,8 @@ dEQP-VK.spirv_assembly.instruction.spirv1p4.opptrdiff.variable_pointers_vars_ssb
 dEQP-VK.spirv_assembly.instruction.spirv1p4.opptrdiff.variable_pointers_vars_ssbo_diff
 dEQP-VK.spirv_assembly.instruction.spirv1p4.opptrdiff.variable_pointers_vars_wg_diff
 dEQP-VK.spirv_assembly.instruction.spirv1p4.opptrdiff.wg_comparisons_diff
+dEQP-VK.spirv_assembly.instruction.spirv1p4.opptrequal.different_ssbos_equal
+dEQP-VK.spirv_assembly.instruction.spirv1p4.opptrequal.different_wgs_equal
 dEQP-VK.spirv_assembly.instruction.spirv1p4.opptrequal.null_comparisons_ssbo_equal
 dEQP-VK.spirv_assembly.instruction.spirv1p4.opptrequal.null_comparisons_wg_equal
 dEQP-VK.spirv_assembly.instruction.spirv1p4.opptrequal.ssbo_comparisons_equal
@@ -284566,6 +284568,8 @@ dEQP-VK.spirv_assembly.instruction.spirv1p4.opptrequal.variable_pointers_vars_ss
 dEQP-VK.spirv_assembly.instruction.spirv1p4.opptrequal.variable_pointers_vars_wg_equal
 dEQP-VK.spirv_assembly.instruction.spirv1p4.opptrequal.variable_pointers_wg_equal
 dEQP-VK.spirv_assembly.instruction.spirv1p4.opptrequal.wg_comparisons_equal
+dEQP-VK.spirv_assembly.instruction.spirv1p4.opptrnotequal.different_ssbos_not_equal
+dEQP-VK.spirv_assembly.instruction.spirv1p4.opptrnotequal.different_wgs_not_equal
 dEQP-VK.spirv_assembly.instruction.spirv1p4.opptrnotequal.null_comparisons_ssbo_not_equal
 dEQP-VK.spirv_assembly.instruction.spirv1p4.opptrnotequal.null_comparisons_wg_not_equal
 dEQP-VK.spirv_assembly.instruction.spirv1p4.opptrnotequal.ssbo_comparisons_not_equal
@@ -284585,6 +284589,7 @@ dEQP-VK.spirv_assembly.instruction.spirv1p4.uniformid.workgroup_cfg_uniform_id
 dEQP-VK.spirv_assembly.instruction.spirv1p4.uniformid.workgroup_uniform
 dEQP-VK.spirv_assembly.instruction.spirv1p4.nonwritable.function_2_nonwritable
 dEQP-VK.spirv_assembly.instruction.spirv1p4.nonwritable.function_nonwritable
+dEQP-VK.spirv_assembly.instruction.spirv1p4.nonwritable.non_main_function_nonwritable
 dEQP-VK.spirv_assembly.instruction.spirv1p4.nonwritable.private_2_nonwritable
 dEQP-VK.spirv_assembly.instruction.spirv1p4.nonwritable.private_nonwritable
 dEQP-VK.spirv_assembly.instruction.spirv1p4.entrypoint.comp_pc_entry_point
@@ -284613,9 +284618,18 @@ dEQP-VK.spirv_assembly.instruction.spirv1p4.loop_control.max_iterations
 dEQP-VK.spirv_assembly.instruction.spirv1p4.loop_control.min_iterations
 dEQP-VK.spirv_assembly.instruction.spirv1p4.loop_control.partial_count
 dEQP-VK.spirv_assembly.instruction.spirv1p4.loop_control.peel_count
+dEQP-VK.spirv_assembly.instruction.spirv1p4.opselect.array_select
+dEQP-VK.spirv_assembly.instruction.spirv1p4.opselect.array_stride_select
+dEQP-VK.spirv_assembly.instruction.spirv1p4.opselect.nested_array_select
+dEQP-VK.spirv_assembly.instruction.spirv1p4.opselect.nested_struct_select
 dEQP-VK.spirv_assembly.instruction.spirv1p4.opselect.scalar_select
+dEQP-VK.spirv_assembly.instruction.spirv1p4.opselect.ssbo_pointers_2_select
+dEQP-VK.spirv_assembly.instruction.spirv1p4.opselect.ssbo_pointers_select
 dEQP-VK.spirv_assembly.instruction.spirv1p4.opselect.struct_select
+dEQP-VK.spirv_assembly.instruction.spirv1p4.opselect.vector_element_select
 dEQP-VK.spirv_assembly.instruction.spirv1p4.opselect.vector_select
+dEQP-VK.spirv_assembly.instruction.spirv1p4.opselect.wg_pointers_2_select
+dEQP-VK.spirv_assembly.instruction.spirv1p4.opselect.wg_pointers_select
 dEQP-VK.spirv_assembly.instruction.spirv1p4.uconvert.spec_const_opt_extend_16_64_bit
 dEQP-VK.spirv_assembly.instruction.spirv1p4.uconvert.spec_const_opt_extend_16
 dEQP-VK.spirv_assembly.instruction.spirv1p4.uconvert.spec_const_opt_extend_251658240_64_bits
index 0a596d3..adbd2a8 100644 (file)
@@ -284557,6 +284557,8 @@ dEQP-VK.spirv_assembly.instruction.spirv1p4.opptrdiff.variable_pointers_vars_ssb
 dEQP-VK.spirv_assembly.instruction.spirv1p4.opptrdiff.variable_pointers_vars_ssbo_diff
 dEQP-VK.spirv_assembly.instruction.spirv1p4.opptrdiff.variable_pointers_vars_wg_diff
 dEQP-VK.spirv_assembly.instruction.spirv1p4.opptrdiff.wg_comparisons_diff
+dEQP-VK.spirv_assembly.instruction.spirv1p4.opptrequal.different_ssbos_equal
+dEQP-VK.spirv_assembly.instruction.spirv1p4.opptrequal.different_wgs_equal
 dEQP-VK.spirv_assembly.instruction.spirv1p4.opptrequal.null_comparisons_ssbo_equal
 dEQP-VK.spirv_assembly.instruction.spirv1p4.opptrequal.null_comparisons_wg_equal
 dEQP-VK.spirv_assembly.instruction.spirv1p4.opptrequal.ssbo_comparisons_equal
@@ -284566,6 +284568,8 @@ dEQP-VK.spirv_assembly.instruction.spirv1p4.opptrequal.variable_pointers_vars_ss
 dEQP-VK.spirv_assembly.instruction.spirv1p4.opptrequal.variable_pointers_vars_wg_equal
 dEQP-VK.spirv_assembly.instruction.spirv1p4.opptrequal.variable_pointers_wg_equal
 dEQP-VK.spirv_assembly.instruction.spirv1p4.opptrequal.wg_comparisons_equal
+dEQP-VK.spirv_assembly.instruction.spirv1p4.opptrnotequal.different_ssbos_not_equal
+dEQP-VK.spirv_assembly.instruction.spirv1p4.opptrnotequal.different_wgs_not_equal
 dEQP-VK.spirv_assembly.instruction.spirv1p4.opptrnotequal.null_comparisons_ssbo_not_equal
 dEQP-VK.spirv_assembly.instruction.spirv1p4.opptrnotequal.null_comparisons_wg_not_equal
 dEQP-VK.spirv_assembly.instruction.spirv1p4.opptrnotequal.ssbo_comparisons_not_equal
@@ -284585,6 +284589,7 @@ dEQP-VK.spirv_assembly.instruction.spirv1p4.uniformid.workgroup_cfg_uniform_id
 dEQP-VK.spirv_assembly.instruction.spirv1p4.uniformid.workgroup_uniform
 dEQP-VK.spirv_assembly.instruction.spirv1p4.nonwritable.function_2_nonwritable
 dEQP-VK.spirv_assembly.instruction.spirv1p4.nonwritable.function_nonwritable
+dEQP-VK.spirv_assembly.instruction.spirv1p4.nonwritable.non_main_function_nonwritable
 dEQP-VK.spirv_assembly.instruction.spirv1p4.nonwritable.private_2_nonwritable
 dEQP-VK.spirv_assembly.instruction.spirv1p4.nonwritable.private_nonwritable
 dEQP-VK.spirv_assembly.instruction.spirv1p4.entrypoint.comp_pc_entry_point
@@ -284613,9 +284618,18 @@ dEQP-VK.spirv_assembly.instruction.spirv1p4.loop_control.max_iterations
 dEQP-VK.spirv_assembly.instruction.spirv1p4.loop_control.min_iterations
 dEQP-VK.spirv_assembly.instruction.spirv1p4.loop_control.partial_count
 dEQP-VK.spirv_assembly.instruction.spirv1p4.loop_control.peel_count
+dEQP-VK.spirv_assembly.instruction.spirv1p4.opselect.array_select
+dEQP-VK.spirv_assembly.instruction.spirv1p4.opselect.array_stride_select
+dEQP-VK.spirv_assembly.instruction.spirv1p4.opselect.nested_array_select
+dEQP-VK.spirv_assembly.instruction.spirv1p4.opselect.nested_struct_select
 dEQP-VK.spirv_assembly.instruction.spirv1p4.opselect.scalar_select
+dEQP-VK.spirv_assembly.instruction.spirv1p4.opselect.ssbo_pointers_2_select
+dEQP-VK.spirv_assembly.instruction.spirv1p4.opselect.ssbo_pointers_select
 dEQP-VK.spirv_assembly.instruction.spirv1p4.opselect.struct_select
+dEQP-VK.spirv_assembly.instruction.spirv1p4.opselect.vector_element_select
 dEQP-VK.spirv_assembly.instruction.spirv1p4.opselect.vector_select
+dEQP-VK.spirv_assembly.instruction.spirv1p4.opselect.wg_pointers_2_select
+dEQP-VK.spirv_assembly.instruction.spirv1p4.opselect.wg_pointers_select
 dEQP-VK.spirv_assembly.instruction.spirv1p4.uconvert.spec_const_opt_extend_16_64_bit
 dEQP-VK.spirv_assembly.instruction.spirv1p4.uconvert.spec_const_opt_extend_16
 dEQP-VK.spirv_assembly.instruction.spirv1p4.uconvert.spec_const_opt_extend_251658240_64_bits