blob: 7b17d96f59b77149f1a713d4c9321f167b1ad2eb [file] [log] [blame]
[require]
VK_KHR_spirv_1_4
VK_KHR_variable_pointers
VariablePointerFeatures.variablePointersStorageBuffer
VariablePointerFeatures.variablePointers
VK_KHR_storage_buffer_storage_class
VK_KHR_get_physical_device_properties2
[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