Add support to the GLSL to HLSL translator for interface blocks with instance names.

TRAC #22930 Signed-off-by: Nicolas Capens Signed-off-by: Geoff Lang Author: Jamie Madill git-svn-id: https://angleproject.googlecode.com/svn/branches/es3proto@2345 736b8ea6-26fd-11df-bfd4-992fa37f6226
parent 4a643ae4
...@@ -42,7 +42,8 @@ const char* getOperatorString(TOperator op) { ...@@ -42,7 +42,8 @@ const char* getOperatorString(TOperator op) {
case EOpIndexDirect: case EOpIndexDirect:
case EOpIndexIndirect: return "[]"; case EOpIndexIndirect: return "[]";
case EOpIndexDirectStruct: return "."; case EOpIndexDirectStruct:
case EOpIndexDirectInterfaceBlock: return ".";
case EOpVectorSwizzle: return "."; case EOpVectorSwizzle: return ".";
case EOpAdd: return "+"; case EOpAdd: return "+";
case EOpSub: return "-"; case EOpSub: return "-";
......
...@@ -156,6 +156,18 @@ int OutputHLSL::vectorSize(const TType &type) const ...@@ -156,6 +156,18 @@ int OutputHLSL::vectorSize(const TType &type) const
return elementSize * arraySize; return elementSize * arraySize;
} }
TString OutputHLSL::interfaceBlockUniformName(const TType &interfaceBlockType, const TType &uniformType)
{
if (interfaceBlockType.hasInstanceName())
{
return interfaceBlockType.getTypeName() + "." + uniformType.getFieldName();
}
else
{
return uniformType.getFieldName();
}
}
void OutputHLSL::header() void OutputHLSL::header()
{ {
ShShaderType shaderType = mContext.shaderType; ShShaderType shaderType = mContext.shaderType;
...@@ -200,7 +212,8 @@ void OutputHLSL::header() ...@@ -200,7 +212,8 @@ void OutputHLSL::header()
for (ReferencedSymbols::const_iterator interfaceBlockIt = mReferencedInterfaceBlocks.begin(); interfaceBlockIt != mReferencedInterfaceBlocks.end(); interfaceBlockIt++) for (ReferencedSymbols::const_iterator interfaceBlockIt = mReferencedInterfaceBlocks.begin(); interfaceBlockIt != mReferencedInterfaceBlocks.end(); interfaceBlockIt++)
{ {
const TType &interfaceBlockType = *interfaceBlockIt->second->getType().getInterfaceBlockType(); const TType &nodeType = interfaceBlockIt->second->getType();
const TType &interfaceBlockType = nodeType.isInterfaceBlockMember() ? *nodeType.getInterfaceBlockType() : nodeType;
const TString &blockName = interfaceBlockType.getTypeName(); const TString &blockName = interfaceBlockType.getTypeName();
const TTypeList &typeList = *interfaceBlockType.getStruct(); const TTypeList &typeList = *interfaceBlockType.getStruct();
...@@ -208,7 +221,8 @@ void OutputHLSL::header() ...@@ -208,7 +221,8 @@ void OutputHLSL::header()
for (unsigned int typeIndex = 0; typeIndex < typeList.size(); typeIndex++) for (unsigned int typeIndex = 0; typeIndex < typeList.size(); typeIndex++)
{ {
const TType &memberType = *typeList[typeIndex].type; const TType &memberType = *typeList[typeIndex].type;
declareUniformToList(memberType, memberType.getFieldName(), typeIndex, interfaceBlock.activeUniforms); const TString &fullUniformName = interfaceBlockUniformName(interfaceBlockType, memberType);
declareUniformToList(memberType, fullUniformName, typeIndex, interfaceBlock.activeUniforms);
} }
// TODO: handle other block layouts // TODO: handle other block layouts
...@@ -218,6 +232,11 @@ void OutputHLSL::header() ...@@ -218,6 +232,11 @@ void OutputHLSL::header()
interfaceBlocks += "cbuffer " + blockName + " : register(b" + str(interfaceBlock.registerIndex) + ")\n" interfaceBlocks += "cbuffer " + blockName + " : register(b" + str(interfaceBlock.registerIndex) + ")\n"
"{\n"; "{\n";
if (interfaceBlockType.hasInstanceName())
{
interfaceBlocks += " struct {\n";
}
for (unsigned int typeIndex = 0; typeIndex < typeList.size(); typeIndex++) for (unsigned int typeIndex = 0; typeIndex < typeList.size(); typeIndex++)
{ {
// TODO: padding for standard layout // TODO: padding for standard layout
...@@ -225,6 +244,11 @@ void OutputHLSL::header() ...@@ -225,6 +244,11 @@ void OutputHLSL::header()
interfaceBlocks += " " + typeString(memberType) + " " + decorate(memberType.getFieldName()) + arrayString(memberType) + ";\n"; interfaceBlocks += " " + typeString(memberType) + " " + decorate(memberType.getFieldName()) + arrayString(memberType) + ";\n";
} }
if (interfaceBlockType.hasInstanceName())
{
interfaceBlocks += " } " + decorate(interfaceBlockType.getInstanceName()) + ";\n";
}
interfaceBlocks += "};\n\n"; interfaceBlocks += "};\n\n";
} }
...@@ -1204,6 +1228,12 @@ void OutputHLSL::visitSymbol(TIntermSymbol *node) ...@@ -1204,6 +1228,12 @@ void OutputHLSL::visitSymbol(TIntermSymbol *node)
mReferencedInterfaceBlocks[interfaceBlockTypeName] = node; mReferencedInterfaceBlocks[interfaceBlockTypeName] = node;
out << decorateUniform(name, node->getType()); out << decorateUniform(name, node->getType());
} }
else if (node->getBasicType() == EbtInterfaceBlock)
{
const TString& interfaceBlockTypeName = node->getType().getTypeName();
mReferencedInterfaceBlocks[interfaceBlockTypeName] = node;
out << decorateUniform(name, node->getType());
}
else else
{ {
mReferencedUniforms[name] = node; mReferencedUniforms[name] = node;
...@@ -1338,6 +1368,7 @@ bool OutputHLSL::visitBinary(Visit visit, TIntermBinary *node) ...@@ -1338,6 +1368,7 @@ bool OutputHLSL::visitBinary(Visit visit, TIntermBinary *node)
case EOpIndexDirect: outputTriplet(visit, "", "[", "]"); break; case EOpIndexDirect: outputTriplet(visit, "", "[", "]"); break;
case EOpIndexIndirect: outputTriplet(visit, "", "[", "]"); break; case EOpIndexIndirect: outputTriplet(visit, "", "[", "]"); break;
case EOpIndexDirectStruct: case EOpIndexDirectStruct:
case EOpIndexDirectInterfaceBlock:
if (visit == InVisit) if (visit == InVisit)
{ {
out << "." + decorateField(node->getType().getFieldName(), node->getLeft()->getType()); out << "." + decorateField(node->getType().getFieldName(), node->getLeft()->getType());
......
...@@ -173,6 +173,8 @@ class OutputHLSL : public TIntermTraverser ...@@ -173,6 +173,8 @@ class OutputHLSL : public TIntermTraverser
int uniformRegister(TIntermSymbol *uniform); int uniformRegister(TIntermSymbol *uniform);
void declareUniformToList(const TType &type, const TString &name, int index, ActiveUniforms& output); void declareUniformToList(const TType &type, const TString &name, int index, ActiveUniforms& output);
void declareUniform(const TType &type, const TString &name, int index); void declareUniform(const TType &type, const TString &name, int index);
TString interfaceBlockUniformName(const TType &interfaceBlockType, const TType &uniformType);
static GLenum glVariableType(const TType &type); static GLenum glVariableType(const TType &type);
static GLenum glVariablePrecision(const TType &type); static GLenum glVariablePrecision(const TType &type);
......
...@@ -275,6 +275,7 @@ bool TParseContext::lValueErrorCheck(int line, const char* op, TIntermTyped* nod ...@@ -275,6 +275,7 @@ bool TParseContext::lValueErrorCheck(int line, const char* op, TIntermTyped* nod
case EOpIndexDirect: case EOpIndexDirect:
case EOpIndexIndirect: case EOpIndexIndirect:
case EOpIndexDirectStruct: case EOpIndexDirectStruct:
case EOpIndexDirectInterfaceBlock:
return lValueErrorCheck(line, op, binaryNode->getLeft()); return lValueErrorCheck(line, op, binaryNode->getLeft());
case EOpVectorSwizzle: case EOpVectorSwizzle:
errorReturn = lValueErrorCheck(line, op, binaryNode->getLeft()); errorReturn = lValueErrorCheck(line, op, binaryNode->getLeft());
......
...@@ -103,6 +103,7 @@ bool TOutputTraverser::visitBinary(Visit visit, TIntermBinary* node) ...@@ -103,6 +103,7 @@ bool TOutputTraverser::visitBinary(Visit visit, TIntermBinary* node)
case EOpIndexDirect: out << "direct index"; break; case EOpIndexDirect: out << "direct index"; break;
case EOpIndexIndirect: out << "indirect index"; break; case EOpIndexIndirect: out << "indirect index"; break;
case EOpIndexDirectStruct: out << "direct index for structure"; break; case EOpIndexDirectStruct: out << "direct index for structure"; break;
case EOpIndexDirectInterfaceBlock: out << "direct index for interface block"; break;
case EOpVectorSwizzle: out << "vector swizzle"; break; case EOpVectorSwizzle: out << "vector swizzle"; break;
case EOpAdd: out << "add"; break; case EOpAdd: out << "add"; break;
......
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