Add interlock test for split functions doing begin/end.

This commit is contained in:
Hans-Kristian Arntzen 2019-09-04 12:26:34 +02:00
Родитель 261b46982a
Коммит 65e48ca5ea
6 изменённых файлов: 442 добавлений и 0 удалений

Просмотреть файл

@ -0,0 +1,42 @@
RasterizerOrderedByteAddressBuffer _7 : register(u1, space0);
RasterizerOrderedByteAddressBuffer _9 : register(u0, space0);
static float4 gl_FragCoord;
struct SPIRV_Cross_Input
{
float4 gl_FragCoord : SV_Position;
};
void callee2()
{
int _37 = int(gl_FragCoord.x);
_7.Store(_37 * 4 + 0, _7.Load(_37 * 4 + 0) + 1u);
}
void callee()
{
int _45 = int(gl_FragCoord.x);
_9.Store(_45 * 4 + 0, _9.Load(_45 * 4 + 0) + 1u);
callee2();
}
void _29()
{
}
void _31()
{
}
void frag_main()
{
callee();
_29();
_31();
}
void main(SPIRV_Cross_Input stage_input)
{
gl_FragCoord = stage_input.gl_FragCoord;
frag_main();
}

Просмотреть файл

@ -0,0 +1,45 @@
#pragma clang diagnostic ignored "-Wmissing-prototypes"
#include <metal_stdlib>
#include <simd/simd.h>
using namespace metal;
struct SSBO1
{
uint values1[1];
};
struct SSBO0
{
uint values0[1];
};
inline void callee2(thread float4& gl_FragCoord, device SSBO1& v_7)
{
int _37 = int(gl_FragCoord.x);
v_7.values1[_37]++;
}
inline void callee(thread float4& gl_FragCoord, device SSBO1& v_7, device SSBO0& v_9)
{
int _45 = int(gl_FragCoord.x);
v_9.values0[_45]++;
callee2(gl_FragCoord, v_7);
}
inline void _29()
{
}
inline void _31()
{
}
fragment void main0(device SSBO1& v_7 [[buffer(0), raster_order_group(0)]], device SSBO0& v_9 [[buffer(1), raster_order_group(0)]], float4 gl_FragCoord [[position]])
{
callee(gl_FragCoord, v_7, v_9);
_29();
_31();
}

Просмотреть файл

@ -0,0 +1,49 @@
#version 450
#extension GL_ARB_fragment_shader_interlock : require
layout(pixel_interlock_ordered) in;
layout(binding = 1, std430) buffer SSBO1
{
uint values1[];
} _7;
layout(binding = 0, std430) buffer SSBO0
{
uint values0[];
} _9;
void callee2()
{
int _37 = int(gl_FragCoord.x);
_7.values1[_37]++;
}
void callee()
{
int _45 = int(gl_FragCoord.x);
_9.values0[_45]++;
callee2();
}
void _29()
{
}
void _31()
{
}
void spvMainInterlockedBody()
{
callee();
_29();
_31();
}
void main()
{
// Interlocks were used in a way not compatible with GLSL, this is very slow.
beginInvocationInterlockARB();
spvMainInterlockedBody();
endInvocationInterlockARB();
}

Просмотреть файл

