Add interlock test for split functions doing begin/end.
This commit is contained in:
Родитель
261b46982a
Коммит
65e48ca5ea
|
@ -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
|
Загрузка…
Ссылка в новой задаче