From b50fd17acbddc53d0d4d9f7ad84b990ad0e71774 Mon Sep 17 00:00:00 2001 From: John Kessenich Date: Sun, 16 Oct 2016 12:12:11 -0600 Subject: [PATCH] HLSL: Support SV_Coverage and SV_DispatchThreadId; catch SV_GroupIndex. --- Test/baseResults/hlsl.basic.comp.out | 59 +++++++++++++++++++++++ Test/baseResults/hlsl.inoutquals.frag.out | 17 +++++-- Test/hlsl.basic.comp | 6 +++ Test/hlsl.inoutquals.frag | 2 +- glslang/Include/revision.h | 2 +- gtests/Hlsl.FromFile.cpp | 1 + hlsl/hlslParseHelper.cpp | 10 ++-- 7 files changed, 88 insertions(+), 9 deletions(-) create mode 100755 Test/baseResults/hlsl.basic.comp.out create mode 100644 Test/hlsl.basic.comp diff --git a/Test/baseResults/hlsl.basic.comp.out b/Test/baseResults/hlsl.basic.comp.out new file mode 100755 index 00000000..1948ec3c --- /dev/null +++ b/Test/baseResults/hlsl.basic.comp.out @@ -0,0 +1,59 @@ +hlsl.basic.comp +Shader version: 450 +local_size = (1, 1, 1) +0:? Sequence +0:4 Function Definition: main( (temp void) +0:4 Function Parameters: +0:? Sequence +0:5 dti: direct index for structure (layout(offset=0 ) uniform int LocalInvocationID) +0:5 'anon@0' (layout(row_major std140 ) uniform block{layout(offset=0 ) uniform int LocalInvocationID dti}) +0:5 Constant: +0:5 0 (const uint) +0:? Linker Objects +0:? 'anon@0' (uniform block{layout(offset=0 ) uniform int LocalInvocationID dti}) + + +Linked compute stage: + + +Shader version: 450 +local_size = (1, 1, 1) +0:? Sequence +0:4 Function Definition: main( (temp void) +0:4 Function Parameters: +0:? Sequence +0:5 dti: direct index for structure (layout(offset=0 ) uniform int LocalInvocationID) +0:5 'anon@0' (layout(row_major std140 ) uniform block{layout(offset=0 ) uniform int LocalInvocationID dti}) +0:5 Constant: +0:5 0 (const uint) +0:? Linker Objects +0:? 'anon@0' (uniform block{layout(offset=0 ) uniform int LocalInvocationID dti}) + +// Module Version 10000 +// Generated by (magic number): 80001 +// Id's are bound by 11 + + Capability Shader + 1: ExtInstImport "GLSL.std.450" + MemoryModel Logical GLSL450 + EntryPoint GLCompute 4 "main" + ExecutionMode 4 LocalSize 1 1 1 + Name 4 "main" + Name 7 "$Global" + MemberName 7($Global) 0 "dti" + Name 9 "" + MemberDecorate 7($Global) 0 Offset 0 + MemberDecorate 7($Global) 0 BuiltIn LocalInvocationId + Decorate 7($Global) Block + Decorate 9 DescriptorSet 0 + 2: TypeVoid + 3: TypeFunction 2 + 6: TypeInt 32 1 + 7($Global): TypeStruct 6(int) + 8: TypePointer Uniform 7($Global) + 9: 8(ptr) Variable Uniform + 10: 6(int) Constant 0 + 4(main): 2 Function None 3 + 5: Label + Return + FunctionEnd diff --git a/Test/baseResults/hlsl.inoutquals.frag.out b/Test/baseResults/hlsl.inoutquals.frag.out index 83fe24bd..b2716a4c 100644 --- a/Test/baseResults/hlsl.inoutquals.frag.out +++ b/Test/baseResults/hlsl.inoutquals.frag.out @@ -18,9 +18,10 @@ gl_FragCoord origin is upper left 0:11 'x' (in float) 0:11 Constant: 0:11 -1.000000 -0:15 Function Definition: main(vf4; (temp structure{temp 4-component vector of float Color, temp float Depth}) +0:15 Function Definition: main(vf4;i1; (temp structure{temp 4-component vector of float Color, temp float Depth}) 0:15 Function Parameters: 0:15 'inpos' (noperspective in 4-component vector of float FragCoord) +0:15 'sampleMask' (out int SampleMaskIn) 0:? Sequence 0:18 Sequence 0:18 move second child to first child (temp float) @@ -74,6 +75,7 @@ gl_FragCoord origin is upper left 0:? 'Color' (layout(location=0 ) out 4-component vector of float) 0:? 'Depth' (out float FragDepth) 0:? 'inpos' (noperspective in 4-component vector of float FragCoord) +0:? 'sampleMask' (out int SampleMaskIn) Linked fragment stage: @@ -98,9 +100,10 @@ gl_FragCoord origin is upper left 0:11 'x' (in float) 0:11 Constant: 0:11 -1.000000 -0:15 Function Definition: main(vf4; (temp structure{temp 4-component vector of float Color, temp float Depth}) +0:15 Function Definition: main(vf4;i1; (temp structure{temp 4-component vector of float Color, temp float Depth}) 0:15 Function Parameters: 0:15 'inpos' (noperspective in 4-component vector of float FragCoord) +0:15 'sampleMask' (out int SampleMaskIn) 0:? Sequence 0:18 Sequence 0:18 move second child to first child (temp float) @@ -154,15 +157,17 @@ gl_FragCoord origin is upper left 0:? 'Color' (layout(location=0 ) out 4-component vector of float) 0:? 'Depth' (out float FragDepth) 0:? 'inpos' (noperspective in 4-component vector of float FragCoord) +0:? 'sampleMask' (out int SampleMaskIn) // Module Version 10000 // Generated by (magic number): 80001 -// Id's are bound by 61 +// Id's are bound by 63 Capability Shader + Capability SampleRateShading 1: ExtInstImport "GLSL.std.450" MemoryModel Logical GLSL450 - EntryPoint Fragment 4 "main" 45 53 57 + EntryPoint Fragment 4 "main" 45 53 57 62 ExecutionMode 4 OriginUpperLeft Name 4 "main" Name 12 "MyFunc(f1;f1;f1;" @@ -182,10 +187,12 @@ gl_FragCoord origin is upper left Name 45 "inpos" Name 53 "Color" Name 57 "Depth" + Name 62 "sampleMask" Decorate 45(inpos) NoPerspective Decorate 45(inpos) BuiltIn FragCoord Decorate 53(Color) Location 0 Decorate 57(Depth) BuiltIn FragDepth + Decorate 62(sampleMask) BuiltIn SampleMask 2: TypeVoid 3: TypeFunction 2 6: TypeFloat 32 @@ -211,6 +218,8 @@ gl_FragCoord origin is upper left 53(Color): 52(ptr) Variable Output 56: TypePointer Output 6(float) 57(Depth): 56(ptr) Variable Output + 61: TypePointer Output 34(int) + 62(sampleMask): 61(ptr) Variable Output 4(main): 2 Function None 3 5: Label 17(x): 7(ptr) Variable Function diff --git a/Test/hlsl.basic.comp b/Test/hlsl.basic.comp new file mode 100644 index 00000000..5e435105 --- /dev/null +++ b/Test/hlsl.basic.comp @@ -0,0 +1,6 @@ +int dti : SV_DispatchThreadID; + +void main() +{ + dti; +} diff --git a/Test/hlsl.inoutquals.frag b/Test/hlsl.inoutquals.frag index 91798d57..32346882 100644 --- a/Test/hlsl.inoutquals.frag +++ b/Test/hlsl.inoutquals.frag @@ -11,7 +11,7 @@ void MyFunc(in float x, out float y, inout float z) x = -1; // no effect since x = in param } -PS_OUTPUT main(noperspective in float4 inpos : SV_Position) +PS_OUTPUT main(noperspective in float4 inpos : SV_Position, out int sampleMask : SV_Coverage) { PS_OUTPUT psout; diff --git a/glslang/Include/revision.h b/glslang/Include/revision.h index 3cdfdb01..882a2d0c 100644 --- a/glslang/Include/revision.h +++ b/glslang/Include/revision.h @@ -2,5 +2,5 @@ // For the version, it uses the latest git tag followed by the number of commits. // For the date, it uses the current date (when then script is run). -#define GLSLANG_REVISION "Overload400-PrecQual.1601" +#define GLSLANG_REVISION "Overload400-PrecQual.1602" #define GLSLANG_DATE "16-Oct-2016" diff --git a/gtests/Hlsl.FromFile.cpp b/gtests/Hlsl.FromFile.cpp index f50c749c..b50816a1 100644 --- a/gtests/Hlsl.FromFile.cpp +++ b/gtests/Hlsl.FromFile.cpp @@ -86,6 +86,7 @@ INSTANTIATE_TEST_CASE_P( {"hlsl.array.multidim.frag", "main"}, {"hlsl.assoc.frag", "PixelShaderFunction"}, {"hlsl.attribute.frag", "PixelShaderFunction"}, + {"hlsl.basic.comp", "main"}, {"hlsl.buffer.frag", "PixelShaderFunction"}, {"hlsl.calculatelod.dx10.frag", "main"}, {"hlsl.calculatelodunclamped.dx10.frag", "main"}, diff --git a/hlsl/hlslParseHelper.cpp b/hlsl/hlslParseHelper.cpp index 78f18b67..b4c417d9 100755 --- a/hlsl/hlslParseHelper.cpp +++ b/hlsl/hlslParseHelper.cpp @@ -2935,6 +2935,8 @@ void HlslParseContext::handleSemantic(TSourceLoc loc, TQualifier& qualifier, con qualifier.builtIn = EbvTessLevelInner; else if (semanticUpperCase == "SV_GSINSTANCEID") qualifier.builtIn = EbvInvocationId; + else if (semanticUpperCase == "SV_DISPATCHTHREADID") + qualifier.builtIn = EbvLocalInvocationId; else if (semanticUpperCase == "SV_GROUPTHREADID") qualifier.builtIn = EbvLocalInvocationId; else if (semanticUpperCase == "SV_GROUPID") @@ -2943,6 +2945,8 @@ void HlslParseContext::handleSemantic(TSourceLoc loc, TQualifier& qualifier, con qualifier.builtIn = EbvTessCoord; else if (semanticUpperCase == "SV_DEPTH") qualifier.builtIn = EbvFragDepth; + else if( semanticUpperCase == "SV_COVERAGE") + qualifier.builtIn = EbvSampleMask; //TODO, these need to get refined to be more specific else if( semanticUpperCase == "SV_DEPTHGREATEREQUAL") @@ -2950,9 +2954,9 @@ void HlslParseContext::handleSemantic(TSourceLoc loc, TQualifier& qualifier, con else if( semanticUpperCase == "SV_DEPTHLESSEQUAL") qualifier.builtIn = EbvFragDepthLesser; else if( semanticUpperCase == "SV_STENCILREF") - error(loc, "unimplemented", "SV_STENCILREF", ""); - else if( semanticUpperCase == "SV_COVERAGE") - error(loc, "unimplemented", "SV_COVERAGE", ""); + error(loc, "unimplemented; need ARB_shader_stencil_export", "SV_STENCILREF", ""); + else if( semanticUpperCase == "SV_GROUPINDEX") + error(loc, "unimplemented", "SV_GROUPINDEX", ""); } //