@ -0,0 +1,102 @@
; SPIR-V
; Version: 1.0
; Generator: Khronos Glslang Reference Front End; 7
; Bound: 45
; Schema: 0
OpCapability Shader
OpCapability FragmentShaderPixelInterlockEXT
OpExtension "SPV_EXT_fragment_shader_interlock"
%1 = OpExtInstImport "GLSL.std.450"
OpMemoryModel Logical GLSL450
OpEntryPoint Fragment %main "main" %gl_FragCoord
OpExecutionMode %main OriginUpperLeft
OpExecutionMode %main PixelInterlockOrderedEXT
OpSource GLSL 450
OpSourceExtension "GL_ARB_fragment_shader_interlock"
OpName %main "main"
OpName %callee2_ "callee2("
OpName %callee_ "callee("
OpName %SSBO1 "SSBO1"
OpMemberName %SSBO1 0 "values1"
OpName %_ ""
OpName %gl_FragCoord "gl_FragCoord"
OpName %SSBO0 "SSBO0"
OpMemberName %SSBO0 0 "values0"
OpName %__0 ""
OpDecorate %_runtimearr_uint ArrayStride 4
OpMemberDecorate %SSBO1 0 Offset 0
OpDecorate %SSBO1 BufferBlock
OpDecorate %_ DescriptorSet 0
OpDecorate %_ Binding 1
OpDecorate %gl_FragCoord BuiltIn FragCoord
OpDecorate %_runtimearr_uint_0 ArrayStride 4
OpMemberDecorate %SSBO0 0 Offset 0
OpDecorate %SSBO0 BufferBlock
OpDecorate %__0 DescriptorSet 0
OpDecorate %__0 Binding 0
%void = OpTypeVoid
%3 = OpTypeFunction %void
%uint = OpTypeInt 32 0
%_runtimearr_uint = OpTypeRuntimeArray %uint
%SSBO1 = OpTypeStruct %_runtimearr_uint
%_ptr_Uniform_SSBO1 = OpTypePointer Uniform %SSBO1
%_ = OpVariable %_ptr_Uniform_SSBO1 Uniform
%int = OpTypeInt 32 1
%int_0 = OpConstant %int 0
%float = OpTypeFloat 32
%v4float = OpTypeVector %float 4
%_ptr_Input_v4float = OpTypePointer Input %v4float
%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
%uint_0 = OpConstant %uint 0
%_ptr_Input_float = OpTypePointer Input %float
%uint_1 = OpConstant %uint 1
%_ptr_Uniform_uint = OpTypePointer Uniform %uint
%_runtimearr_uint_0 = OpTypeRuntimeArray %uint
%SSBO0 = OpTypeStruct %_runtimearr_uint_0
%_ptr_Uniform_SSBO0 = OpTypePointer Uniform %SSBO0
%__0 = OpVariable %_ptr_Uniform_SSBO0 Uniform
%main = OpFunction %void None %3
%5 = OpLabel
%44 = OpFunctionCall %void %callee_
%call3res = OpFunctionCall %void %callee3_
%call4res = OpFunctionCall %void %callee4_
OpReturn
OpFunctionEnd
%callee3_ = OpFunction %void None %3
%begin3 = OpLabel
OpBeginInvocationInterlockEXT
OpReturn
OpFunctionEnd
%callee4_ = OpFunction %void None %3
%begin4 = OpLabel
OpEndInvocationInterlockEXT
OpReturn
OpFunctionEnd
%callee2_ = OpFunction %void None %3
%7 = OpLabel
%23 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_0
%24 = OpLoad %float %23
%25 = OpConvertFToS %int %24
%28 = OpAccessChain %_ptr_Uniform_uint %_ %int_0 %25
%29 = OpLoad %uint %28
%30 = OpIAdd %uint %29 %uint_1
%31 = OpAccessChain %_ptr_Uniform_uint %_ %int_0 %25
OpStore %31 %30
OpReturn
OpFunctionEnd
%callee_ = OpFunction %void None %3
%9 = OpLabel
%36 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_0
%37 = OpLoad %float %36
%38 = OpConvertFToS %int %37
%39 = OpAccessChain %_ptr_Uniform_uint %__0 %int_0 %38
%40 = OpLoad %uint %39
%41 = OpIAdd %uint %40 %uint_1
%42 = OpAccessChain %_ptr_Uniform_uint %__0 %int_0 %38
OpStore %42 %41
%43 = OpFunctionCall %void %callee2_
OpReturn
OpFunctionEnd

Просмотреть файл

