yes
This commit is contained in:
+110
@@ -0,0 +1,110 @@
|
||||
[require]
|
||||
VK_KHR_spirv_1_4
|
||||
VariablePointerFeatures.variablePointers
|
||||
VariablePointerFeatures.variablePointersStorageBuffer
|
||||
|
||||
[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
|
||||
+105
@@ -0,0 +1,105 @@
|
||||
[require]
|
||||
VK_KHR_spirv_1_4
|
||||
VariablePointerFeatures.variablePointers
|
||||
VariablePointerFeatures.variablePointersStorageBuffer
|
||||
|
||||
[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
|
||||
+86
@@ -0,0 +1,86 @@
|
||||
[require]
|
||||
VK_KHR_spirv_1_4
|
||||
VariablePointerFeatures.variablePointersStorageBuffer
|
||||
|
||||
[compute shader spirv]
|
||||
; This test generates four results.
|
||||
|
||||
; The results are based of OpPtrEqual comparisons of
|
||||
; %ssbo_var vs null.
|
||||
; 0: comparison of %ssbo_var vs null
|
||||
; 1: comparison of SSBO float pointer vs null
|
||||
; 2: comparison of null struct vs null struct
|
||||
; 3: comparison of null float vs null float
|
||||
|
||||
OpCapability Shader
|
||||
OpCapability VariablePointersStorageBuffer
|
||||
OpMemoryModel Logical GLSL450
|
||||
OpEntryPoint GLCompute %main "main" %ssbo_var %out_var
|
||||
OpExecutionMode %main LocalSize 1 1 1
|
||||
|
||||
OpDecorate %ssbo_struct Block
|
||||
OpMemberDecorate %ssbo_struct 0 Offset 0
|
||||
OpDecorate %ssbo_var DescriptorSet 0
|
||||
OpDecorate %ssbo_var Binding 0
|
||||
|
||||
OpDecorate %out_struct Block
|
||||
OpMemberDecorate %out_struct 0 Offset 0
|
||||
OpDecorate %out_var DescriptorSet 0
|
||||
OpDecorate %out_var Binding 1
|
||||
|
||||
%void = OpTypeVoid
|
||||
%bool = OpTypeBool
|
||||
%float = OpTypeFloat 32
|
||||
%int = OpTypeInt 32 0
|
||||
%int4 = OpTypeVector %int 4
|
||||
%int_0 = OpConstant %int 0
|
||||
%int_1 = OpConstant %int 1
|
||||
|
||||
%ssbo_struct = OpTypeStruct %float
|
||||
%ptr_ssbo_struct = OpTypePointer StorageBuffer %ssbo_struct
|
||||
%ssbo_var = OpVariable %ptr_ssbo_struct StorageBuffer
|
||||
%ptr_ssbo_float = OpTypePointer StorageBuffer %float
|
||||
|
||||
%out_struct = OpTypeStruct %int4
|
||||
%ptr_out_struct = OpTypePointer StorageBuffer %out_struct
|
||||
%out_var = OpVariable %ptr_out_struct StorageBuffer
|
||||
%ptr_ssbo_int4 = OpTypePointer StorageBuffer %int4
|
||||
|
||||
%ptr_ssbo_struct_null = OpConstantNull %ptr_ssbo_struct
|
||||
%ptr_ssbo_float_null = OpConstantNull %ptr_ssbo_float
|
||||
%ptr_ssbo_struct_null2 = OpConstantNull %ptr_ssbo_struct
|
||||
%ptr_ssbo_float_null2 = OpConstantNull %ptr_ssbo_float
|
||||
|
||||
%void_fn = OpTypeFunction %void
|
||||
%main = OpFunction %void None %void_fn
|
||||
%entry = OpLabel
|
||||
|
||||
%ssbo_equal = OpPtrEqual %bool %ssbo_var %ptr_ssbo_struct_null
|
||||
%ssbo_equal_int = OpSelect %int %ssbo_equal %int_1 %int_0
|
||||
|
||||
%ssbo_gep_0 = OpAccessChain %ptr_ssbo_float %ssbo_var %int_0
|
||||
%ssbo_equal_0 = OpPtrEqual %bool %ssbo_gep_0 %ptr_ssbo_float_null
|
||||
%ssbo_equal_0_int = OpSelect %int %ssbo_equal_0 %int_1 %int_0
|
||||
|
||||
%null_ssbo_equal = OpPtrEqual %bool %ptr_ssbo_struct_null %ptr_ssbo_struct_null2
|
||||
%null_ssbo_equal_int = OpSelect %int %null_ssbo_equal %int_1 %int_0
|
||||
|
||||
%null_ssbo_equal_0 = OpPtrEqual %bool %ptr_ssbo_float_null %ptr_ssbo_float_null2
|
||||
%null_ssbo_equal_0_int = OpSelect %int %null_ssbo_equal_0 %int_1 %int_0
|
||||
|
||||
%combined = OpCompositeConstruct %int4 %ssbo_equal_int %ssbo_equal_0_int %null_ssbo_equal_int %null_ssbo_equal_0_int
|
||||
%out_gep = OpAccessChain %ptr_ssbo_int4 %out_var %int_0
|
||||
OpStore %out_gep %combined
|
||||
|
||||
OpReturn
|
||||
OpFunctionEnd
|
||||
|
||||
[test]
|
||||
ssbo 0:0 16
|
||||
ssbo 0:1 16
|
||||
|
||||
compute entrypoint main
|
||||
compute 1 1 1
|
||||
|
||||
probe ssbo uvec4 0:1 0 == 0 0 1 1
|
||||
|
||||
+82
@@ -0,0 +1,82 @@
|
||||
[require]
|
||||
VK_KHR_spirv_1_4
|
||||
VariablePointerFeatures.variablePointersStorageBuffer
|
||||
VariablePointerFeatures.variablePointers
|
||||
|
||||
[compute shader spirv]
|
||||
; This generates 4 results for OpPtrEqual
|
||||
|
||||
; The workgroup variable is a struct containing a single float.
|
||||
|
||||
; Results:
|
||||
; 0: comparison of the workgroup var vs null
|
||||
; 1: comparison of the workgroup float vs null
|
||||
; 2: comparison of null struct vs null struct
|
||||
; 3: comparison of null float vs null float
|
||||
|
||||
OpCapability Shader
|
||||
OpCapability VariablePointers
|
||||
OpMemoryModel Logical GLSL450
|
||||
OpEntryPoint GLCompute %main "main" %wg_var %out_var
|
||||
OpExecutionMode %main LocalSize 1 1 1
|
||||
|
||||
OpDecorate %out_struct Block
|
||||
OpMemberDecorate %out_struct 0 Offset 0
|
||||
OpDecorate %out_var DescriptorSet 0
|
||||
OpDecorate %out_var Binding 0
|
||||
|
||||
%void = OpTypeVoid
|
||||
%bool = OpTypeBool
|
||||
%float = OpTypeFloat 32
|
||||
%int = OpTypeInt 32 0
|
||||
%int4 = OpTypeVector %int 4
|
||||
%int_0 = OpConstant %int 0
|
||||
%int_1 = OpConstant %int 1
|
||||
|
||||
%wg_struct = OpTypeStruct %float
|
||||
%ptr_wg_struct = OpTypePointer Workgroup %wg_struct
|
||||
%wg_var = OpVariable %ptr_wg_struct Workgroup
|
||||
%ptr_wg_float = OpTypePointer Workgroup %float
|
||||
|
||||
%out_struct = OpTypeStruct %int4
|
||||
%ptr_out_struct = OpTypePointer StorageBuffer %out_struct
|
||||
%out_var = OpVariable %ptr_out_struct StorageBuffer
|
||||
%ptr_ssbo_int4 = OpTypePointer StorageBuffer %int4
|
||||
|
||||
%ptr_wg_struct_null = OpConstantNull %ptr_wg_struct
|
||||
%ptr_wg_float_null = OpConstantNull %ptr_wg_float
|
||||
%ptr_wg_struct_null2 = OpConstantNull %ptr_wg_struct
|
||||
%ptr_wg_float_null2 = OpConstantNull %ptr_wg_float
|
||||
|
||||
%void_fn = OpTypeFunction %void
|
||||
%main = OpFunction %void None %void_fn
|
||||
%entry = OpLabel
|
||||
|
||||
%wg_equal = OpPtrEqual %bool %wg_var %ptr_wg_struct_null
|
||||
%wg_equal_int = OpSelect %int %wg_equal %int_1 %int_0
|
||||
|
||||
%wg_gep_0 = OpAccessChain %ptr_wg_float %wg_var %int_0
|
||||
%wg_equal_0 = OpPtrEqual %bool %wg_gep_0 %ptr_wg_float_null
|
||||
%wg_equal_0_int = OpSelect %int %wg_equal_0 %int_1 %int_0
|
||||
|
||||
%null_wg_equal = OpPtrEqual %bool %ptr_wg_struct_null %ptr_wg_struct_null2
|
||||
%null_wg_equal_int = OpSelect %int %null_wg_equal %int_1 %int_0
|
||||
|
||||
%null_wg_equal_0 = OpPtrEqual %bool %ptr_wg_float_null %ptr_wg_float_null2
|
||||
%null_wg_equal_0_int = OpSelect %int %null_wg_equal_0 %int_1 %int_0
|
||||
|
||||
%combined = OpCompositeConstruct %int4 %wg_equal_int %wg_equal_0_int %null_wg_equal_int %null_wg_equal_0_int
|
||||
%out_gep = OpAccessChain %ptr_ssbo_int4 %out_var %int_0
|
||||
OpStore %out_gep %combined
|
||||
|
||||
OpReturn
|
||||
OpFunctionEnd
|
||||
|
||||
[test]
|
||||
ssbo 0:0 16
|
||||
|
||||
compute entrypoint main
|
||||
compute 1 1 1
|
||||
|
||||
probe ssbo uvec4 0:0 0 == 0 0 1 1
|
||||
|
||||
+121
@@ -0,0 +1,121 @@
|
||||
[require]
|
||||
VK_KHR_spirv_1_4
|
||||
VariablePointerFeatures.variablePointersStorageBuffer
|
||||
[compute shader spirv]
|
||||
OpCapability Shader
|
||||
OpCapability VariablePointersStorageBuffer
|
||||
OpMemoryModel Logical GLSL450
|
||||
OpEntryPoint GLCompute %main "main" %var1 %var2 %out_var
|
||||
OpExecutionMode %main LocalSize 1 1 1
|
||||
OpDecorate %irta ArrayStride 4
|
||||
OpDecorate %struct Block
|
||||
OpDecorate %out_struct Block
|
||||
OpMemberDecorate %struct 0 ColMajor
|
||||
OpMemberDecorate %struct 0 Offset 0
|
||||
OpMemberDecorate %struct 0 MatrixStride 16
|
||||
OpMemberDecorate %struct 1 RowMajor
|
||||
OpMemberDecorate %struct 1 Offset 64
|
||||
OpMemberDecorate %struct 1 MatrixStride 16
|
||||
OpMemberDecorate %struct 2 Offset 128
|
||||
OpMemberDecorate %struct 3 Offset 132
|
||||
OpMemberDecorate %out_struct 0 Offset 0
|
||||
OpDecorate %var1 DescriptorSet 0
|
||||
OpDecorate %var1 Binding 0
|
||||
OpDecorate %var2 DescriptorSet 0
|
||||
OpDecorate %var2 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
|
||||
%int_3 = OpConstant %int 3
|
||||
%float = OpTypeFloat 32
|
||||
%irta = OpTypeRuntimeArray %int
|
||||
%v4 = OpTypeVector %float 4
|
||||
%mat4v4 = OpTypeMatrix %v4 4
|
||||
%struct = OpTypeStruct %mat4v4 %mat4v4 %float %float
|
||||
%out_struct = OpTypeStruct %irta
|
||||
%ptr_buffer_struct = OpTypePointer StorageBuffer %struct
|
||||
%out_ptr_buffer_struct = OpTypePointer StorageBuffer %out_struct
|
||||
%ptr_mat4v4 = OpTypePointer StorageBuffer %mat4v4
|
||||
%ptr_buffer_int = OpTypePointer StorageBuffer %int
|
||||
%ptr_buffer_float = OpTypePointer StorageBuffer %float
|
||||
%ptr_v4 = OpTypePointer StorageBuffer %v4
|
||||
%var1 = OpVariable %ptr_buffer_struct StorageBuffer
|
||||
%var2 = OpVariable %ptr_buffer_struct StorageBuffer
|
||||
%out_var = OpVariable %out_ptr_buffer_struct StorageBuffer
|
||||
%void_fn = OpTypeFunction %void
|
||||
%main = OpFunction %void None %void_fn
|
||||
%entry = OpLabel
|
||||
%out_idx0 = OpCopyObject %int %int_0
|
||||
; var 1 float 1
|
||||
%var1_float_1 = OpAccessChain %ptr_buffer_float %var1 %int_2
|
||||
; var 1 float 2
|
||||
%var1_float_2 = OpAccessChain %ptr_buffer_float %var1 %int_3
|
||||
; var 2 float 1
|
||||
%var2_float_1 = OpAccessChain %ptr_buffer_float %var2 %int_2
|
||||
; var 2 float 2
|
||||
%var2_float_2 = OpAccessChain %ptr_buffer_float %var2 %int_3
|
||||
; var 1 matrix 1
|
||||
%var1_mat_1 = OpAccessChain %ptr_mat4v4 %var1 %int_0
|
||||
; var 1 matrix 2
|
||||
%var1_mat_2 = OpAccessChain %ptr_mat4v4 %var1 %int_1
|
||||
; var 1 matrix 1 column 1
|
||||
%var1_mat_1_0 = OpAccessChain %ptr_v4 %var1 %int_0 %int_0
|
||||
; var 1 matrix 1 column 2
|
||||
%var1_mat_1_1 = OpAccessChain %ptr_v4 %var1 %int_0 %int_1
|
||||
; var 1 matrix first member
|
||||
%var1_mat_1_0_0 = OpAccessChain %ptr_buffer_float %var1 %int_0 %int_0 %int_0
|
||||
; Two different members of a same uniform blocks
|
||||
%var1_float_1_eq_var1_float_2 = OpPtrEqual %bool %var1_float_1 %var1_float_2
|
||||
%var1_float_1_eq_var1_float_2_sel = OpSelect %int %var1_float_1_eq_var1_float_2 %int_0 %int_1
|
||||
%out_gep1 = OpAccessChain %ptr_buffer_int %out_var %int_0 %out_idx0
|
||||
%out_idx1 = OpIAdd %int %out_idx0 %int_1
|
||||
OpStore %out_gep1 %var1_float_1_eq_var1_float_2_sel
|
||||
; The same member in two separate uniform blocks
|
||||
%var1_float_1_eq_var2_float_1 = OpPtrEqual %bool %var1_float_1 %var2_float_1
|
||||
%var1_float_1_eq_var2_float_1_sel = OpSelect %int %var1_float_1_eq_var2_float_1 %int_0 %int_1
|
||||
%out_gep2 = OpAccessChain %ptr_buffer_int %out_var %int_0 %out_idx1
|
||||
%out_idx2 = OpIAdd %int %out_idx1 %int_1
|
||||
OpStore %out_gep2 %var1_float_1_eq_var2_float_1_sel
|
||||
; Variable pointer and one non-variable pointer
|
||||
%var1_float_1_var1_float_2_sel = OpSelect %ptr_buffer_float %var1_float_1_eq_var2_float_1 %var1_float_1 %var1_float_2
|
||||
%var2_float_1_var2_float_2_sel = OpSelect %ptr_buffer_float %var1_float_1_eq_var2_float_1 %var2_float_1 %var2_float_2
|
||||
%var1_float_1_var1_float_2_sel_eq_var2_float_1_var2_float_2_sel = OpPtrEqual %bool %var1_float_1_var1_float_2_sel %var2_float_1_var2_float_2_sel
|
||||
%var1_float_1_var1_float_2_sel_eq_var2_float_1_var2_float_2_sel_sel = OpSelect %int %var1_float_1_var1_float_2_sel_eq_var2_float_1_var2_float_2_sel %int_0 %int_1
|
||||
%out_gep3 = OpAccessChain %ptr_buffer_int %out_var %int_0 %out_idx2
|
||||
%out_idx3 = OpIAdd %int %out_idx2 %int_1
|
||||
OpStore %out_gep3 %var1_float_1_var1_float_2_sel_eq_var2_float_1_var2_float_2_sel_sel
|
||||
; Variable pointer and first member of matrices
|
||||
%var1_float_1_var1_float_2_sel_2 = OpSelect %ptr_buffer_float %var1_float_1_var1_float_2_sel_eq_var2_float_1_var2_float_2_sel %var1_float_1 %var1_float_2
|
||||
%var1_float_1_var1_float_2_sel_2_eq_var1_mat_1_0_0 = OpPtrEqual %bool %var1_float_1_var1_float_2_sel_2 %var1_mat_1_0_0
|
||||
%var1_float_1_var1_float_2_sel_2_eq_var1_mat_1_0_0_sel = OpSelect %int %var1_float_1_var1_float_2_sel_2_eq_var1_mat_1_0_0 %int_0 %int_1
|
||||
%out_gep4 = OpAccessChain %ptr_buffer_int %out_var %int_0 %out_idx3
|
||||
%out_idx4 = OpIAdd %int %out_idx3 %int_1
|
||||
OpStore %out_gep4 %var1_float_1_var1_float_2_sel_2_eq_var1_mat_1_0_0_sel
|
||||
; Matrices of the same uniform blocks
|
||||
%var1_mat_1_eq_var1_mat_2 = OpPtrEqual %bool %var1_mat_1 %var1_mat_2
|
||||
%var1_mat_1_eq_var1_mat_2_sel = OpSelect %int %var1_mat_1_eq_var1_mat_2 %int_0 %int_1
|
||||
%out_gep5 = OpAccessChain %ptr_buffer_int %out_var %int_0 %out_idx4
|
||||
%out_idx5 = OpIAdd %int %out_idx4 %int_1
|
||||
OpStore %out_gep5 %var1_mat_1_eq_var1_mat_2_sel
|
||||
; Pointers to individual columns of row-major matrices
|
||||
%var1_mat_1_0_eq_var1_mat_1_1 = OpPtrEqual %bool %var1_mat_1_0 %var1_mat_1_1
|
||||
%var1_mat_1_0_eq_var1_mat_1_1_sel = OpSelect %int %var1_mat_1_0_eq_var1_mat_1_1 %int_0 %int_1
|
||||
%out_gep6 = OpAccessChain %ptr_buffer_int %out_var %int_0 %out_idx5
|
||||
%out_idx6 = OpIAdd %int %out_idx5 %int_1
|
||||
OpStore %out_gep6 %var1_mat_1_0_eq_var1_mat_1_1_sel
|
||||
OpReturn
|
||||
OpFunctionEnd
|
||||
[test]
|
||||
ssbo 0:0 136
|
||||
ssbo 0:1 136
|
||||
ssbo 0:2 24
|
||||
|
||||
compute entrypoint main
|
||||
compute 1 1 1
|
||||
|
||||
probe ssbo int 0:2 0 == 1 1 1 1 1 1
|
||||
+174
@@ -0,0 +1,174 @@
|
||||
[require]
|
||||
VK_KHR_spirv_1_4
|
||||
VariablePointerFeatures.variablePointersStorageBuffer
|
||||
|
||||
[compute shader spirv]
|
||||
; Test operates on a SSBO (%in_var) containing a runtime array of an array of four ints.
|
||||
; Size of the runtime array is passed another SSBO (%n_var).
|
||||
|
||||
; Each invocation writes out the result of OpPtrEqual
|
||||
; for elements of the input runtime array to index 16 of the corresponding output
|
||||
; variable. Pointers are based the gid'th element vs the zero'th element.
|
||||
|
||||
; Each invocation loops 4 times and writes out results each for
|
||||
; OpPtrEqual. The pointers are the lid'th element of gid'th element of
|
||||
; the runtime array vs the iteration count element of the gid'th element of
|
||||
; the runtime array.
|
||||
|
||||
OpCapability Shader
|
||||
OpCapability VariablePointersStorageBuffer
|
||||
OpMemoryModel Logical GLSL450
|
||||
OpEntryPoint GLCompute %main "main" %in_var %equal_var %n_var %lid_var %gid_var
|
||||
OpExecutionMode %main LocalSize 4 1 1
|
||||
|
||||
OpDecorate %struct_4 Block
|
||||
OpMemberDecorate %struct_4 0 Offset 0
|
||||
OpDecorate %runtime_4 ArrayStride 16
|
||||
OpDecorate %struct_17 Block
|
||||
OpMemberDecorate %struct_17 0 Offset 0
|
||||
OpDecorate %runtime_17 ArrayStride 68
|
||||
OpDecorate %n_struct Block
|
||||
OpMemberDecorate %n_struct 0 Offset 0
|
||||
OpDecorate %array_4 ArrayStride 4
|
||||
OpDecorate %array_17 ArrayStride 4
|
||||
|
||||
OpDecorate %in_var DescriptorSet 0
|
||||
OpDecorate %in_var Binding 0
|
||||
OpDecorate %equal_var DescriptorSet 0
|
||||
OpDecorate %equal_var Binding 1
|
||||
OpDecorate %n_var DescriptorSet 0
|
||||
OpDecorate %n_var Binding 2
|
||||
|
||||
OpDecorate %lid_var BuiltIn LocalInvocationId
|
||||
OpDecorate %gid_var BuiltIn WorkgroupId
|
||||
|
||||
%void = OpTypeVoid
|
||||
%bool = OpTypeBool
|
||||
%int = OpTypeInt 32 1
|
||||
%int_0 = OpConstant %int 0
|
||||
%int_1 = OpConstant %int 1
|
||||
%int_4 = OpConstant %int 4
|
||||
%int_16 = OpConstant %int 16
|
||||
%int_17 = OpConstant %int 17
|
||||
%int3 = OpTypeVector %int 3
|
||||
|
||||
%ptr_input_int3 = OpTypePointer Input %int3
|
||||
|
||||
%array_4 = OpTypeArray %int %int_4
|
||||
%runtime_4 = OpTypeRuntimeArray %array_4
|
||||
%struct_4 = OpTypeStruct %runtime_4
|
||||
%ptr_struct_4 = OpTypePointer StorageBuffer %struct_4
|
||||
%ptr_array_4 = OpTypePointer StorageBuffer %array_4
|
||||
|
||||
%array_17 = OpTypeArray %int %int_17
|
||||
%runtime_17 = OpTypeRuntimeArray %array_17
|
||||
%struct_17 = OpTypeStruct %runtime_17
|
||||
%ptr_struct_17 = OpTypePointer StorageBuffer %struct_17
|
||||
%ptr_array_17 = OpTypePointer StorageBuffer %array_17
|
||||
|
||||
%ptr_int = OpTypePointer StorageBuffer %int
|
||||
%n_struct = OpTypeStruct %int
|
||||
%ptr_n_struct = OpTypePointer Uniform %n_struct
|
||||
%ptr_n = OpTypePointer Uniform %int
|
||||
|
||||
%in_var = OpVariable %ptr_struct_4 StorageBuffer
|
||||
%equal_var = OpVariable %ptr_struct_17 StorageBuffer
|
||||
%n_var = OpVariable %ptr_n_struct Uniform
|
||||
%lid_var = OpVariable %ptr_input_int3 Input
|
||||
%gid_var = OpVariable %ptr_input_int3 Input
|
||||
|
||||
%void_fn = OpTypeFunction %void
|
||||
%main = OpFunction %void None %void_fn
|
||||
%entry = OpLabel
|
||||
%n_gep = OpAccessChain %ptr_n %n_var %int_0
|
||||
%n = OpLoad %int %n_gep
|
||||
%gid = OpLoad %int3 %gid_var
|
||||
%gid_x = OpCompositeExtract %int %gid 0
|
||||
%lid = OpLoad %int3 %lid_var
|
||||
%lid_x = OpCompositeExtract %int %lid 0
|
||||
%array_gep_0 = OpAccessChain %ptr_array_4 %in_var %int_0 %int_0
|
||||
%array_gep = OpAccessChain %ptr_array_4 %in_var %int_0 %gid_x
|
||||
%cmp_gid = OpSGreaterThanEqual %bool %gid_x %n
|
||||
OpSelectionMerge %body None
|
||||
OpBranchConditional %cmp_gid %ret %body
|
||||
|
||||
%ret = OpLabel
|
||||
OpReturn
|
||||
|
||||
%body = OpLabel
|
||||
%cmp_lid = OpIEqual %bool %lid_x %int_1
|
||||
OpSelectionMerge %loop None
|
||||
OpBranchConditional %cmp_lid %then %loop
|
||||
|
||||
%then = OpLabel
|
||||
; Compute results for outer array
|
||||
%large_equal = OpPtrEqual %bool %array_gep %array_gep_0
|
||||
%large_equal_gep = OpAccessChain %ptr_int %equal_var %int_0 %gid_x %int_16
|
||||
%large_equal_int = OpSelect %int %large_equal %int_1 %int_0
|
||||
OpStore %large_equal_gep %large_equal_int
|
||||
;
|
||||
OpBranch %loop
|
||||
|
||||
%loop = OpLabel
|
||||
%i = OpPhi %int %int_0 %body %int_0 %then %inc_i %loop
|
||||
%inc_i = OpIAdd %int %i %int_1
|
||||
%i_cmp = OpIEqual %bool %inc_i %int_4
|
||||
%lid_offset = OpIMul %int %lid_x %int_4
|
||||
%gep_offset = OpIAdd %int %lid_offset %i
|
||||
; Compute results for inner array
|
||||
%ref_gep = OpAccessChain %ptr_int %array_gep %lid_x
|
||||
%cmp_gep = OpAccessChain %ptr_int %array_gep %i
|
||||
%equal = OpPtrEqual %bool %ref_gep %cmp_gep
|
||||
%equal_int = OpSelect %int %equal %int_1 %int_0
|
||||
%equal_gep = OpAccessChain %ptr_int %equal_var %int_0 %gid_x %gep_offset
|
||||
OpStore %equal_gep %equal_int
|
||||
;
|
||||
OpLoopMerge %exit %loop None
|
||||
OpBranchConditional %i_cmp %exit %loop
|
||||
|
||||
%exit = OpLabel
|
||||
OpReturn
|
||||
OpFunctionEnd
|
||||
|
||||
[test]
|
||||
ssbo 0:0 2048
|
||||
ssbo 0:1 2176
|
||||
uniform ubo 0:2 int 0 32
|
||||
|
||||
compute entrypoint main
|
||||
compute 32 1 1
|
||||
|
||||
|
||||
#equal var
|
||||
probe ssbo int 0:1 0 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 1
|
||||
probe ssbo int 0:1 68 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
|
||||
probe ssbo int 0:1 136 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
|
||||
probe ssbo int 0:1 204 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
|
||||
probe ssbo int 0:1 272 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
|
||||
probe ssbo int 0:1 340 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
|
||||
probe ssbo int 0:1 408 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
|
||||
probe ssbo int 0:1 476 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
|
||||
probe ssbo int 0:1 544 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
|
||||
probe ssbo int 0:1 612 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
|
||||
probe ssbo int 0:1 680 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
|
||||
probe ssbo int 0:1 748 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
|
||||
probe ssbo int 0:1 816 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
|
||||
probe ssbo int 0:1 884 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
|
||||
probe ssbo int 0:1 952 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
|
||||
probe ssbo int 0:1 1020 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
|
||||
probe ssbo int 0:1 1088 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
|
||||
probe ssbo int 0:1 1156 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
|
||||
probe ssbo int 0:1 1224 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
|
||||
probe ssbo int 0:1 1292 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
|
||||
probe ssbo int 0:1 1360 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
|
||||
probe ssbo int 0:1 1428 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
|
||||
probe ssbo int 0:1 1496 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
|
||||
probe ssbo int 0:1 1564 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
|
||||
probe ssbo int 0:1 1632 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
|
||||
probe ssbo int 0:1 1700 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
|
||||
probe ssbo int 0:1 1768 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
|
||||
probe ssbo int 0:1 1836 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
|
||||
probe ssbo int 0:1 1904 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
|
||||
probe ssbo int 0:1 1972 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
|
||||
probe ssbo int 0:1 2040 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
|
||||
probe ssbo int 0:1 2108 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
|
||||
+130
@@ -0,0 +1,130 @@
|
||||
[require]
|
||||
VK_KHR_spirv_1_4
|
||||
VariablePointerFeatures.variablePointersStorageBuffer
|
||||
VariablePointerFeatures.variablePointers
|
||||
|
||||
[compute shader spirv]
|
||||
; Tests pointer comparisons with variable pointers
|
||||
|
||||
; Stores an array of pointers in Function storage class that point into input
|
||||
; SSBO. Each iteration produces an OpPtrEqual comparison. Pointers evolve by
|
||||
; incrementing or decrementing by 1 each iteration (overall ratio is 2:1).
|
||||
|
||||
OpCapability Shader
|
||||
OpCapability VariablePointers
|
||||
OpMemoryModel Logical GLSL450
|
||||
OpEntryPoint GLCompute %main "main" %in_var %out_var
|
||||
OpExecutionMode %main LocalSize 1 1 1
|
||||
|
||||
OpDecorate %int_rta ArrayStride 4
|
||||
OpDecorate %in_struct Block
|
||||
OpMemberDecorate %in_struct 0 Offset 0
|
||||
OpMemberDecorate %in_struct 1 Offset 4
|
||||
OpDecorate %in_var DescriptorSet 0
|
||||
OpDecorate %in_var Binding 0
|
||||
|
||||
OpDecorate %out_struct Block
|
||||
OpMemberDecorate %out_struct 0 Offset 0
|
||||
OpDecorate %out_var DescriptorSet 0
|
||||
OpDecorate %out_var Binding 1
|
||||
|
||||
OpDecorate %ptr_ssbo_int ArrayStride 4
|
||||
|
||||
%void = OpTypeVoid
|
||||
%bool = OpTypeBool
|
||||
%uint = OpTypeInt 32 0
|
||||
%int = OpTypeInt 32 1
|
||||
%int_n1 = OpConstant %int -1
|
||||
%int_0 = OpConstant %int 0
|
||||
%int_1 = OpConstant %int 1
|
||||
%int_2 = OpConstant %int 2
|
||||
%int_3 = OpConstant %int 3
|
||||
|
||||
%int_rta = OpTypeRuntimeArray %int
|
||||
%in_struct = OpTypeStruct %int %int_rta
|
||||
%ptr_ssbo_in_struct = OpTypePointer StorageBuffer %in_struct
|
||||
%in_var = OpVariable %ptr_ssbo_in_struct StorageBuffer
|
||||
|
||||
%out_struct = OpTypeStruct %int_rta
|
||||
%ptr_ssbo_out_struct = OpTypePointer StorageBuffer %out_struct
|
||||
%out_var = OpVariable %ptr_ssbo_out_struct StorageBuffer
|
||||
|
||||
%ptr_ssbo_int = OpTypePointer StorageBuffer %int
|
||||
%array_ptr = OpTypeArray %ptr_ssbo_int %int_2
|
||||
%ptr_ptr = OpTypePointer Function %array_ptr
|
||||
%ptr_func_ptr = OpTypePointer Function %ptr_ssbo_int
|
||||
|
||||
%ptr_ssbo_n = OpTypePointer StorageBuffer %int
|
||||
%void_fn = OpTypeFunction %void
|
||||
%main = OpFunction %void None %void_fn
|
||||
%entry = OpLabel
|
||||
%var = OpVariable %ptr_ptr Function
|
||||
%n_gep = OpAccessChain %ptr_ssbo_n %in_var %int_0
|
||||
%n = OpLoad %int %n_gep
|
||||
%length = OpArrayLength %uint %in_var 1
|
||||
%length_div_2 = OpSDiv %int %length %int_2
|
||||
%mid_gep = OpAccessChain %ptr_ssbo_int %in_var %int_1 %length_div_2
|
||||
%func_gep_0 = OpAccessChain %ptr_func_ptr %var %int_0
|
||||
%func_gep_1 = OpAccessChain %ptr_func_ptr %var %int_1
|
||||
OpStore %func_gep_0 %mid_gep
|
||||
OpStore %func_gep_1 %mid_gep
|
||||
%cmp_n = OpSLessThanEqual %bool %n %int_0
|
||||
OpSelectionMerge %exit None
|
||||
OpBranchConditional %cmp_n %exit %loop
|
||||
|
||||
%loop = OpLabel
|
||||
%i = OpPhi %int %int_0 %entry %inc_i %continue
|
||||
%gep_0 = OpLoad %ptr_ssbo_int %func_gep_0
|
||||
%gep_1 = OpLoad %ptr_ssbo_int %func_gep_1
|
||||
%inc_i = OpIAdd %int %i %int_1
|
||||
|
||||
%equal = OpPtrEqual %bool %gep_0 %gep_1
|
||||
%equal_int = OpSelect %int %equal %int_1 %int_0
|
||||
%out_gep = OpAccessChain %ptr_ssbo_int %out_var %int_0 %i
|
||||
OpStore %out_gep %equal_int
|
||||
|
||||
OpLoopMerge %loop_exit %continue None
|
||||
OpBranch %body
|
||||
|
||||
%body = OpLabel
|
||||
%i_mod_3 = OpSMod %int %i %int_3
|
||||
%cmp_vs_0 = OpIEqual %bool %i_mod_3 %int_0
|
||||
OpSelectionMerge %if_merge None
|
||||
OpBranchConditional %cmp_vs_0 %then %else
|
||||
|
||||
%then = OpLabel
|
||||
%then_0_next = OpPtrAccessChain %ptr_ssbo_int %gep_0 %int_n1
|
||||
%then_1_next = OpPtrAccessChain %ptr_ssbo_int %gep_1 %int_1
|
||||
OpBranch %if_merge
|
||||
%else = OpLabel
|
||||
%else_0_next = OpPtrAccessChain %ptr_ssbo_int %gep_0 %int_1
|
||||
%else_1_next = OpPtrAccessChain %ptr_ssbo_int %gep_1 %int_n1
|
||||
OpBranch %if_merge
|
||||
|
||||
%if_merge = OpLabel
|
||||
%next_0 = OpPhi %ptr_ssbo_int %then_0_next %then %else_0_next %else
|
||||
%next_1 = OpPhi %ptr_ssbo_int %then_1_next %then %else_1_next %else
|
||||
OpBranch %continue
|
||||
|
||||
%continue = OpLabel
|
||||
OpStore %func_gep_0 %next_0
|
||||
OpStore %func_gep_1 %next_1
|
||||
%cmp = OpSGreaterThanEqual %bool %i %n
|
||||
OpBranchConditional %cmp %loop_exit %loop
|
||||
|
||||
%loop_exit = OpLabel
|
||||
OpBranch %exit
|
||||
%exit = OpLabel
|
||||
OpReturn
|
||||
OpFunctionEnd
|
||||
|
||||
[test]
|
||||
ssbo 0:0 68
|
||||
ssbo 0:0 subdata uint 0 16
|
||||
ssbo 0:1 64
|
||||
|
||||
compute entrypoint main
|
||||
compute 1 1 1
|
||||
|
||||
probe ssbo uint 0:1 0 == 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0
|
||||
|
||||
+110
@@ -0,0 +1,110 @@
|
||||
[require]
|
||||
VK_KHR_spirv_1_4
|
||||
VariablePointerFeatures.variablePointersStorageBuffer
|
||||
|
||||
[compute shader spirv]
|
||||
; This test generates four results per iteration of the loop. The loop is executed %n times.
|
||||
|
||||
; Each iteration generates a result for OpPtrEqual. One
|
||||
; pointer is an iterator through the input SSBO (%in_var) and the other is a
|
||||
; selection between the iterator, null or the 0'th index pointer depending on
|
||||
; the value of the iterator mod 3.
|
||||
|
||||
OpCapability Shader
|
||||
OpCapability VariablePointersStorageBuffer
|
||||
OpMemoryModel Logical GLSL450
|
||||
OpEntryPoint GLCompute %main "main" %in_var %out_var
|
||||
OpExecutionMode %main LocalSize 1 1 1
|
||||
|
||||
OpDecorate %int_rta ArrayStride 4
|
||||
OpDecorate %ptr_ssbo_int ArrayStride 4
|
||||
|
||||
OpDecorate %in_struct Block
|
||||
OpMemberDecorate %in_struct 0 Offset 0
|
||||
OpMemberDecorate %in_struct 1 Offset 4
|
||||
OpDecorate %in_var DescriptorSet 0
|
||||
OpDecorate %in_var Binding 0
|
||||
|
||||
OpDecorate %out_struct Block
|
||||
OpMemberDecorate %out_struct 0 Offset 0
|
||||
OpDecorate %out_var DescriptorSet 0
|
||||
OpDecorate %out_var Binding 1
|
||||
|
||||
%void = OpTypeVoid
|
||||
%bool = OpTypeBool
|
||||
%int = OpTypeInt 32 1
|
||||
%int_0 = OpConstant %int 0
|
||||
%int_1 = OpConstant %int 1
|
||||
%int_2 = OpConstant %int 2
|
||||
%int_3 = OpConstant %int 3
|
||||
%int2 = OpTypeVector %int 2
|
||||
%int_rta = OpTypeRuntimeArray %int
|
||||
%int2_rta = OpTypeRuntimeArray %int2
|
||||
|
||||
%in_struct = OpTypeStruct %int %int_rta
|
||||
%ptr_ssbo_in_struct = OpTypePointer StorageBuffer %in_struct
|
||||
%in_var = OpVariable %ptr_ssbo_in_struct StorageBuffer
|
||||
|
||||
%out_struct = OpTypeStruct %int_rta
|
||||
%ptr_ssbo_out_struct = OpTypePointer StorageBuffer %out_struct
|
||||
%out_var = OpVariable %ptr_ssbo_out_struct StorageBuffer
|
||||
|
||||
%ptr_ssbo_int = OpTypePointer StorageBuffer %int
|
||||
%ptr_ssbo_int_null = OpConstantNull %ptr_ssbo_int
|
||||
%ptr_ssbo_n = OpTypePointer StorageBuffer %int
|
||||
%ptr_ssbo_int2 = OpTypePointer StorageBuffer %int2
|
||||
%void_fn = OpTypeFunction %void
|
||||
%ptr_return_fn = OpTypeFunction %ptr_ssbo_int %ptr_ssbo_int %ptr_ssbo_int %int
|
||||
%main = OpFunction %void None %void_fn
|
||||
%entry = OpLabel
|
||||
%n_gep = OpAccessChain %ptr_ssbo_n %in_var %int_0
|
||||
%n = OpLoad %int %n_gep
|
||||
%base_ssbo_gep = OpAccessChain %ptr_ssbo_int %in_var %int_1 %int_0
|
||||
%n_leq_0 = OpSLessThanEqual %bool %n %int_0
|
||||
OpSelectionMerge %exit None
|
||||
OpBranchConditional %n_leq_0 %exit %loop
|
||||
|
||||
%loop = OpLabel
|
||||
%i = OpPhi %int %int_0 %entry %inc_i %loop
|
||||
%ssbo_gep = OpPhi %ptr_ssbo_int %base_ssbo_gep %entry %next_ssbo_gep %loop
|
||||
%inc_i = OpIAdd %int %i %int_1
|
||||
%next_ssbo_gep = OpPtrAccessChain %ptr_ssbo_int %ssbo_gep %int_1
|
||||
|
||||
%ptr_call = OpFunctionCall %ptr_ssbo_int %gep_func %ssbo_gep %base_ssbo_gep %i
|
||||
%equal = OpPtrEqual %bool %ssbo_gep %ptr_call
|
||||
%equal_int = OpSelect %int %equal %int_1 %int_0
|
||||
%out_gep = OpAccessChain %ptr_ssbo_int %out_var %int_0 %i
|
||||
OpStore %out_gep %equal_int
|
||||
|
||||
%cmp = OpSGreaterThanEqual %bool %i %n
|
||||
OpLoopMerge %loop_exit %loop None
|
||||
OpBranchConditional %cmp %loop_exit %loop
|
||||
|
||||
%loop_exit = OpLabel
|
||||
OpBranch %exit
|
||||
%exit = OpLabel
|
||||
OpReturn
|
||||
OpFunctionEnd
|
||||
|
||||
%gep_func = OpFunction %ptr_ssbo_int None %ptr_return_fn
|
||||
%param_ptr = OpFunctionParameter %ptr_ssbo_int
|
||||
%param_alt_ptr = OpFunctionParameter %ptr_ssbo_int
|
||||
%param_i = OpFunctionParameter %int
|
||||
%1 = OpLabel
|
||||
%i_mod_3 = OpSMod %int %param_i %int_3
|
||||
%i_mod_3_is_0 = OpIEqual %bool %i_mod_3 %int_0
|
||||
%i_mod_3_is_1 = OpIEqual %bool %i_mod_3 %int_1
|
||||
%ssbo_gep1 = OpSelect %ptr_ssbo_int %i_mod_3_is_0 %param_alt_ptr %ptr_ssbo_int_null
|
||||
%ssbo_gep2 = OpSelect %ptr_ssbo_int %i_mod_3_is_1 %param_ptr %ssbo_gep1
|
||||
OpReturnValue %ssbo_gep2
|
||||
OpFunctionEnd
|
||||
|
||||
[test]
|
||||
ssbo 0:0 132
|
||||
ssbo 0:0 subdata int 0 33
|
||||
ssbo 0:1 132
|
||||
|
||||
compute entrypoint main
|
||||
compute 1 1 1
|
||||
|
||||
probe ssbo int 0:1 0 == 1 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0
|
||||
+136
@@ -0,0 +1,136 @@
|
||||
[require]
|
||||
VK_KHR_spirv_1_4
|
||||
VariablePointerFeatures.variablePointersStorageBuffer
|
||||
|
||||
[compute shader spirv]
|
||||
; Tests use of private variables holding SSBO pointers and pointer comparisons.
|
||||
|
||||
; Two iterators are each stored in Private variables: one moves forward, one
|
||||
; moves backward. In each iteration an OpPtrEqual comparison is written.
|
||||
; Iterators are then moved forward (or backward respectively) one index.
|
||||
|
||||
OpCapability Shader
|
||||
OpCapability VariablePointersStorageBuffer
|
||||
OpMemoryModel Logical GLSL450
|
||||
OpEntryPoint GLCompute %main "main" %in_var %out_var %forward_var %backward_var
|
||||
OpExecutionMode %main LocalSize 1 1 1
|
||||
|
||||
OpDecorate %int_rta ArrayStride 4
|
||||
OpDecorate %in_struct Block
|
||||
OpMemberDecorate %in_struct 0 Offset 0
|
||||
OpMemberDecorate %in_struct 1 Offset 4
|
||||
OpDecorate %in_var DescriptorSet 0
|
||||
OpDecorate %in_var Binding 0
|
||||
|
||||
OpDecorate %out_struct Block
|
||||
OpMemberDecorate %out_struct 0 Offset 0
|
||||
OpDecorate %out_var DescriptorSet 0
|
||||
OpDecorate %out_var Binding 1
|
||||
|
||||
OpDecorate %ptr_ssbo_int ArrayStride 4
|
||||
|
||||
%void = OpTypeVoid
|
||||
%bool = OpTypeBool
|
||||
%int = OpTypeInt 32 1
|
||||
%int_n1 = OpConstant %int -1
|
||||
%int_0 = OpConstant %int 0
|
||||
%int_1 = OpConstant %int 1
|
||||
%int_2 = OpConstant %int 2
|
||||
%int_3 = OpConstant %int 3
|
||||
|
||||
%int_rta = OpTypeRuntimeArray %int
|
||||
%in_struct = OpTypeStruct %int %int_rta
|
||||
%ptr_ssbo_in_struct = OpTypePointer StorageBuffer %in_struct
|
||||
%in_var = OpVariable %ptr_ssbo_in_struct StorageBuffer
|
||||
|
||||
%out_struct = OpTypeStruct %int_rta
|
||||
%ptr_ssbo_out_struct = OpTypePointer StorageBuffer %out_struct
|
||||
%out_var = OpVariable %ptr_ssbo_out_struct StorageBuffer
|
||||
|
||||
%ptr_ssbo_int = OpTypePointer StorageBuffer %int
|
||||
%ptr_ptr = OpTypePointer Private %ptr_ssbo_int
|
||||
%forward_var = OpVariable %ptr_ptr Private
|
||||
%backward_var = OpVariable %ptr_ptr Private
|
||||
|
||||
%ptr_ssbo_n = OpTypePointer StorageBuffer %int
|
||||
%void_fn = OpTypeFunction %void
|
||||
%main = OpFunction %void None %void_fn
|
||||
%entry = OpLabel
|
||||
%n_gep = OpAccessChain %ptr_ssbo_n %in_var %int_0
|
||||
%n = OpLoad %int %n_gep
|
||||
%first_gep = OpAccessChain %ptr_ssbo_int %in_var %int_1 %int_0
|
||||
OpStore %forward_var %first_gep
|
||||
%last_gep = OpPtrAccessChain %ptr_ssbo_int %first_gep %n
|
||||
OpStore %backward_var %last_gep
|
||||
%cmp_n = OpSLessThanEqual %bool %n %int_0
|
||||
OpSelectionMerge %exit None
|
||||
OpBranchConditional %cmp_n %exit %loop
|
||||
|
||||
%loop = OpLabel
|
||||
%i = OpPhi %int %int_0 %entry %inc_i %loop
|
||||
%forward_gep = OpLoad %ptr_ssbo_int %forward_var
|
||||
%backward_gep = OpLoad %ptr_ssbo_int %backward_var
|
||||
%forward_next = OpPtrAccessChain %ptr_ssbo_int %forward_gep %int_1
|
||||
%backward_next = OpPtrAccessChain %ptr_ssbo_int %backward_gep %int_n1
|
||||
%inc_i = OpIAdd %int %i %int_1
|
||||
OpStore %forward_var %forward_next
|
||||
OpStore %backward_var %backward_next
|
||||
|
||||
%equal = OpPtrEqual %bool %forward_gep %backward_gep
|
||||
%equal_int = OpSelect %int %equal %int_1 %int_0
|
||||
%out_gep = OpAccessChain %ptr_ssbo_int %out_var %int_0 %i
|
||||
OpStore %out_gep %equal_int
|
||||
|
||||
%cmp = OpSGreaterThanEqual %bool %i %n
|
||||
OpLoopMerge %loop_exit %loop None
|
||||
OpBranchConditional %cmp %loop_exit %loop
|
||||
|
||||
%loop_exit = OpLabel
|
||||
OpBranch %exit
|
||||
%exit = OpLabel
|
||||
OpReturn
|
||||
OpFunctionEnd
|
||||
|
||||
[test]
|
||||
ssbo 0:0 132
|
||||
# Only data for number of iterations matters.
|
||||
ssbo 0:0 subdata int 0 32
|
||||
ssbo 0:1 128
|
||||
|
||||
compute entrypoint main
|
||||
compute 1 1 1
|
||||
|
||||
probe ssbo int 0:1 0 == 0
|
||||
probe ssbo int 0:1 4 == 0
|
||||
probe ssbo int 0:1 8 == 0
|
||||
probe ssbo int 0:1 12 == 0
|
||||
probe ssbo int 0:1 16 == 0
|
||||
probe ssbo int 0:1 20 == 0
|
||||
probe ssbo int 0:1 24 == 0
|
||||
probe ssbo int 0:1 28 == 0
|
||||
probe ssbo int 0:1 32 == 0
|
||||
probe ssbo int 0:1 36 == 0
|
||||
probe ssbo int 0:1 40 == 0
|
||||
probe ssbo int 0:1 44 == 0
|
||||
probe ssbo int 0:1 48 == 0
|
||||
probe ssbo int 0:1 52 == 0
|
||||
probe ssbo int 0:1 56 == 0
|
||||
probe ssbo int 0:1 60 == 0
|
||||
probe ssbo int 0:1 64 == 1
|
||||
probe ssbo int 0:1 68 == 0
|
||||
probe ssbo int 0:1 72 == 0
|
||||
probe ssbo int 0:1 76 == 0
|
||||
probe ssbo int 0:1 80 == 0
|
||||
probe ssbo int 0:1 84 == 0
|
||||
probe ssbo int 0:1 88 == 0
|
||||
probe ssbo int 0:1 92 == 0
|
||||
probe ssbo int 0:1 96 == 0
|
||||
probe ssbo int 0:1 100 == 0
|
||||
probe ssbo int 0:1 104 == 0
|
||||
probe ssbo int 0:1 108 == 0
|
||||
probe ssbo int 0:1 112 == 0
|
||||
probe ssbo int 0:1 116 == 0
|
||||
probe ssbo int 0:1 120 == 0
|
||||
probe ssbo int 0:1 124 == 0
|
||||
|
||||
|
||||
+122
@@ -0,0 +1,122 @@
|
||||
[require]
|
||||
VK_KHR_spirv_1_4
|
||||
VariablePointerFeatures.variablePointersStorageBuffer
|
||||
VariablePointerFeatures.variablePointers
|
||||
|
||||
[compute shader spirv]
|
||||
; Tests use of private variables holding workgroup pointers and pointer comparisons.
|
||||
|
||||
; Two iterators are each stored in Private variables: one moves forward, one
|
||||
; moves backward. In each iteration an equal comparison is written. Iterators
|
||||
; are then moved forward (or backward respectively) one index.
|
||||
|
||||
OpCapability Shader
|
||||
OpCapability VariablePointers
|
||||
OpMemoryModel Logical GLSL450
|
||||
OpEntryPoint GLCompute %main "main" %wg_var %out_var %forward_var %backward_var
|
||||
OpExecutionMode %main LocalSize 1 1 1
|
||||
|
||||
OpDecorate %int_rta ArrayStride 4
|
||||
OpDecorate %out_struct Block
|
||||
OpMemberDecorate %out_struct 0 Offset 0
|
||||
OpDecorate %out_var DescriptorSet 0
|
||||
OpDecorate %out_var Binding 0
|
||||
|
||||
OpDecorate %ptr_wg_int ArrayStride 4
|
||||
|
||||
%void = OpTypeVoid
|
||||
%bool = OpTypeBool
|
||||
%int = OpTypeInt 32 1
|
||||
%int_n1 = OpConstant %int -1
|
||||
%int_0 = OpConstant %int 0
|
||||
%int_1 = OpConstant %int 1
|
||||
%int_2 = OpConstant %int 2
|
||||
%int_3 = OpConstant %int 3
|
||||
%int_32 = OpConstant %int 32
|
||||
|
||||
%int_array_32 = OpTypeArray %int %int_32
|
||||
%ptr_wg_array = OpTypePointer Workgroup %int_array_32
|
||||
%wg_var = OpVariable %ptr_wg_array Workgroup
|
||||
|
||||
%int_rta = OpTypeRuntimeArray %int
|
||||
%out_struct = OpTypeStruct %int_rta
|
||||
%ptr_ssbo_out_struct = OpTypePointer StorageBuffer %out_struct
|
||||
%out_var = OpVariable %ptr_ssbo_out_struct StorageBuffer
|
||||
|
||||
%ptr_wg_int = OpTypePointer Workgroup %int
|
||||
%ptr_ptr = OpTypePointer Private %ptr_wg_int
|
||||
%forward_var = OpVariable %ptr_ptr Private
|
||||
%backward_var = OpVariable %ptr_ptr Private
|
||||
|
||||
%ptr_ssbo_int = OpTypePointer StorageBuffer %int
|
||||
%void_fn = OpTypeFunction %void
|
||||
%main = OpFunction %void None %void_fn
|
||||
%entry = OpLabel
|
||||
%first_gep = OpAccessChain %ptr_wg_int %wg_var %int_0
|
||||
OpStore %forward_var %first_gep
|
||||
%last_gep = OpPtrAccessChain %ptr_wg_int %first_gep %int_32
|
||||
OpStore %backward_var %last_gep
|
||||
OpBranch %loop
|
||||
|
||||
%loop = OpLabel
|
||||
%i = OpPhi %int %int_0 %entry %inc_i %loop
|
||||
%forward_gep = OpLoad %ptr_wg_int %forward_var
|
||||
%backward_gep = OpLoad %ptr_wg_int %backward_var
|
||||
%forward_next = OpPtrAccessChain %ptr_wg_int %forward_gep %int_1
|
||||
%backward_next = OpPtrAccessChain %ptr_wg_int %backward_gep %int_n1
|
||||
%inc_i = OpIAdd %int %i %int_1
|
||||
OpStore %forward_var %forward_next
|
||||
OpStore %backward_var %backward_next
|
||||
|
||||
%equal = OpPtrEqual %bool %forward_gep %backward_gep
|
||||
%equal_int = OpSelect %int %equal %int_1 %int_0
|
||||
%out_gep = OpAccessChain %ptr_ssbo_int %out_var %int_0 %i
|
||||
OpStore %out_gep %equal_int
|
||||
|
||||
%cmp = OpSGreaterThan %bool %i %int_32
|
||||
OpLoopMerge %exit %loop None
|
||||
OpBranchConditional %cmp %exit %loop
|
||||
|
||||
%exit = OpLabel
|
||||
OpReturn
|
||||
OpFunctionEnd
|
||||
|
||||
[test]
|
||||
ssbo 0:0 528
|
||||
|
||||
compute entrypoint main
|
||||
compute 1 1 1
|
||||
|
||||
probe ssbo int 0:0 0 == 0
|
||||
probe ssbo int 0:0 4 == 0
|
||||
probe ssbo int 0:0 8 == 0
|
||||
probe ssbo int 0:0 12 == 0
|
||||
probe ssbo int 0:0 16 == 0
|
||||
probe ssbo int 0:0 20 == 0
|
||||
probe ssbo int 0:0 24 == 0
|
||||
probe ssbo int 0:0 28 == 0
|
||||
probe ssbo int 0:0 32 == 0
|
||||
probe ssbo int 0:0 36 == 0
|
||||
probe ssbo int 0:0 40 == 0
|
||||
probe ssbo int 0:0 44 == 0
|
||||
probe ssbo int 0:0 48 == 0
|
||||
probe ssbo int 0:0 52 == 0
|
||||
probe ssbo int 0:0 56 == 0
|
||||
probe ssbo int 0:0 60 == 0
|
||||
probe ssbo int 0:0 64 == 1
|
||||
probe ssbo int 0:0 68 == 0
|
||||
probe ssbo int 0:0 72 == 0
|
||||
probe ssbo int 0:0 76 == 0
|
||||
probe ssbo int 0:0 80 == 0
|
||||
probe ssbo int 0:0 84 == 0
|
||||
probe ssbo int 0:0 88 == 0
|
||||
probe ssbo int 0:0 92 == 0
|
||||
probe ssbo int 0:0 96 == 0
|
||||
probe ssbo int 0:0 100 == 0
|
||||
probe ssbo int 0:0 104 == 0
|
||||
probe ssbo int 0:0 108 == 0
|
||||
probe ssbo int 0:0 112 == 0
|
||||
probe ssbo int 0:0 116 == 0
|
||||
probe ssbo int 0:0 120 == 0
|
||||
probe ssbo int 0:0 124 == 0
|
||||
probe ssbo int 0:0 128 == 0
|
||||
+95
@@ -0,0 +1,95 @@
|
||||
[require]
|
||||
VK_KHR_spirv_1_4
|
||||
VariablePointerFeatures.variablePointersStorageBuffer
|
||||
VariablePointerFeatures.variablePointers
|
||||
|
||||
[compute shader spirv]
|
||||
; This test generates four results per iteration of the loop. The loop is executed 64 times.
|
||||
|
||||
; Each iteration generates results for OpPtrEqual. One pointer is an iterator
|
||||
; through the workgroup variable (%wg_var) and the other is a selection between
|
||||
; the iterator, null or the 0'th index pointer depending on the value of the
|
||||
; iterator mod 3.
|
||||
|
||||
OpCapability Shader
|
||||
OpCapability VariablePointers
|
||||
OpMemoryModel Logical GLSL450
|
||||
OpEntryPoint GLCompute %main "main" %wg_var %out_var
|
||||
OpExecutionMode %main LocalSize 1 1 1
|
||||
|
||||
OpDecorate %int_rta ArrayStride 4
|
||||
OpDecorate %ptr_wg_int ArrayStride 4
|
||||
|
||||
OpDecorate %out_struct Block
|
||||
OpMemberDecorate %out_struct 0 Offset 0
|
||||
OpDecorate %out_var DescriptorSet 0
|
||||
OpDecorate %out_var Binding 0
|
||||
|
||||
%void = OpTypeVoid
|
||||
%bool = OpTypeBool
|
||||
%int = OpTypeInt 32 1
|
||||
%int_0 = OpConstant %int 0
|
||||
%int_1 = OpConstant %int 1
|
||||
%int_2 = OpConstant %int 2
|
||||
%int_3 = OpConstant %int 3
|
||||
%int_32 = OpConstant %int 32
|
||||
%int_array = OpTypeArray %int %int_32
|
||||
%int_rta = OpTypeRuntimeArray %int
|
||||
|
||||
%ptr_wg_int_array = OpTypePointer Workgroup %int_array
|
||||
%wg_var = OpVariable %ptr_wg_int_array Workgroup
|
||||
|
||||
%out_struct = OpTypeStruct %int_rta
|
||||
%ptr_ssbo_out_struct = OpTypePointer StorageBuffer %out_struct
|
||||
%out_var = OpVariable %ptr_ssbo_out_struct StorageBuffer
|
||||
|
||||
%ptr_wg_int = OpTypePointer Workgroup %int
|
||||
%ptr_wg_int_null = OpConstantNull %ptr_wg_int
|
||||
%ptr_ssbo_int = OpTypePointer StorageBuffer %int
|
||||
%void_fn = OpTypeFunction %void
|
||||
%ptr_return_fn = OpTypeFunction %ptr_wg_int %ptr_wg_int %ptr_wg_int %int
|
||||
%main = OpFunction %void None %void_fn
|
||||
%entry = OpLabel
|
||||
%base_wg_gep = OpAccessChain %ptr_wg_int %wg_var %int_0
|
||||
OpBranch %loop
|
||||
|
||||
%loop = OpLabel
|
||||
%i = OpPhi %int %int_0 %entry %inc_i %loop
|
||||
%wg_gep = OpPhi %ptr_wg_int %base_wg_gep %entry %next_wg_gep %loop
|
||||
%inc_i = OpIAdd %int %i %int_1
|
||||
%next_wg_gep = OpPtrAccessChain %ptr_wg_int %wg_gep %int_1
|
||||
|
||||
%ptr_call = OpFunctionCall %ptr_wg_int %gep_func %wg_gep %base_wg_gep %i
|
||||
%equal = OpPtrEqual %bool %wg_gep %ptr_call
|
||||
%equal_int = OpSelect %int %equal %int_1 %int_0
|
||||
%out_gep = OpAccessChain %ptr_ssbo_int %out_var %int_0 %i
|
||||
OpStore %out_gep %equal_int
|
||||
|
||||
%cmp = OpSGreaterThan %bool %i %int_32
|
||||
OpLoopMerge %exit %loop None
|
||||
OpBranchConditional %cmp %exit %loop
|
||||
|
||||
%exit = OpLabel
|
||||
OpReturn
|
||||
OpFunctionEnd
|
||||
|
||||
%gep_func = OpFunction %ptr_wg_int None %ptr_return_fn
|
||||
%param_ptr = OpFunctionParameter %ptr_wg_int
|
||||
%param_alt_ptr = OpFunctionParameter %ptr_wg_int
|
||||
%param_i = OpFunctionParameter %int
|
||||
%1 = OpLabel
|
||||
%i_mod_3 = OpSMod %int %param_i %int_3
|
||||
%i_mod_3_is_0 = OpIEqual %bool %i_mod_3 %int_0
|
||||
%i_mod_3_is_1 = OpIEqual %bool %i_mod_3 %int_1
|
||||
%wg_gep1 = OpSelect %ptr_wg_int %i_mod_3_is_0 %param_alt_ptr %ptr_wg_int_null
|
||||
%wg_gep2 = OpSelect %ptr_wg_int %i_mod_3_is_1 %param_ptr %wg_gep1
|
||||
OpReturnValue %wg_gep2
|
||||
OpFunctionEnd
|
||||
|
||||
[test]
|
||||
ssbo 0:0 132
|
||||
|
||||
compute entrypoint main
|
||||
compute 1 1 1
|
||||
|
||||
probe ssbo int 0:0 0 == 1 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0
|
||||
+157
@@ -0,0 +1,157 @@
|
||||
[require]
|
||||
VK_KHR_spirv_1_4
|
||||
VariablePointerFeatures.variablePointersStorageBuffer
|
||||
VariablePointerFeatures.variablePointers
|
||||
|
||||
[compute shader spirv]
|
||||
; Test operates on a Workgroup array (%wg_var) containing an array of 16 arrays of four ints.
|
||||
|
||||
; Each invocation writes out the result of OpPtrEqual for elements of the
|
||||
; outer array to index 16 of the corresponding output variable. Pointers are
|
||||
; based the gid'th element vs the zero'th element.
|
||||
|
||||
; Each invocation loops 4 times and writes out 4 results each for OpPtrEqual.
|
||||
; The pointers are the lid'th element of gid'th element of the outer array vs
|
||||
; the iteration count mod 4'th element of the gid'th element of the outer
|
||||
; array. Results are ordered so each thread writes continguous results.
|
||||
|
||||
OpCapability Shader
|
||||
OpCapability VariablePointers
|
||||
OpMemoryModel Logical GLSL450
|
||||
OpEntryPoint GLCompute %main "main" %wg_var %equal_var %lid_var %gid_var
|
||||
OpExecutionMode %main LocalSize 16 4 1
|
||||
|
||||
OpDecorate %struct_17 Block
|
||||
OpMemberDecorate %struct_17 0 Offset 0
|
||||
OpDecorate %runtime_17 ArrayStride 68
|
||||
OpDecorate %array_17 ArrayStride 4
|
||||
|
||||
OpDecorate %equal_var DescriptorSet 0
|
||||
OpDecorate %equal_var Binding 0
|
||||
|
||||
OpDecorate %lid_var BuiltIn LocalInvocationId
|
||||
OpDecorate %gid_var BuiltIn GlobalInvocationId
|
||||
|
||||
%void = OpTypeVoid
|
||||
%bool = OpTypeBool
|
||||
%int = OpTypeInt 32 1
|
||||
%int_0 = OpConstant %int 0
|
||||
%int_1 = OpConstant %int 1
|
||||
%int_4 = OpConstant %int 4
|
||||
%int_16 = OpConstant %int 16
|
||||
%int_17 = OpConstant %int 17
|
||||
%int_64 = OpConstant %int 64
|
||||
%int3 = OpTypeVector %int 3
|
||||
|
||||
%ptr_input_int3 = OpTypePointer Input %int3
|
||||
|
||||
%array_4 = OpTypeArray %int %int_4
|
||||
%array_array_4 = OpTypeArray %array_4 %int_16
|
||||
%ptr_array_array_4 = OpTypePointer Workgroup %array_array_4
|
||||
%ptr_array_4 = OpTypePointer Workgroup %array_4
|
||||
%ptr_wg_int = OpTypePointer Workgroup %int
|
||||
|
||||
%array_17 = OpTypeArray %int %int_17
|
||||
%runtime_17 = OpTypeRuntimeArray %array_17
|
||||
%struct_17 = OpTypeStruct %runtime_17
|
||||
%ptr_struct_17 = OpTypePointer StorageBuffer %struct_17
|
||||
%ptr_array_17 = OpTypePointer StorageBuffer %array_17
|
||||
%ptr_int = OpTypePointer StorageBuffer %int
|
||||
|
||||
%wg_var = OpVariable %ptr_array_array_4 Workgroup
|
||||
%equal_var = OpVariable %ptr_struct_17 StorageBuffer
|
||||
%lid_var = OpVariable %ptr_input_int3 Input
|
||||
%gid_var = OpVariable %ptr_input_int3 Input
|
||||
|
||||
%void_fn = OpTypeFunction %void
|
||||
%main = OpFunction %void None %void_fn
|
||||
%entry = OpLabel
|
||||
%gid = OpLoad %int3 %gid_var
|
||||
%gid_x = OpCompositeExtract %int %gid 0
|
||||
%gid_y = OpCompositeExtract %int %gid 1
|
||||
%lid = OpLoad %int3 %lid_var
|
||||
%lid_x = OpCompositeExtract %int %lid 0
|
||||
%lid_y = OpCompositeExtract %int %lid 1
|
||||
%array_gep_0 = OpAccessChain %ptr_array_4 %wg_var %int_0
|
||||
%array_gep = OpAccessChain %ptr_array_4 %wg_var %lid_x
|
||||
%lid_y_is_1 = OpIEqual %bool %lid_y %int_1
|
||||
OpSelectionMerge %loop None
|
||||
OpBranchConditional %lid_y_is_1 %then %loop
|
||||
|
||||
%then = OpLabel
|
||||
; Compute results for outer array
|
||||
%large_equal = OpPtrEqual %bool %array_gep %array_gep_0
|
||||
%large_equal_gep = OpAccessChain %ptr_int %equal_var %int_0 %gid_x %int_16
|
||||
%large_equal_int = OpSelect %int %large_equal %int_1 %int_0
|
||||
OpStore %large_equal_gep %large_equal_int
|
||||
;
|
||||
OpBranch %loop
|
||||
|
||||
%loop = OpLabel
|
||||
%i = OpPhi %int %int_0 %entry %int_0 %then %inc_i %loop
|
||||
%inc_i = OpIAdd %int %i %int_1
|
||||
%i_cmp = OpIEqual %bool %inc_i %int_4
|
||||
%lid_offset = OpIMul %int %lid_y %int_4
|
||||
%out_gep_index = OpIAdd %int %i %lid_offset
|
||||
; Compute results for inner array
|
||||
%ref_gep = OpAccessChain %ptr_wg_int %array_gep %lid_y
|
||||
%cmp_gep = OpAccessChain %ptr_wg_int %array_gep %i
|
||||
%equal = OpPtrEqual %bool %ref_gep %cmp_gep
|
||||
%equal_int = OpSelect %int %equal %int_1 %int_0
|
||||
%equal_gep = OpAccessChain %ptr_int %equal_var %int_0 %gid_x %out_gep_index
|
||||
OpStore %equal_gep %equal_int
|
||||
;
|
||||
OpLoopMerge %exit %loop None
|
||||
OpBranchConditional %i_cmp %exit %loop
|
||||
|
||||
%exit = OpLabel
|
||||
OpReturn
|
||||
OpFunctionEnd
|
||||
|
||||
|
||||
[test]
|
||||
# 16 x 4 x 2 = 128 work items
|
||||
# 4 x 4 = 16 bytes per invocation
|
||||
# 2048 bytes from looping
|
||||
# 16 x 2 = 32 coarse results (1 per lid)
|
||||
# 128 bytes
|
||||
# 2176 total bytes
|
||||
ssbo 0:0 2176
|
||||
|
||||
compute entrypoint main
|
||||
compute 2 1 1
|
||||
|
||||
#equal var
|
||||
probe ssbo int 0:0 0 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 1
|
||||
probe ssbo int 0:0 68 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
|
||||
probe ssbo int 0:0 136 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
|
||||
probe ssbo int 0:0 204 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
|
||||
probe ssbo int 0:0 272 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
|
||||
probe ssbo int 0:0 340 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
|
||||
probe ssbo int 0:0 408 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
|
||||
probe ssbo int 0:0 476 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
|
||||
probe ssbo int 0:0 544 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
|
||||
probe ssbo int 0:0 612 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
|
||||
probe ssbo int 0:0 680 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
|
||||
probe ssbo int 0:0 748 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
|
||||
probe ssbo int 0:0 816 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
|
||||
probe ssbo int 0:0 884 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
|
||||
probe ssbo int 0:0 952 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
|
||||
probe ssbo int 0:0 1020 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
|
||||
probe ssbo int 0:0 1088 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 1
|
||||
probe ssbo int 0:0 1156 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
|
||||
probe ssbo int 0:0 1224 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
|
||||
probe ssbo int 0:0 1292 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
|
||||
probe ssbo int 0:0 1360 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
|
||||
probe ssbo int 0:0 1428 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
|
||||
probe ssbo int 0:0 1496 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
|
||||
probe ssbo int 0:0 1564 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
|
||||
probe ssbo int 0:0 1632 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
|
||||
probe ssbo int 0:0 1700 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
|
||||
probe ssbo int 0:0 1768 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
|
||||
probe ssbo int 0:0 1836 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
|
||||
probe ssbo int 0:0 1904 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
|
||||
probe ssbo int 0:0 1972 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
|
||||
probe ssbo int 0:0 2040 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
|
||||
probe ssbo int 0:0 2108 == 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
|
||||
|
||||
Reference in New Issue
Block a user