#!amber # Copyright 2019 The Amber Authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # https://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. SHADER compute my_compute SPIRV-ASM OpCapability Shader OpExtension "SPV_KHR_storage_buffer_storage_class" OpMemoryModel Logical GLSL450 OpEntryPoint GLCompute %main "main" %lid_var %gid_var %idx_var %wgid_var OpDecorate %lid_var BuiltIn LocalInvocationId OpDecorate %gid_var BuiltIn GlobalInvocationId OpDecorate %idx_var BuiltIn LocalInvocationIndex OpDecorate %wgid_var BuiltIn WorkgroupId OpDecorate %wg_size BuiltIn WorkgroupSize OpDecorate %x SpecId 1 OpDecorate %y SpecId 2 OpDecorate %z SpecId 3 OpDecorate %struct Block OpMemberDecorate %struct 0 Offset 0 OpDecorate %rta ArrayStride 4 OpDecorate %x_var DescriptorSet 0 OpDecorate %x_var Binding 0 OpDecorate %y_var DescriptorSet 0 OpDecorate %y_var Binding 1 OpDecorate %z_var DescriptorSet 0 OpDecorate %z_var Binding 2 OpDecorate %s_var DescriptorSet 0 OpDecorate %s_var Binding 3 %void = OpTypeVoid %int = OpTypeInt 32 0 %int_0 = OpConstant %int 0 %device = OpConstant %int 1 %relaxed = OpConstant %int 0 %int3 = OpTypeVector %int 3 %x = OpSpecConstant %int 1 %y = OpSpecConstant %int 1 %z = OpSpecConstant %int 1 %wg_size = OpSpecConstantComposite %int3 %x %y %z %rta = OpTypeRuntimeArray %int %struct = OpTypeStruct %rta %ptr_input_int3 = OpTypePointer Input %int3 %ptr_input_int = OpTypePointer Input %int %lid_var = OpVariable %ptr_input_int3 Input %gid_var = OpVariable %ptr_input_int3 Input %idx_var = OpVariable %ptr_input_int Input %wgid_var = OpVariable %ptr_input_int3 Input %ptr_ssbo_struct = OpTypePointer StorageBuffer %struct %ptr_ssbo_int = OpTypePointer StorageBuffer %int %x_var = OpVariable %ptr_ssbo_struct StorageBuffer %y_var = OpVariable %ptr_ssbo_struct StorageBuffer %z_var = OpVariable %ptr_ssbo_struct StorageBuffer %s_var = OpVariable %ptr_ssbo_struct StorageBuffer %void_fn = OpTypeFunction %void %main = OpFunction %void None %void_fn %entry = OpLabel %lid = OpLoad %int3 %lid_var %lid_x = OpCompositeExtract %int %lid 0 %lid_y = OpCompositeExtract %int %lid 1 %lid_z = OpCompositeExtract %int %lid 2 %gid = OpLoad %int3 %gid_var %gid_x = OpCompositeExtract %int %gid 0 %gid_y = OpCompositeExtract %int %gid 1 %gid_z = OpCompositeExtract %int %gid 2 %wgid = OpLoad %int3 %wgid_var %wgid_x = OpCompositeExtract %int %wgid 0 %wgid_y = OpCompositeExtract %int %wgid 1 %wgid_z = OpCompositeExtract %int %wgid 2 %local_index = OpLoad %int %idx_var %wg_x = OpCompositeExtract %int %wg_size 0 %wg_y = OpCompositeExtract %int %wg_size 1 %wg_z = OpCompositeExtract %int %wg_size 2 %x_y = OpIMul %int %wg_x %wg_y %x_y_z = OpIMul %int %x_y %wg_z %mul = OpIMul %int %wgid_x %x_y_z ; only support multiple wgs on x %linear = OpIAdd %int %mul %local_index %x_gep = OpAccessChain %ptr_ssbo_int %x_var %int_0 %linear %y_gep = OpAccessChain %ptr_ssbo_int %y_var %int_0 %linear %z_gep = OpAccessChain %ptr_ssbo_int %z_var %int_0 %linear %s_gep = OpAccessChain %ptr_ssbo_int %s_var %int_0 %linear OpStore %x_gep %lid_x OpStore %y_gep %lid_y OpStore %z_gep %lid_z OpStore %s_gep %linear OpReturn OpFunctionEnd END BUFFER x_buf DATA_TYPE uint32 SIZE 16 FILL 0 BUFFER y_buf DATA_TYPE uint32 SIZE 16 FILL 0 BUFFER z_buf DATA_TYPE uint32 SIZE 16 FILL 0 BUFFER s_buf DATA_TYPE uint32 SIZE 16 FILL 0 PIPELINE compute small ATTACH my_compute \ SPECIALIZE 1 AS uint32 2 \ SPECIALIZE 2 AS uint32 2 \ SPECIALIZE 3 AS uint32 2 BIND BUFFER x_buf AS storage DESCRIPTOR_SET 0 BINDING 0 BIND BUFFER y_buf AS storage DESCRIPTOR_SET 0 BINDING 1 BIND BUFFER z_buf AS storage DESCRIPTOR_SET 0 BINDING 2 BIND BUFFER s_buf AS storage DESCRIPTOR_SET 0 BINDING 3 END RUN small 2 1 1 EXPECT s_buf IDX 0 EQ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 EXPECT x_buf IDX 0 EQ 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 EXPECT y_buf IDX 0 EQ 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 EXPECT z_buf IDX 0 EQ 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1