blob: dc6ff8591aa8f3d17477affa8a770de9486276c3 [file] [log] [blame]
[require]
VK_KHR_spirv_1_4
VK_KHR_variable_pointers
VariablePointerFeatures.variablePointersStorageBuffer
VK_KHR_storage_buffer_storage_class
VK_KHR_get_physical_device_properties2
[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 int2 result is written that contains two
; diffs. 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 %int2_rta ArrayStride 8
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
%int2 = OpTypeVector %int 2
%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
%int2_rta = OpTypeRuntimeArray %int2
%out_struct = OpTypeStruct %int2_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
%ptr_ssbo_int2 = OpTypePointer StorageBuffer %int2
%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
%diff1 = OpPtrDiff %int %forward_gep %backward_gep
%diff2 = OpPtrDiff %int %backward_gep %forward_gep
%result = OpCompositeConstruct %int2 %diff1 %diff2
%out_gep = OpAccessChain %ptr_ssbo_int2 %out_var %int_0 %i
OpStore %out_gep %result
%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 33
ssbo 0:1 264
compute entrypoint main
compute 1 1 1
probe ssbo ivec2 0:1 0 == -33 33
probe ssbo ivec2 0:1 8 == -31 31
probe ssbo ivec2 0:1 16 == -29 29
probe ssbo ivec2 0:1 24 == -27 27
probe ssbo ivec2 0:1 32 == -25 25
probe ssbo ivec2 0:1 40 == -23 23
probe ssbo ivec2 0:1 48 == -21 21
probe ssbo ivec2 0:1 56 == -19 19
probe ssbo ivec2 0:1 64 == -17 17
probe ssbo ivec2 0:1 72 == -15 15
probe ssbo ivec2 0:1 80 == -13 13
probe ssbo ivec2 0:1 88 == -11 11
probe ssbo ivec2 0:1 96 == -9 9
probe ssbo ivec2 0:1 104 == -7 7
probe ssbo ivec2 0:1 112 == -5 5
probe ssbo ivec2 0:1 120 == -3 3
probe ssbo ivec2 0:1 128 == -1 1
probe ssbo ivec2 0:1 136 == 1 -1
probe ssbo ivec2 0:1 144 == 3 -3
probe ssbo ivec2 0:1 152 == 5 -5
probe ssbo ivec2 0:1 160 == 7 -7
probe ssbo ivec2 0:1 168 == 9 -9
probe ssbo ivec2 0:1 176 == 11 -11
probe ssbo ivec2 0:1 184 == 13 -13
probe ssbo ivec2 0:1 192 == 15 -15
probe ssbo ivec2 0:1 200 == 17 -17
probe ssbo ivec2 0:1 208 == 19 -19
probe ssbo ivec2 0:1 216 == 21 -21
probe ssbo ivec2 0:1 224 == 23 -23
probe ssbo ivec2 0:1 232 == 25 -25
probe ssbo ivec2 0:1 240 == 27 -27
probe ssbo ivec2 0:1 248 == 29 -29
probe ssbo ivec2 0:1 256 == 31 -31