| [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] |
| ; Test operates on a Workgroup array (%wg_var) containing an array of 16 arrays of four ints. |
| |
| ; Each invocation writes out the result of OpPtrNotEqual 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 OpPtrNotEqual. |
| ; 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 %not_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 %not_equal_var DescriptorSet 0 |
| OpDecorate %not_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 |
| |
| %input_struct = OpTypeStruct %int3 %int3 |
| %ptr_input_struct = OpTypePointer Input %input_struct |
| %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 |
| %not_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_not_equal = OpPtrNotEqual %bool %array_gep %array_gep_0 |
| %large_not_equal_gep = OpAccessChain %ptr_int %not_equal_var %int_0 %gid_x %int_16 |
| %large_not_equal_int = OpSelect %int %large_not_equal %int_1 %int_0 |
| OpStore %large_not_equal_gep %large_not_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 |
| %not_equal = OpPtrNotEqual %bool %ref_gep %cmp_gep |
| %not_equal_int = OpSelect %int %not_equal %int_1 %int_0 |
| %not_equal_gep = OpAccessChain %ptr_int %not_equal_var %int_0 %gid_x %out_gep_index |
| OpStore %not_equal_gep %not_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 |
| |
| #not equal var |
| probe ssbo int 0:0 0 == 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 0 |
| probe ssbo int 0:0 68 == 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1 |
| probe ssbo int 0:0 136 == 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1 |
| probe ssbo int 0:0 204 == 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1 |
| probe ssbo int 0:0 272 == 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1 |
| probe ssbo int 0:0 340 == 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1 |
| probe ssbo int 0:0 408 == 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1 |
| probe ssbo int 0:0 476 == 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1 |
| probe ssbo int 0:0 544 == 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1 |
| probe ssbo int 0:0 612 == 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1 |
| probe ssbo int 0:0 680 == 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1 |
| probe ssbo int 0:0 748 == 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1 |
| probe ssbo int 0:0 816 == 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1 |
| probe ssbo int 0:0 884 == 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1 |
| probe ssbo int 0:0 952 == 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1 |
| probe ssbo int 0:0 1020 == 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1 |
| probe ssbo int 0:0 1088 == 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 0 |
| probe ssbo int 0:0 1156 == 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1 |
| probe ssbo int 0:0 1224 == 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1 |
| probe ssbo int 0:0 1292 == 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1 |
| probe ssbo int 0:0 1360 == 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1 |
| probe ssbo int 0:0 1428 == 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1 |
| probe ssbo int 0:0 1496 == 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1 |
| probe ssbo int 0:0 1564 == 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1 |
| probe ssbo int 0:0 1632 == 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1 |
| probe ssbo int 0:0 1700 == 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1 |
| probe ssbo int 0:0 1768 == 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1 |
| probe ssbo int 0:0 1836 == 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1 |
| probe ssbo int 0:0 1904 == 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1 |
| probe ssbo int 0:0 1972 == 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1 |
| probe ssbo int 0:0 2040 == 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1 |
| probe ssbo int 0:0 2108 == 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1 |
| |