From cb88de5e5e8135d2c282b9f11a71af56923ec484 Mon Sep 17 00:00:00 2001 From: steve-lunarg Date: Wed, 3 Aug 2016 07:04:18 -0600 Subject: [PATCH] HLSL: allow semicolons between global scope declarations. --- Test/baseResults/hlsl.semicolons.frag.out | 96 +++++++++++++++++++++++++++++++ Test/hlsl.semicolons.frag | 19 ++++++ gtests/Hlsl.FromFile.cpp | 1 + hlsl/hlslGrammar.cpp | 5 ++ 4 files changed, 121 insertions(+) create mode 100644 Test/baseResults/hlsl.semicolons.frag.out create mode 100644 Test/hlsl.semicolons.frag diff --git a/Test/baseResults/hlsl.semicolons.frag.out b/Test/baseResults/hlsl.semicolons.frag.out new file mode 100644 index 0000000..78a3a5a --- /dev/null +++ b/Test/baseResults/hlsl.semicolons.frag.out @@ -0,0 +1,96 @@ +hlsl.semicolons.frag +Shader version: 450 +gl_FragCoord origin is upper left +0:? Sequence +0:4 Function Definition: MyFunc( (global void) +0:2 Function Parameters: +0:8 Function Definition: MyFunc2( (global void) +0:8 Function Parameters: +0:18 Function Definition: main( (global structure{temp 4-component vector of float color}) +0:13 Function Parameters: +0:? Sequence +0:16 move second child to first child (temp 4-component vector of float) +0:16 color: direct index for structure (temp 4-component vector of float) +0:16 'ps_output' (temp structure{temp 4-component vector of float color}) +0:16 Constant: +0:16 0 (const int) +0:16 Constant: +0:16 1.000000 +0:16 1.000000 +0:16 1.000000 +0:16 1.000000 +0:17 Branch: Return with expression +0:17 'ps_output' (temp structure{temp 4-component vector of float color}) +0:? Linker Objects + + +Linked fragment stage: + + +Shader version: 450 +gl_FragCoord origin is upper left +0:? Sequence +0:4 Function Definition: MyFunc( (global void) +0:2 Function Parameters: +0:8 Function Definition: MyFunc2( (global void) +0:8 Function Parameters: +0:18 Function Definition: main( (global structure{temp 4-component vector of float color}) +0:13 Function Parameters: +0:? Sequence +0:16 move second child to first child (temp 4-component vector of float) +0:16 color: direct index for structure (temp 4-component vector of float) +0:16 'ps_output' (temp structure{temp 4-component vector of float color}) +0:16 Constant: +0:16 0 (const int) +0:16 Constant: +0:16 1.000000 +0:16 1.000000 +0:16 1.000000 +0:16 1.000000 +0:17 Branch: Return with expression +0:17 'ps_output' (temp structure{temp 4-component vector of float color}) +0:? Linker Objects + +// Module Version 10000 +// Generated by (magic number): 80001 +// Id's are bound by 23 + + Capability Shader + 1: ExtInstImport "GLSL.std.450" + MemoryModel Logical GLSL450 + EntryPoint Fragment 4 "main" + ExecutionMode 4 OriginUpperLeft + Source HLSL 450 + Name 4 "main" + Name 6 "MyFunc(" + Name 8 "MyFunc2(" + Name 12 "PS_OUTPUT" + MemberName 12(PS_OUTPUT) 0 "color" + Name 14 "ps_output" + 2: TypeVoid + 3: TypeFunction 2 + 10: TypeFloat 32 + 11: TypeVector 10(float) 4 + 12(PS_OUTPUT): TypeStruct 11(fvec4) + 13: TypePointer Function 12(PS_OUTPUT) + 15: TypeInt 32 1 + 16: 15(int) Constant 0 + 17: 10(float) Constant 1065353216 + 18: 11(fvec4) ConstantComposite 17 17 17 17 + 19: TypePointer Function 11(fvec4) + 4(main): 2 Function None 3 + 5: Label + 14(ps_output): 13(ptr) Variable Function + 20: 19(ptr) AccessChain 14(ps_output) 16 + Store 20 18 + 21:12(PS_OUTPUT) Load 14(ps_output) + ReturnValue 21 + FunctionEnd + 6(MyFunc(): 2 Function None 3 + 7: Label + Return + FunctionEnd + 8(MyFunc2(): 2 Function None 3 + 9: Label + Return + FunctionEnd diff --git a/Test/hlsl.semicolons.frag b/Test/hlsl.semicolons.frag new file mode 100644 index 0000000..28fdedd --- /dev/null +++ b/Test/hlsl.semicolons.frag @@ -0,0 +1,19 @@ + +void MyFunc() { } + +;;; +; +; ; ; // HLSL allows stray global scope semicolons. + +void MyFunc2() {;;;}; + +struct PS_OUTPUT { float4 color : SV_Target0; };;;;; + +;PS_OUTPUT main() +{ + PS_OUTPUT ps_output;;; + ; + ps_output.color = 1.0; + return ps_output; +}; + diff --git a/gtests/Hlsl.FromFile.cpp b/gtests/Hlsl.FromFile.cpp index 55c7139..f9539ec 100644 --- a/gtests/Hlsl.FromFile.cpp +++ b/gtests/Hlsl.FromFile.cpp @@ -143,6 +143,7 @@ INSTANTIATE_TEST_CASE_P( {"hlsl.samplelevel.basic.dx10.vert", "main"}, {"hlsl.samplelevel.offset.dx10.frag", "main"}, {"hlsl.samplelevel.offsetarray.dx10.frag", "main"}, + {"hlsl.semicolons.frag", "main"}, {"hlsl.shapeConv.frag", "main"}, {"hlsl.intrinsics.vert", "VertexShaderFunction"}, {"hlsl.matType.frag", "PixelShaderFunction"}, diff --git a/hlsl/hlslGrammar.cpp b/hlsl/hlslGrammar.cpp index 37919c3..64e8b9f 100755 --- a/hlsl/hlslGrammar.cpp +++ b/hlsl/hlslGrammar.cpp @@ -89,12 +89,17 @@ bool HlslGrammar::acceptIdentifier(HlslToken& idToken) // compilationUnit // : list of externalDeclaration +// | SEMICOLONS // bool HlslGrammar::acceptCompilationUnit() { TIntermNode* unitNode = nullptr; while (! peekTokenClass(EHTokNone)) { + // HLSL allows semicolons between global declarations, e.g, between functions. + if (acceptTokenClass(EHTokSemicolon)) + continue; + // externalDeclaration TIntermNode* declarationNode; if (! acceptDeclaration(declarationNode)) -- 2.7.4