@ -0,0 +1,102 @@
; SPIR-V
; Version: 1.0
; Generator: Khronos Glslang Reference Front End; 7
; Bound: 45
; Schema: 0
OpCapability Shader
OpCapability FragmentShaderPixelInterlockEXT
OpExtension "SPV_EXT_fragment_shader_interlock"
%1 = OpExtInstImport "GLSL.std.450"
OpMemoryModel Logical GLSL450
OpEntryPoint Fragment %main "main" %gl_FragCoord
OpExecutionMode %main OriginUpperLeft
OpExecutionMode %main PixelInterlockOrderedEXT
OpSource GLSL 450
OpSourceExtension "GL_ARB_fragment_shader_interlock"
OpName %main "main"
OpName %callee2_ "callee2("
OpName %callee_ "callee("
OpName %SSBO1 "SSBO1"
OpMemberName %SSBO1 0 "values1"
OpName %_ ""
OpName %gl_FragCoord "gl_FragCoord"
OpName %SSBO0 "SSBO0"
OpMemberName %SSBO0 0 "values0"
OpName %__0 ""
OpDecorate %_runtimearr_uint ArrayStride 4
OpMemberDecorate %SSBO1 0 Offset 0
OpDecorate %SSBO1 BufferBlock
OpDecorate %_ DescriptorSet 0
OpDecorate %_ Binding 1
OpDecorate %gl_FragCoord BuiltIn FragCoord
OpDecorate %_runtimearr_uint_0 ArrayStride 4
OpMemberDecorate %SSBO0 0 Offset 0
OpDecorate %SSBO0 BufferBlock
OpDecorate %__0 DescriptorSet 0
OpDecorate %__0 Binding 0
%void = OpTypeVoid
%3 = OpTypeFunction %void
%uint = OpTypeInt 32 0
%_runtimearr_uint = OpTypeRuntimeArray %uint
%SSBO1 = OpTypeStruct %_runtimearr_uint
%_ptr_Uniform_SSBO1 = OpTypePointer Uniform %SSBO1
%_ = OpVariable %_ptr_Uniform_SSBO1 Uniform
%int = OpTypeInt 32 1
%int_0 = OpConstant %int 0
%float = OpTypeFloat 32
%v4float = OpTypeVector %float 4
%_ptr_Input_v4float = OpTypePointer Input %v4float
%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
%uint_0 = OpConstant %uint 0
%_ptr_Input_float = OpTypePointer Input %float
%uint_1 = OpConstant %uint 1
%_ptr_Uniform_uint = OpTypePointer Uniform %uint
%_runtimearr_uint_0 = OpTypeRuntimeArray %uint
%SSBO0 = OpTypeStruct %_runtimearr_uint_0
%_ptr_Uniform_SSBO0 = OpTypePointer Uniform %SSBO0
%__0 = OpVariable %_ptr_Uniform_SSBO0 Uniform
%main = OpFunction %void None %3
%5 = OpLabel
%44 = OpFunctionCall %void %callee_
%call3res = OpFunctionCall %void %callee3_
%call4res = OpFunctionCall %void %callee4_
OpReturn
OpFunctionEnd
%callee3_ = OpFunction %void None %3
%begin3 = OpLabel
OpBeginInvocationInterlockEXT
OpReturn
OpFunctionEnd
%callee4_ = OpFunction %void None %3
%begin4 = OpLabel
OpEndInvocationInterlockEXT
OpReturn
OpFunctionEnd
%callee2_ = OpFunction %void None %3
%7 = OpLabel
%23 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_0
%24 = OpLoad %float %23
%25 = OpConvertFToS %int %24
%28 = OpAccessChain %_ptr_Uniform_uint %_ %int_0 %25
%29 = OpLoad %uint %28
%30 = OpIAdd %uint %29 %uint_1
%31 = OpAccessChain %_ptr_Uniform_uint %_ %int_0 %25
OpStore %31 %30
OpReturn
OpFunctionEnd
%callee_ = OpFunction %void None %3
%9 = OpLabel
%36 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_0
%37 = OpLoad %float %36
%38 = OpConvertFToS %int %37
%39 = OpAccessChain %_ptr_Uniform_uint %__0 %int_0 %38
%40 = OpLoad %uint %39
%41 = OpIAdd %uint %40 %uint_1
%42 = OpAccessChain %_ptr_Uniform_uint %__0 %int_0 %38
OpStore %42 %41
%43 = OpFunctionCall %void %callee2_
OpReturn
OpFunctionEnd

Просмотреть файл

