blob: 5ed45914ed38553b512ccb5dcb3b9a4f53179abb [file] [log] [blame]
#!amber
# Copyright 2020 Google LLC
#
# 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
#
# http://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.
# Generated from the following GLSL code, but array stride changed
# from 4 to 8.
#
# SHADER compute compute_shader GLSL
# #version 320 es
# layout (local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
# layout(binding = 0) buffer Out0
# {
# uint values[];
# } sb;
#
# void main (void)
# {
# uvec3 size = gl_NumWorkGroups * gl_WorkGroupSize;
# uint groupNdx = size.x * size.y * gl_GlobalInvocationID.z + size.x * gl_GlobalInvocationID.y + gl_GlobalInvocationID.x;
# uint numValuesPerInv = uint(sb.values.length()) / (size.x * size.y * size.z);
# uint offset = numValuesPerInv * groupNdx;
#
# for (uint ndx = 0u; ndx < numValuesPerInv; ndx++)
# sb.values[offset + ndx] = offset + ndx;
# }
SHADER compute compute_shader SPIRV-ASM
; SPIR-V
; Version: 1.0
; Generator: Khronos Glslang Reference Front End; 7
; Bound: 83
; Schema: 0
OpCapability Shader
%1 = OpExtInstImport "GLSL.std.450"
OpMemoryModel Logical GLSL450
OpEntryPoint GLCompute %main "main" %gl_NumWorkGroups %gl_GlobalInvocationID
OpExecutionMode %main LocalSize 1 1 1
OpSource ESSL 320
OpName %main "main"
OpName %size "size"
OpName %gl_NumWorkGroups "gl_NumWorkGroups"
OpName %groupNdx "groupNdx"
OpName %gl_GlobalInvocationID "gl_GlobalInvocationID"
OpName %numValuesPerInv "numValuesPerInv"
OpName %Out0 "Out0"
OpMemberName %Out0 0 "values"
OpName %sb "sb"
OpName %offset "offset"
OpName %ndx "ndx"
OpDecorate %gl_NumWorkGroups BuiltIn NumWorkgroups
OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId
OpDecorate %_runtimearr_uint ArrayStride 8
OpMemberDecorate %Out0 0 Offset 0
OpDecorate %Out0 BufferBlock
OpDecorate %sb DescriptorSet 0
OpDecorate %sb Binding 0
%void = OpTypeVoid
%3 = OpTypeFunction %void
%uint = OpTypeInt 32 0
%v3uint = OpTypeVector %uint 3
%_ptr_Function_v3uint = OpTypePointer Function %v3uint
%_ptr_Input_v3uint = OpTypePointer Input %v3uint
%gl_NumWorkGroups = OpVariable %_ptr_Input_v3uint Input
%uint_1 = OpConstant %uint 1
%14 = OpConstantComposite %v3uint %uint_1 %uint_1 %uint_1
%_ptr_Function_uint = OpTypePointer Function %uint
%uint_0 = OpConstant %uint 0
%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input
%uint_2 = OpConstant %uint 2
%_ptr_Input_uint = OpTypePointer Input %uint
%_runtimearr_uint = OpTypeRuntimeArray %uint
%Out0 = OpTypeStruct %_runtimearr_uint
%_ptr_Uniform_Out0 = OpTypePointer Uniform %Out0
%sb = OpVariable %_ptr_Uniform_Out0 Uniform
%int = OpTypeInt 32 1
%bool = OpTypeBool
%int_0 = OpConstant %int 0
%_ptr_Uniform_uint = OpTypePointer Uniform %uint
%int_1 = OpConstant %int 1
%main = OpFunction %void None %3
%5 = OpLabel
%size = OpVariable %_ptr_Function_v3uint Function
%groupNdx = OpVariable %_ptr_Function_uint Function
%numValuesPerInv = OpVariable %_ptr_Function_uint Function
%offset = OpVariable %_ptr_Function_uint Function
%ndx = OpVariable %_ptr_Function_uint Function
%12 = OpLoad %v3uint %gl_NumWorkGroups
%15 = OpIMul %v3uint %12 %14
OpStore %size %15
%19 = OpAccessChain %_ptr_Function_uint %size %uint_0
%20 = OpLoad %uint %19
%21 = OpAccessChain %_ptr_Function_uint %size %uint_1
%22 = OpLoad %uint %21
%23 = OpIMul %uint %20 %22
%27 = OpAccessChain %_ptr_Input_uint %gl_GlobalInvocationID %uint_2
%28 = OpLoad %uint %27
%29 = OpIMul %uint %23 %28
%30 = OpAccessChain %_ptr_Function_uint %size %uint_0
%31 = OpLoad %uint %30
%32 = OpAccessChain %_ptr_Input_uint %gl_GlobalInvocationID %uint_1
%33 = OpLoad %uint %32
%34 = OpIMul %uint %31 %33
%35 = OpIAdd %uint %29 %34
%36 = OpAccessChain %_ptr_Input_uint %gl_GlobalInvocationID %uint_0
%37 = OpLoad %uint %36
%38 = OpIAdd %uint %35 %37
OpStore %groupNdx %38
%44 = OpArrayLength %uint %sb 0
%46 = OpBitcast %int %44
%47 = OpBitcast %uint %46
%48 = OpAccessChain %_ptr_Function_uint %size %uint_0
%49 = OpLoad %uint %48
%50 = OpAccessChain %_ptr_Function_uint %size %uint_1
%51 = OpLoad %uint %50
%52 = OpIMul %uint %49 %51
%53 = OpAccessChain %_ptr_Function_uint %size %uint_2
%54 = OpLoad %uint %53
%55 = OpIMul %uint %52 %54
%56 = OpUDiv %uint %47 %55
OpStore %numValuesPerInv %56
%58 = OpLoad %uint %numValuesPerInv
%59 = OpLoad %uint %groupNdx
%60 = OpIMul %uint %58 %59
OpStore %offset %60
OpStore %ndx %uint_0
OpBranch %62
%62 = OpLabel
OpLoopMerge %64 %65 None
OpBranch %66
%66 = OpLabel
%67 = OpLoad %uint %ndx
%68 = OpLoad %uint %numValuesPerInv
%70 = OpULessThan %bool %67 %68
OpBranchConditional %70 %63 %64
%63 = OpLabel
%72 = OpLoad %uint %offset
%73 = OpLoad %uint %ndx
%74 = OpIAdd %uint %72 %73
%75 = OpLoad %uint %offset
%76 = OpLoad %uint %ndx
%77 = OpIAdd %uint %75 %76
%79 = OpAccessChain %_ptr_Uniform_uint %sb %int_0 %74
OpStore %79 %77
OpBranch %65
%65 = OpLabel
%80 = OpLoad %uint %ndx
%82 = OpIAdd %uint %80 %int_1
OpStore %ndx %82
OpBranch %62
%64 = OpLabel
OpReturn
OpFunctionEnd
END
# Because the array stride was doubled the verification shader
# skips every second element.
SHADER compute compute_shader_verify GLSL
#version 320 es
layout (local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
layout(binding = 0) buffer Buf0
{
uint values[];
};
layout(binding = 1) buffer Buf1
{
int result;
};
void main()
{
result = 1;
for (uint i = 0u; i < 512u; i++)
if (values[i*2u] != i)
result = 0;
}
END
BUFFER buf DATA_TYPE uint32 SIZE 1024 FILL 0
BUFFER result DATA_TYPE int32 SIZE 1 FILL 0
PIPELINE compute verify
ATTACH compute_shader_verify
BIND BUFFER buf AS storage DESCRIPTOR_SET 0 BINDING 0
BIND BUFFER result AS storage DESCRIPTOR_SET 0 BINDING 1
END
PIPELINE compute pipeline
ATTACH compute_shader
BIND BUFFER buf AS storage DESCRIPTOR_SET 0 BINDING 0
END
RUN pipeline 4 2 2
RUN verify 1 1 1
EXPECT result IDX 0 EQ 1