This commit is contained in:
2026-05-06 23:44:13 +02:00
parent a5f787d80f
commit fd7038b853
1574 changed files with 365439 additions and 0 deletions
@@ -0,0 +1,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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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