@ -0,0 +1,102 @@
; SPIR-V
; Version: 1.0
; Generator: Khronos Glslang Reference Front End; 7
; Bound: 45
; Schema: 0
OpCapability Shader
OpCapability FragmentShaderPixelInterlockEXT
OpExtension "SPV_EXT_fragment_shader_interlock"
%1 = OpExtInstImport "GLSL.std.450"
OpMemoryModel Logical GLSL450
OpEntryPoint Fragment %main "main" %gl_FragCoord
OpExecutionMode %main OriginUpperLeft
OpExecutionMode %main PixelInterlockOrderedEXT
OpSource GLSL 450
OpSourceExtension "GL_ARB_fragment_shader_interlock"
OpName %main "main"
OpName %callee2_ "callee2("
OpName %callee_ "callee("
OpName %SSBO1 "SSBO1"
OpMemberName %SSBO1 0 "values1"
OpName %_ ""
OpName %gl_FragCoord "gl_FragCoord"
OpName %SSBO0 "SSBO0"
OpMemberName %SSBO0 0 "values0"
OpName %__0 ""
OpDecorate %_runtimearr_uint ArrayStride 4
OpMemberDecorate %SSBO1 0 Offset 0
OpDecorate %SSBO1 BufferBlock
OpDecorate %_ DescriptorSet 0
OpDecorate %_ Binding 1
OpDecorate %gl_FragCoord BuiltIn FragCoord
OpDecorate %_runtimearr_uint_0 ArrayStride 4
OpMemberDecorate %SSBO0 0 Offset 0
OpDecorate %SSBO0 BufferBlock
OpDecorate %__0 DescriptorSet 0
OpDecorate %__0 Binding 0
%void = OpTypeVoid
%3 = OpTypeFunction %void
%uint = OpTypeInt 32 0
%_runtimearr_uint = OpTypeRuntimeArray %uint
%SSBO1 = OpTypeStruct %_runtimearr_uint
%_ptr_Uniform_SSBO1 = OpTypePointer Uniform %SSBO1
%_ = OpVariable %_ptr_Uniform_SSBO1 Uniform
%int = OpTypeInt 32 1
%int_0 = OpConstant %int 0
%float = OpTypeFloat 32
%v4float = OpTypeVector %float 4
%_ptr_Input_v4float = OpTypePointer Input %v4float
%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
%uint_0 = OpConstant %uint 0
%_ptr_Input_float = OpTypePointer Input %float
%uint_1 = OpConstant %uint 1
%_ptr_Uniform_uint = OpTypePointer Uniform %uint
%_runtimearr_uint_0 = OpTypeRuntimeArray %uint
%SSBO0 = OpTypeStruct %_runtimearr_uint_0
%_ptr_Uniform_SSBO0 = OpTypePointer Uniform %SSBO0
%__0 = OpVariable %_ptr_Uniform_SSBO0 Uniform
%main = OpFunction %void None %3
%5 = OpLabel
%44 = OpFunctionCall %void %callee_
%call3res = OpFunctionCall %void %callee3_
%call4res = OpFunctionCall %void %callee4_
OpReturn
OpFunctionEnd
%callee3_ = OpFunction %void None %3
%begin3 = OpLabel
OpBeginInvocationInterlockEXT
OpReturn
OpFunctionEnd
%callee4_ = OpFunction %void None %3
%begin4 = OpLabel
OpEndInvocationInterlockEXT
OpReturn
OpFunctionEnd
%callee2_ = OpFunction %void None %3
%7 = OpLabel
%23 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_0
%24 = OpLoad %float %23
%25 = OpConvertFToS %int %24
%28 = OpAccessChain %_ptr_Uniform_uint %_ %int_0 %25
%29 = OpLoad %uint %28
%30 = OpIAdd %uint %29 %uint_1
%31 = OpAccessChain %_ptr_Uniform_uint %_ %int_0 %25
OpStore %31 %30
OpReturn
OpFunctionEnd
%callee_ = OpFunction %void None %3
%9 = OpLabel
%36 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_0
%37 = OpLoad %float %36
%38 = OpConvertFToS %int %37
%39 = OpAccessChain %_ptr_Uniform_uint %__0 %int_0 %38
%40 = OpLoad %uint %39
%41 = OpIAdd %uint %40 %uint_1
%42 = OpAccessChain %_ptr_Uniform_uint %__0 %int_0 %38
OpStore %42 %41
%43 = OpFunctionCall %void %callee2_
OpReturn
OpFunctionEnd