| [require] |
| VK_KHR_spirv_1_4 |
| VK_KHR_variable_pointers |
| VariablePointerFeatures.variablePointersStorageBuffer |
| VariablePointerFeatures.variablePointers |
| VK_KHR_get_physical_device_properties2 |
| |
| [compute shader spirv] |
| OpCapability Shader |
| OpCapability VariablePointers |
| OpMemoryModel Logical GLSL450 |
| OpEntryPoint GLCompute %main "main" %gid_var %sel_var %wg1_var %wg2_var %out_var |
| OpExecutionMode %main LocalSize 1 1 1 |
| OpDecorate %gid_var BuiltIn GlobalInvocationId |
| OpMemberDecorate %inner 0 Offset 0 |
| OpMemberDecorate %inner 1 Offset 4 |
| OpMemberDecorate %outer 0 Offset 0 |
| OpMemberDecorate %outer 1 Offset 8 |
| OpDecorate %rta ArrayStride 4 |
| OpDecorate %rta_struct ArrayStride 16 |
| OpDecorate %block Block |
| OpMemberDecorate %block 0 Offset 0 |
| OpDecorate %data_block Block |
| OpMemberDecorate %data_block 0 Offset 0 |
| OpDecorate %sel_var DescriptorSet 0 |
| OpDecorate %sel_var Binding 0 |
| OpDecorate %out_var DescriptorSet 0 |
| OpDecorate %out_var Binding 1 |
| %void = OpTypeVoid |
| %bool = OpTypeBool |
| %int = OpTypeInt 32 0 |
| %int_0 = OpConstant %int 0 |
| %int_1 = OpConstant %int 1 |
| %int_2 = OpConstant %int 2 |
| %int3 = OpTypeVector %int 3 |
| %inner = OpTypeStruct %int %int |
| %outer = OpTypeStruct %inner %inner |
| %rta_struct = OpTypeRuntimeArray %outer |
| %rta = OpTypeRuntimeArray %int |
| %data_block = OpTypeStruct %rta_struct |
| %block = OpTypeStruct %rta |
| %ptr_input_int3 = OpTypePointer Input %int3 |
| %gid_var = OpVariable %ptr_input_int3 Input |
| %ptr_ssbo_block = OpTypePointer StorageBuffer %block |
| %ptr_ssbo_int = OpTypePointer StorageBuffer %int |
| %ptr_ssbo_data_block = OpTypePointer StorageBuffer %data_block |
| %ptr_ssbo_outer = OpTypePointer StorageBuffer %outer |
| %sel_var = OpVariable %ptr_ssbo_block StorageBuffer |
| %ptr_wg_outer = OpTypePointer Workgroup %outer |
| %wg1_var = OpVariable %ptr_wg_outer Workgroup |
| %wg2_var = OpVariable %ptr_wg_outer Workgroup |
| %out_var = OpVariable %ptr_ssbo_data_block StorageBuffer |
| %inner_const0 = OpConstantComposite %inner %int_1 %int_1 |
| %inner_const1 = OpConstantComposite %inner %int_2 %int_2 |
| %outer_const0 = OpConstantComposite %outer %inner_const0 %inner_const0 |
| %outer_const1 = OpConstantComposite %outer %inner_const1 %inner_const1 |
| %void_fn = OpTypeFunction %void |
| %main = OpFunction %void None %void_fn |
| %entry = OpLabel |
| %gid = OpLoad %int3 %gid_var |
| %gid_x = OpCompositeExtract %int %gid 0 |
| OpStore %wg1_var %outer_const0 |
| OpStore %wg2_var %outer_const1 |
| %sel_gep = OpAccessChain %ptr_ssbo_int %sel_var %int_0 %gid_x |
| %sel_val = OpLoad %int %sel_gep |
| %eq_0 = OpIEqual %bool %sel_val %int_0 |
| %select = OpSelect %ptr_wg_outer %eq_0 %wg1_var %wg2_var |
| %out_gep = OpAccessChain %ptr_ssbo_outer %out_var %int_0 %gid_x |
| %ld = OpLoad %outer %select |
| OpStore %out_gep %ld |
| OpReturn |
| OpFunctionEnd |
| |
| [test] |
| ssbo 0:0 subdata uint 0 1 0 |
| ssbo 0:1 32 |
| |
| compute entrypoint main |
| compute 2 1 1 |
| |
| probe ssbo uint 0:1 0 == 2 2 2 2 |
| probe ssbo uint 0:1 16 == 1 1 1 1 |
| |
| |