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) {
case EOpIndexDirect:
case EOpIndexIndirect: return "[]";
case EOpIndexDirectStruct: return ".";
case EOpIndexDirectStruct:
case EOpIndexDirectInterfaceBlock: return ".";
case EOpVectorSwizzle: return ".";
case EOpAdd: return "+";
case EOpSub: return "-";
......
......@@ -156,6 +156,18 @@ int OutputHLSL::vectorSize(const TType &type) const
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()
{
ShShaderType shaderType = mContext.shaderType;
......@@ -200,7 +212,8 @@ void OutputHLSL::header()
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 TTypeList &typeList = *interfaceBlockType.getStruct();
......@@ -208,7 +221,8 @@ void OutputHLSL::header()
for (unsigned int typeIndex = 0; typeIndex < typeList.size(); typeIndex++)
{
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
......@@ -218,6 +232,11 @@ void OutputHLSL::header()
interfaceBlocks += "cbuffer " + blockName + " : register(b" + str(interfaceBlock.registerIndex) + ")\n"
"{\n";
if (interfaceBlockType.hasInstanceName())
{
interfaceBlocks += " struct {\n";
}
for (unsigned int typeIndex = 0; typeIndex < typeList.size(); typeIndex++)
{
// TODO: padding for standard layout
......@@ -225,6 +244,11 @@ void OutputHLSL::header()
interfaceBlocks += " " + typeString(memberType) + " " + decorate(memberType.getFieldName()) + arrayString(memberType) + ";\n";
}
if (interfaceBlockType.hasInstanceName())
{
interfaceBlocks += " } " + decorate(interfaceBlockType.getInstanceName()) + ";\n";
}
interfaceBlocks += "};\n\n";
}
......@@ -1204,6 +1228,12 @@ void OutputHLSL::visitSymbol(TIntermSymbol *node)
mReferencedInterfaceBlocks[interfaceBlockTypeName] = node;
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
{
mReferencedUniforms[name] = node;
......@@ -1338,6 +1368,7 @@ bool OutputHLSL::visitBinary(Visit visit, TIntermBinary *node)
case EOpIndexDirect: outputTriplet(visit, "", "[", "]"); break;
case EOpIndexIndirect: outputTriplet(visit, "", "[", "]"); break;
case EOpIndexDirectStruct:
case EOpIndexDirectInterfaceBlock:
if (visit == InVisit)
{
out << "." + decorateField(node->getType().getFieldName(), node->getLeft()->getType());
......
......@@ -173,6 +173,8 @@ class OutputHLSL : public TIntermTraverser
int uniformRegister(TIntermSymbol *uniform);
void declareUniformToList(const TType &type, const TString &name, int index, ActiveUniforms& output);
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 glVariablePrecision(const TType &type);
......
......@@ -275,6 +275,7 @@ bool TParseContext::lValueErrorCheck(int line, const char* op, TIntermTyped* nod
case EOpIndexDirect:
case EOpIndexIndirect:
case EOpIndexDirectStruct:
case EOpIndexDirectInterfaceBlock:
return lValueErrorCheck(line, op, binaryNode->getLeft());
case EOpVectorSwizzle:
errorReturn = lValueErrorCheck(line, op, binaryNode->getLeft());
......
......@@ -103,6 +103,7 @@ bool TOutputTraverser::visitBinary(Visit visit, TIntermBinary* node)
case EOpIndexDirect: out << "direct index"; break;
case EOpIndexIndirect: out << "indirect index"; 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 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