Create unique names for unnamed parameters

TRAC #11873 HLSL requires parameter names in function prototypes Signed-off-by: Andrew Lewycky Signed-off-by: Daniel Koch Author: Nicolas Capens git-svn-id: https://angleproject.googlecode.com/svn/trunk@157 736b8ea6-26fd-11df-bfd4-992fa37f6226
parent bb885328
...@@ -12,6 +12,14 @@ ...@@ -12,6 +12,14 @@
namespace sh namespace sh
{ {
// Integer to TString conversion
TString str(int i)
{
char buffer[20];
sprintf(buffer, "%d", i);
return buffer;
}
OutputHLSL::OutputHLSL(TParseContext &context) : TIntermTraverser(true, true, true), mContext(context) OutputHLSL::OutputHLSL(TParseContext &context) : TIntermTraverser(true, true, true), mContext(context)
{ {
mUnfoldSelect = new UnfoldSelect(context, this); mUnfoldSelect = new UnfoldSelect(context, this);
...@@ -28,6 +36,8 @@ OutputHLSL::OutputHLSL(TParseContext &context) : TIntermTraverser(true, true, tr ...@@ -28,6 +36,8 @@ OutputHLSL::OutputHLSL(TParseContext &context) : TIntermTraverser(true, true, tr
mUsesEqualBVec2 = false; mUsesEqualBVec2 = false;
mUsesEqualBVec3 = false; mUsesEqualBVec3 = false;
mUsesEqualBVec4 = false; mUsesEqualBVec4 = false;
mArgumentIndex = 0;
} }
OutputHLSL::~OutputHLSL() OutputHLSL::~OutputHLSL()
...@@ -82,13 +92,11 @@ void OutputHLSL::header() ...@@ -82,13 +92,11 @@ void OutputHLSL::header()
} }
else if (qualifier == EvqVaryingIn || qualifier == EvqInvariantVaryingIn) else if (qualifier == EvqVaryingIn || qualifier == EvqInvariantVaryingIn)
{ {
char semantic[100];
sprintf(semantic, " : TEXCOORD%d", semanticIndex);
semanticIndex += type.isArray() ? type.getArraySize() : 1;
// Program linking depends on this exact format // Program linking depends on this exact format
varyingInput += " " + typeString(type) + " " + decorate(name) + arrayString(type) + semantic + ";\n"; varyingInput += " " + typeString(type) + " " + decorate(name) + arrayString(type) + " : TEXCOORD" + str(semanticIndex) + ";\n";
varyingGlobals += "static " + typeString(type) + " " + decorate(name) + arrayString(type) + " = " + initializer(type) + ";\n"; varyingGlobals += "static " + typeString(type) + " " + decorate(name) + arrayString(type) + " = " + initializer(type) + ";\n";
semanticIndex += type.isArray() ? type.getArraySize() : 1;
} }
else if (qualifier == EvqGlobal || qualifier == EvqTemporary) else if (qualifier == EvqGlobal || qualifier == EvqTemporary)
{ {
...@@ -176,12 +184,10 @@ void OutputHLSL::header() ...@@ -176,12 +184,10 @@ void OutputHLSL::header()
} }
else if (qualifier == EvqAttribute) else if (qualifier == EvqAttribute)
{ {
char semantic[100]; attributeInput += " " + typeString(type) + " " + decorate(name) + arrayString(type) + " : TEXCOORD" + str(semanticIndex) + ";\n";
sprintf(semantic, " : TEXCOORD%d", semanticIndex);
semanticIndex += type.isArray() ? type.getArraySize() : 1;
attributeInput += " " + typeString(type) + " " + decorate(name) + arrayString(type) + semantic + ";\n";
attributeGlobals += "static " + typeString(type) + " " + decorate(name) + arrayString(type) + " = " + initializer(type) + ";\n"; attributeGlobals += "static " + typeString(type) + " " + decorate(name) + arrayString(type) + " = " + initializer(type) + ";\n";
semanticIndex += type.isArray() ? type.getArraySize() : 1;
} }
else if (qualifier == EvqVaryingOut || qualifier == EvqInvariantVaryingOut) else if (qualifier == EvqVaryingOut || qualifier == EvqInvariantVaryingOut)
{ {
...@@ -1709,9 +1715,18 @@ TString OutputHLSL::argumentString(const TIntermSymbol *symbol) ...@@ -1709,9 +1715,18 @@ TString OutputHLSL::argumentString(const TIntermSymbol *symbol)
{ {
TQualifier qualifier = symbol->getQualifier(); TQualifier qualifier = symbol->getQualifier();
const TType &type = symbol->getType(); const TType &type = symbol->getType();
const TString &name = symbol->getSymbol(); TString name = symbol->getSymbol();
if (name.empty()) // HLSL demands named arguments, also for prototypes
{
name = "x" + str(mArgumentIndex++);
}
else
{
name = decorate(name);
}
return qualifierString(qualifier) + " " + typeString(type) + " " + decorate(name) + arrayString(type); return qualifierString(qualifier) + " " + typeString(type) + " " + name + arrayString(type);
} }
TString OutputHLSL::qualifierString(TQualifier qualifier) TString OutputHLSL::qualifierString(TQualifier qualifier)
...@@ -1791,10 +1806,7 @@ TString OutputHLSL::arrayString(const TType &type) ...@@ -1791,10 +1806,7 @@ TString OutputHLSL::arrayString(const TType &type)
return ""; return "";
} }
char buffer[100]; return "[" + str(type.getArraySize()) + "]";
sprintf(buffer, "[%d]", type.getArraySize());
return buffer;
} }
TString OutputHLSL::initializer(const TType &type) TString OutputHLSL::initializer(const TType &type)
......
...@@ -24,7 +24,6 @@ class OutputHLSL : public TIntermTraverser ...@@ -24,7 +24,6 @@ class OutputHLSL : public TIntermTraverser
TInfoSinkBase &getBodyStream(); TInfoSinkBase &getBodyStream();
static TString argumentString(const TIntermSymbol *symbol);
static TString qualifierString(TQualifier qualifier); static TString qualifierString(TQualifier qualifier);
static TString typeString(const TType &type); static TString typeString(const TType &type);
static TString arrayString(const TType &type); static TString arrayString(const TType &type);
...@@ -48,6 +47,7 @@ class OutputHLSL : public TIntermTraverser ...@@ -48,6 +47,7 @@ class OutputHLSL : public TIntermTraverser
bool isSingleStatement(TIntermNode *node); bool isSingleStatement(TIntermNode *node);
bool handleExcessiveLoop(TIntermLoop *node); bool handleExcessiveLoop(TIntermLoop *node);
void outputTriplet(Visit visit, const char *preString, const char *inString, const char *postString); void outputTriplet(Visit visit, const char *preString, const char *inString, const char *postString);
TString argumentString(const TIntermSymbol *symbol);
TParseContext &mContext; TParseContext &mContext;
UnfoldSelect *mUnfoldSelect; UnfoldSelect *mUnfoldSelect;
...@@ -70,6 +70,8 @@ class OutputHLSL : public TIntermTraverser ...@@ -70,6 +70,8 @@ class OutputHLSL : public TIntermTraverser
bool mUsesEqualBVec2; bool mUsesEqualBVec2;
bool mUsesEqualBVec3; bool mUsesEqualBVec3;
bool mUsesEqualBVec4; bool mUsesEqualBVec4;
int mArgumentIndex; // For creating unique argument names
}; };
} }
......
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