mirror of
https://github.com/KhronosGroup/glslang
synced 2024-11-08 11:30:06 +00:00
HLSL: Add function call syntax and AST building.
This commit is contained in:
parent
9db3117e38
commit
4678ca9dac
@ -2,10 +2,27 @@ hlsl.frag
|
|||||||
Shader version: 100
|
Shader version: 100
|
||||||
gl_FragCoord origin is upper left
|
gl_FragCoord origin is upper left
|
||||||
0:? Sequence
|
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 Function Parameters:
|
||||||
0:5 'input' (temp 4-component vector of float)
|
0:5 'input' (temp 4-component vector of float)
|
||||||
0:? Sequence
|
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 Branch: Return with expression
|
||||||
0:7 add (temp 4-component vector of float)
|
0:7 add (temp 4-component vector of float)
|
||||||
0:7 component-wise multiply (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 'input' (temp 4-component vector of float)
|
||||||
0:10 Pre-Increment (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: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:? Linker Objects
|
||||||
|
0:? 'AmbientColor' (temp 4-component vector of float)
|
||||||
|
0:? 'AmbientIntensity' (temp float)
|
||||||
|
|
||||||
|
|
||||||
Linked fragment stage:
|
Linked fragment stage:
|
||||||
@ -45,10 +67,27 @@ Linked fragment stage:
|
|||||||
Shader version: 100
|
Shader version: 100
|
||||||
gl_FragCoord origin is upper left
|
gl_FragCoord origin is upper left
|
||||||
0:? Sequence
|
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 Function Parameters:
|
||||||
0:5 'input' (temp 4-component vector of float)
|
0:5 'input' (temp 4-component vector of float)
|
||||||
0:? Sequence
|
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 Branch: Return with expression
|
||||||
0:7 add (temp 4-component vector of float)
|
0:7 add (temp 4-component vector of float)
|
||||||
0:7 component-wise multiply (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 'input' (temp 4-component vector of float)
|
||||||
0:10 Pre-Increment (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: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:? Linker Objects
|
||||||
|
0:? 'AmbientColor' (temp 4-component vector of float)
|
||||||
|
0:? 'AmbientIntensity' (temp float)
|
||||||
|
|
||||||
// Module Version 10000
|
// Module Version 10000
|
||||||
// Generated by (magic number): 80001
|
// Generated by (magic number): 80001
|
||||||
// Id's are bound by 45
|
// Id's are bound by 57
|
||||||
|
|
||||||
Capability Shader
|
Capability Shader
|
||||||
1: ExtInstImport "GLSL.std.450"
|
1: ExtInstImport "GLSL.std.450"
|
||||||
@ -93,21 +137,24 @@ gl_FragCoord origin is upper left
|
|||||||
Source HLSL 100
|
Source HLSL 100
|
||||||
Name 4 "PixelShaderFunction"
|
Name 4 "PixelShaderFunction"
|
||||||
Name 9 "input"
|
Name 9 "input"
|
||||||
|
Name 12 "AmbientIntensity"
|
||||||
|
Name 15 "AmbientColor"
|
||||||
2: TypeVoid
|
2: TypeVoid
|
||||||
3: TypeFunction 2
|
3: TypeFunction 2
|
||||||
6: TypeFloat 32
|
6: TypeFloat 32
|
||||||
7: TypeVector 6(float) 4
|
7: TypeVector 6(float) 4
|
||||||
8: TypePointer Function 7(fvec4)
|
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
|
4(PixelShaderFunction): 2 Function None 3
|
||||||
5: Label
|
5: Label
|
||||||
9(input): 8(ptr) Variable Function
|
9(input): 8(ptr) Variable Function
|
||||||
|
12(AmbientIntensity): 11(ptr) Variable Function
|
||||||
|
15(AmbientColor): 8(ptr) Variable Function
|
||||||
10: 7(fvec4) Load 9(input)
|
10: 7(fvec4) Load 9(input)
|
||||||
11: 7(fvec4) Load 9(input)
|
13: 6(float) Load 12(AmbientIntensity)
|
||||||
12: 7(fvec4) FMul 10 11
|
14: 7(fvec4) VectorTimesScalar 10 13
|
||||||
13: 7(fvec4) Load 9(input)
|
16: 7(fvec4) Load 15(AmbientColor)
|
||||||
14: 7(fvec4) Load 9(input)
|
17: 7(fvec4) FAdd 14 16
|
||||||
15: 7(fvec4) FMul 13 14
|
ReturnValue 17
|
||||||
16: 7(fvec4) FAdd 12 15
|
|
||||||
ReturnValue 16
|
|
||||||
FunctionEnd
|
FunctionEnd
|
||||||
|
@ -1,11 +1,12 @@
|
|||||||
//float4 AmbientColor = float4(1, 0.5, 0, 1);
|
float4 AmbientColor = float4(1, 0.5, 0, 1);
|
||||||
//float AmbientIntensity = 0.1;
|
float AmbientIntensity = 0.1;
|
||||||
|
|
||||||
float4 PixelShaderFunction(float4 input) : COLOR0
|
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 * input + input;
|
return input + input * input + input;
|
||||||
return ++input * -+-+--input;
|
return ++input * -+-+--input;
|
||||||
return input++ + ++input;
|
return input++ + ++input;
|
||||||
|
return sin(input);
|
||||||
}
|
}
|
||||||
|
@ -608,7 +608,7 @@ bool HlslGrammar::acceptConstructor(TIntermTyped*& node)
|
|||||||
return false;
|
return false;
|
||||||
|
|
||||||
// arguments
|
// arguments
|
||||||
TIntermAggregate* arguments = nullptr;
|
TIntermTyped* arguments = nullptr;
|
||||||
if (! acceptArguments(constructorFunction, arguments)) {
|
if (! acceptArguments(constructorFunction, arguments)) {
|
||||||
expected("constructor arguments");
|
expected("constructor arguments");
|
||||||
return false;
|
return false;
|
||||||
@ -628,10 +628,17 @@ bool HlslGrammar::acceptConstructor(TIntermTyped*& node)
|
|||||||
// function_call
|
// function_call
|
||||||
// : [idToken] arguments
|
// : [idToken] arguments
|
||||||
//
|
//
|
||||||
bool HlslGrammar::acceptFunctionCall(HlslToken idToken, TIntermTyped*&)
|
bool HlslGrammar::acceptFunctionCall(HlslToken idToken, TIntermTyped*& node)
|
||||||
{
|
{
|
||||||
// todo
|
// arguments
|
||||||
return false;
|
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
|
// arguments
|
||||||
@ -640,7 +647,7 @@ bool HlslGrammar::acceptFunctionCall(HlslToken idToken, TIntermTyped*&)
|
|||||||
// The arguments are pushed onto the 'function' argument list and
|
// The arguments are pushed onto the 'function' argument list and
|
||||||
// onto the 'arguments' aggregate.
|
// onto the 'arguments' aggregate.
|
||||||
//
|
//
|
||||||
bool HlslGrammar::acceptArguments(TFunction* function, TIntermAggregate*& arguments)
|
bool HlslGrammar::acceptArguments(TFunction* function, TIntermTyped*& arguments)
|
||||||
{
|
{
|
||||||
// LEFT_PAREN
|
// LEFT_PAREN
|
||||||
if (! acceptTokenClass(EHTokLeftParen))
|
if (! acceptTokenClass(EHTokLeftParen))
|
||||||
@ -649,7 +656,7 @@ bool HlslGrammar::acceptArguments(TFunction* function, TIntermAggregate*& argume
|
|||||||
do {
|
do {
|
||||||
// expression
|
// expression
|
||||||
TIntermTyped* arg;
|
TIntermTyped* arg;
|
||||||
if (! acceptExpression(arg))
|
if (! acceptAssignmentExpression(arg))
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// hook it up
|
// hook it up
|
||||||
|
@ -71,7 +71,7 @@ namespace glslang {
|
|||||||
bool acceptPostfixExpression(TIntermTyped*&);
|
bool acceptPostfixExpression(TIntermTyped*&);
|
||||||
bool acceptConstructor(TIntermTyped*&);
|
bool acceptConstructor(TIntermTyped*&);
|
||||||
bool acceptFunctionCall(HlslToken, TIntermTyped*&);
|
bool acceptFunctionCall(HlslToken, TIntermTyped*&);
|
||||||
bool acceptArguments(TFunction*, TIntermAggregate*&);
|
bool acceptArguments(TFunction*, TIntermTyped*&);
|
||||||
bool acceptLiteral(TIntermTyped*&);
|
bool acceptLiteral(TIntermTyped*&);
|
||||||
bool acceptCompoundStatement(TIntermAggregate*&);
|
bool acceptCompoundStatement(TIntermAggregate*&);
|
||||||
bool acceptStatement(TIntermNode*&);
|
bool acceptStatement(TIntermNode*&);
|
||||||
|
@ -754,12 +754,15 @@ TIntermAggregate* HlslParseContext::handleFunctionDefinition(const TSourceLoc& l
|
|||||||
return paramNodes;
|
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 };
|
TParameter param = { 0, new TType };
|
||||||
param.type->shallowCopy(arg->getType());
|
param.type->shallowCopy(newArg->getType());
|
||||||
function->addParameter(param);
|
function->addParameter(param);
|
||||||
arguments = intermediate.growAggregate(arguments, arg);
|
if (arguments)
|
||||||
|
arguments = intermediate.growAggregate(arguments, newArg);
|
||||||
|
else
|
||||||
|
arguments = newArg;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
|
@ -83,7 +83,7 @@ public:
|
|||||||
TIntermTyped* handleDotDereference(const TSourceLoc&, TIntermTyped* base, const TString& field);
|
TIntermTyped* handleDotDereference(const TSourceLoc&, TIntermTyped* base, const TString& field);
|
||||||
TFunction* handleFunctionDeclarator(const TSourceLoc&, TFunction& function, bool prototype);
|
TFunction* handleFunctionDeclarator(const TSourceLoc&, TFunction& function, bool prototype);
|
||||||
TIntermAggregate* handleFunctionDefinition(const TSourceLoc&, TFunction&);
|
TIntermAggregate* handleFunctionDefinition(const TSourceLoc&, TFunction&);
|
||||||
void handleFunctionArgument(TFunction*, TIntermAggregate*&, TIntermTyped*);
|
void handleFunctionArgument(TFunction*, TIntermTyped*& arguments, TIntermTyped* newArg);
|
||||||
TIntermTyped* handleFunctionCall(const TSourceLoc&, TFunction*, TIntermNode*);
|
TIntermTyped* handleFunctionCall(const TSourceLoc&, TFunction*, TIntermNode*);
|
||||||
TIntermTyped* handleLengthMethod(const TSourceLoc&, TFunction*, TIntermNode*);
|
TIntermTyped* handleLengthMethod(const TSourceLoc&, TFunction*, TIntermNode*);
|
||||||
void addInputArgumentConversions(const TFunction&, TIntermNode*&) const;
|
void addInputArgumentConversions(const TFunction&, TIntermNode*&) const;
|
||||||
|
Loading…
Reference in New Issue
Block a user