You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
123 lines
4.3 KiB
123 lines
4.3 KiB
#!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
|
|
|