Unverified Commit b2abe2f0 by John Kessenich Committed by GitHub

Merge pull request #1169 from LoopDawg/cbuffer-identifier

HLSL: allow keyword-identifiers as cbuffer/struct names.
parents c4372e43 7ee29ba7
cbuffer ConstantBuffer : register( b0 )
{
matrix World;
matrix View;
matrix Projection;
};
struct VS_INPUT
{
float4 Pos : POSITION;
float3 Norm : NORMAL;
};
struct PS_INPUT
{
float4 Pos : SV_POSITION;
float3 Norm : TEXCOORD0;
};
PS_INPUT main( VS_INPUT input )
{
int ConstantBuffer = 42; // test ConstantBuffer as an identifier
PS_INPUT output = (PS_INPUT)0;
output.Pos = mul( input.Pos, World );
output.Pos = mul( output.Pos, View );
output.Pos = mul( output.Pos, Projection );
output.Norm = mul( input.Norm, World ); // Work when output.Norm = mul( input.Norm, (float3x3)World );
return output;
}
...@@ -108,6 +108,7 @@ INSTANTIATE_TEST_CASE_P( ...@@ -108,6 +108,7 @@ INSTANTIATE_TEST_CASE_P(
{"hlsl.calculatelod.dx10.frag", "main"}, {"hlsl.calculatelod.dx10.frag", "main"},
{"hlsl.calculatelodunclamped.dx10.frag", "main"}, {"hlsl.calculatelodunclamped.dx10.frag", "main"},
{"hlsl.cast.frag", "PixelShaderFunction"}, {"hlsl.cast.frag", "PixelShaderFunction"},
{"hlsl.cbuffer-identifier.vert", "main"},
{"hlsl.charLit.vert", "main"}, {"hlsl.charLit.vert", "main"},
{"hlsl.clip.frag", "main"}, {"hlsl.clip.frag", "main"},
{"hlsl.clipdistance-1.frag", "main"}, {"hlsl.clipdistance-1.frag", "main"},
......
...@@ -2029,10 +2029,18 @@ bool HlslGrammar::acceptStruct(TType& type, TIntermNode*& nodeList) ...@@ -2029,10 +2029,18 @@ bool HlslGrammar::acceptStruct(TType& type, TIntermNode*& nodeList)
// Now known to be one of CBUFFER, TBUFFER, CLASS, or STRUCT // Now known to be one of CBUFFER, TBUFFER, CLASS, or STRUCT
// IDENTIFIER
// IDENTIFIER. It might also be a keyword which can double as an identifier.
// For example: 'cbuffer ConstantBuffer' or 'struct ConstantBuffer' is legal.
// 'cbuffer int' is also legal, and 'struct int' appears rejected only because
// it attempts to redefine the 'int' type.
const char* idString = getTypeString(peek());
TString structName = ""; TString structName = "";
if (peekTokenClass(EHTokIdentifier)) { if (peekTokenClass(EHTokIdentifier) || idString != nullptr) {
structName = *token.string; if (idString != nullptr)
structName = *idString;
else
structName = *token.string;
advanceToken(); advanceToken();
} }
...@@ -4056,6 +4064,7 @@ const char* HlslGrammar::getTypeString(EHlslTokenClass tokenClass) const ...@@ -4056,6 +4064,7 @@ const char* HlslGrammar::getTypeString(EHlslTokenClass tokenClass) const
case EHTokMin10float: return "min10float"; case EHTokMin10float: return "min10float";
case EHTokMin16int: return "min16int"; case EHTokMin16int: return "min16int";
case EHTokMin12int: return "min12int"; case EHTokMin12int: return "min12int";
case EHTokConstantBuffer: return "ConstantBuffer";
default: default:
return nullptr; return nullptr;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment