From 4678ca9dacfec7a084dbc69bbe568bdad6889f1b Mon Sep 17 00:00:00 2001 From: John Kessenich Date: Fri, 13 May 2016 09:33:42 -0600 Subject: [PATCH] HLSL: Add function call syntax and AST building. --- Test/baseResults/hlsl.frag.out | 69 ++++++++++++++++++++++++++++------ Test/hlsl.frag | 7 ++-- hlsl/hlslGrammar.cpp | 19 +++++++--- hlsl/hlslGrammar.h | 2 +- hlsl/hlslParseHelper.cpp | 9 +++-- hlsl/hlslParseHelper.h | 2 +- 6 files changed, 83 insertions(+), 25 deletions(-) diff --git a/Test/baseResults/hlsl.frag.out b/Test/baseResults/hlsl.frag.out index 9afecf128..3ccbc898d 100644 --- a/Test/baseResults/hlsl.frag.out +++ b/Test/baseResults/hlsl.frag.out @@ -2,10 +2,27 @@ hlsl.frag Shader version: 100 gl_FragCoord origin is upper left 0:? Sequence -0:12 Function Definition: PixelShaderFunction(vf4; (temp 4-component vector of float) +0:1 move second child to first child (temp 4-component vector of float) +0:1 'AmbientColor' (temp 4-component vector of float) +0:? Constant: +0:? 1.000000 +0:? 0.500000 +0:? 0.000000 +0:? 1.000000 +0:2 move second child to first child (temp float) +0:2 'AmbientIntensity' (temp float) +0:2 Constant: +0:2 0.100000 +0:13 Function Definition: PixelShaderFunction(vf4; (temp 4-component vector of float) 0:5 Function Parameters: 0:5 'input' (temp 4-component vector of float) 0:? Sequence +0:6 Branch: Return with expression +0:6 add (temp 4-component vector of float) +0:6 vector-scale (temp 4-component vector of float) +0:6 'input' (temp 4-component vector of float) +0:6 'AmbientIntensity' (temp float) +0:6 'AmbientColor' (temp 4-component vector of float) 0:7 Branch: Return with expression 0:7 add (temp 4-component vector of float) 0:7 component-wise multiply (temp 4-component vector of float) @@ -36,7 +53,12 @@ gl_FragCoord origin is upper left 0:10 'input' (temp 4-component vector of float) 0:10 Pre-Increment (temp 4-component vector of float) 0:10 'input' (temp 4-component vector of float) +0:11 Branch: Return with expression +0:11 sine (global 4-component vector of float) +0:11 'input' (temp 4-component vector of float) 0:? Linker Objects +0:? 'AmbientColor' (temp 4-component vector of float) +0:? 'AmbientIntensity' (temp float) Linked fragment stage: @@ -45,10 +67,27 @@ Linked fragment stage: Shader version: 100 gl_FragCoord origin is upper left 0:? Sequence -0:12 Function Definition: PixelShaderFunction(vf4; (temp 4-component vector of float) +0:1 move second child to first child (temp 4-component vector of float) +0:1 'AmbientColor' (temp 4-component vector of float) +0:? Constant: +0:? 1.000000 +0:? 0.500000 +0:? 0.000000 +0:? 1.000000 +0:2 move second child to first child (temp float) +0:2 'AmbientIntensity' (temp float) +0:2 Constant: +0:2 0.100000 +0:13 Function Definition: PixelShaderFunction(vf4; (temp 4-component vector of float) 0:5 Function Parameters: 0:5 'input' (temp 4-component vector of float) 0:? Sequence +0:6 Branch: Return with expression +0:6 add (temp 4-component vector of float) +0:6 vector-scale (temp 4-component vector of float) +0:6 'input' (temp 4-component vector of float) +0:6 'AmbientIntensity' (temp float) +0:6 'AmbientColor' (temp 4-component vector of float) 0:7 Branch: Return with expression 0:7 add (temp 4-component vector of float) 0:7 component-wise multiply (temp 4-component vector of float) @@ -79,11 +118,16 @@ gl_FragCoord origin is upper left 0:10 'input' (temp 4-component vector of float) 0:10 Pre-Increment (temp 4-component vector of float) 0:10 'input' (temp 4-component vector of float) +0:11 Branch: Return with expression +0:11 sine (global 4-component vector of float) +0:11 'input' (temp 4-component vector of float) 0:? Linker Objects +0:? 'AmbientColor' (temp 4-component vector of float) +0:? 'AmbientIntensity' (temp float) // Module Version 10000 // Generated by (magic number): 80001 -// Id's are bound by 45 +// Id's are bound by 57 Capability Shader 1: ExtInstImport "GLSL.std.450" @@ -93,21 +137,24 @@ gl_FragCoord origin is upper left Source HLSL 100 Name 4 "PixelShaderFunction" Name 9 "input" + Name 12 "AmbientIntensity" + Name 15 "AmbientColor" 2: TypeVoid 3: TypeFunction 2 6: TypeFloat 32 7: TypeVector 6(float) 4 8: TypePointer Function 7(fvec4) - 27: 6(float) Constant 1065353216 + 11: TypePointer Function 6(float) + 36: 6(float) Constant 1065353216 4(PixelShaderFunction): 2 Function None 3 5: Label 9(input): 8(ptr) Variable Function +12(AmbientIntensity): 11(ptr) Variable Function +15(AmbientColor): 8(ptr) Variable Function 10: 7(fvec4) Load 9(input) - 11: 7(fvec4) Load 9(input) - 12: 7(fvec4) FMul 10 11 - 13: 7(fvec4) Load 9(input) - 14: 7(fvec4) Load 9(input) - 15: 7(fvec4) FMul 13 14 - 16: 7(fvec4) FAdd 12 15 - ReturnValue 16 + 13: 6(float) Load 12(AmbientIntensity) + 14: 7(fvec4) VectorTimesScalar 10 13 + 16: 7(fvec4) Load 15(AmbientColor) + 17: 7(fvec4) FAdd 14 16 + ReturnValue 17 FunctionEnd diff --git a/Test/hlsl.frag b/Test/hlsl.frag index ac6aa230b..1620ed588 100644 --- a/Test/hlsl.frag +++ b/Test/hlsl.frag @@ -1,11 +1,12 @@ -//float4 AmbientColor = float4(1, 0.5, 0, 1); -//float AmbientIntensity = 0.1; +float4 AmbientColor = float4(1, 0.5, 0, 1); +float AmbientIntensity = 0.1; float4 PixelShaderFunction(float4 input) : COLOR0 { -// return input * AmbientIntensity + AmbientColor; + return input * AmbientIntensity + AmbientColor; return input * input + input * input; return input + input * input + input; return ++input * -+-+--input; return input++ + ++input; + return sin(input); } diff --git a/hlsl/hlslGrammar.cpp b/hlsl/hlslGrammar.cpp index 2339c2d4f..9ab9f2c33 100755 --- a/hlsl/hlslGrammar.cpp +++ b/hlsl/hlslGrammar.cpp @@ -608,7 +608,7 @@ bool HlslGrammar::acceptConstructor(TIntermTyped*& node) return false; // arguments - TIntermAggregate* arguments = nullptr; + TIntermTyped* arguments = nullptr; if (! acceptArguments(constructorFunction, arguments)) { expected("constructor arguments"); return false; @@ -628,10 +628,17 @@ bool HlslGrammar::acceptConstructor(TIntermTyped*& node) // function_call // : [idToken] arguments // -bool HlslGrammar::acceptFunctionCall(HlslToken idToken, TIntermTyped*&) +bool HlslGrammar::acceptFunctionCall(HlslToken idToken, TIntermTyped*& node) { - // todo - return false; + // arguments + TFunction* function = new TFunction(idToken.string, TType(EbtVoid)); + TIntermTyped* arguments = nullptr; + if (! acceptArguments(function, arguments)) + return false; + + node = parseContext.handleFunctionCall(idToken.loc, function, arguments); + + return true; } // arguments @@ -640,7 +647,7 @@ bool HlslGrammar::acceptFunctionCall(HlslToken idToken, TIntermTyped*&) // The arguments are pushed onto the 'function' argument list and // onto the 'arguments' aggregate. // -bool HlslGrammar::acceptArguments(TFunction* function, TIntermAggregate*& arguments) +bool HlslGrammar::acceptArguments(TFunction* function, TIntermTyped*& arguments) { // LEFT_PAREN if (! acceptTokenClass(EHTokLeftParen)) @@ -649,7 +656,7 @@ bool HlslGrammar::acceptArguments(TFunction* function, TIntermAggregate*& argume do { // expression TIntermTyped* arg; - if (! acceptExpression(arg)) + if (! acceptAssignmentExpression(arg)) break; // hook it up diff --git a/hlsl/hlslGrammar.h b/hlsl/hlslGrammar.h index 61d30affc..d834aa934 100755 --- a/hlsl/hlslGrammar.h +++ b/hlsl/hlslGrammar.h @@ -71,7 +71,7 @@ namespace glslang { bool acceptPostfixExpression(TIntermTyped*&); bool acceptConstructor(TIntermTyped*&); bool acceptFunctionCall(HlslToken, TIntermTyped*&); - bool acceptArguments(TFunction*, TIntermAggregate*&); + bool acceptArguments(TFunction*, TIntermTyped*&); bool acceptLiteral(TIntermTyped*&); bool acceptCompoundStatement(TIntermAggregate*&); bool acceptStatement(TIntermNode*&); diff --git a/hlsl/hlslParseHelper.cpp b/hlsl/hlslParseHelper.cpp index 138874445..0d67a1d70 100755 --- a/hlsl/hlslParseHelper.cpp +++ b/hlsl/hlslParseHelper.cpp @@ -754,12 +754,15 @@ TIntermAggregate* HlslParseContext::handleFunctionDefinition(const TSourceLoc& l return paramNodes; } -void HlslParseContext::handleFunctionArgument(TFunction* function, TIntermAggregate*& arguments, TIntermTyped* arg) +void HlslParseContext::handleFunctionArgument(TFunction* function, TIntermTyped*& arguments, TIntermTyped* newArg) { TParameter param = { 0, new TType }; - param.type->shallowCopy(arg->getType()); + param.type->shallowCopy(newArg->getType()); function->addParameter(param); - arguments = intermediate.growAggregate(arguments, arg); + if (arguments) + arguments = intermediate.growAggregate(arguments, newArg); + else + arguments = newArg; } // diff --git a/hlsl/hlslParseHelper.h b/hlsl/hlslParseHelper.h index 661fd97bb..ba5bcda37 100755 --- a/hlsl/hlslParseHelper.h +++ b/hlsl/hlslParseHelper.h @@ -83,7 +83,7 @@ public: TIntermTyped* handleDotDereference(const TSourceLoc&, TIntermTyped* base, const TString& field); TFunction* handleFunctionDeclarator(const TSourceLoc&, TFunction& function, bool prototype); TIntermAggregate* handleFunctionDefinition(const TSourceLoc&, TFunction&); - void handleFunctionArgument(TFunction*, TIntermAggregate*&, TIntermTyped*); + void handleFunctionArgument(TFunction*, TIntermTyped*& arguments, TIntermTyped* newArg); TIntermTyped* handleFunctionCall(const TSourceLoc&, TFunction*, TIntermNode*); TIntermTyped* handleLengthMethod(const TSourceLoc&, TFunction*, TIntermNode*); void addInputArgumentConversions(const TFunction&, TIntermNode*&) const;