Compiler - access struct fields
TRAC #11379
Signed-off-by: Daniel Koch
Author: Nicolas Capens <nicolas@transgaming.com>
git-svn-id: https://angleproject.googlecode.com/svn/trunk@14 736b8ea6-26fd-11df-bfd4-992fa37f6226
diff --git a/Compiler/OutputHLSL.cpp b/Compiler/OutputHLSL.cpp
index bf2491d..4870a6f 100644
--- a/Compiler/OutputHLSL.cpp
+++ b/Compiler/OutputHLSL.cpp
@@ -387,25 +387,25 @@
switch (node->getOp())
{
- case EOpAssign: outputTriplet(visit, "(", " = ", ")"); break;
- case EOpInitialize: outputTriplet(visit, NULL, " = ", NULL); break;
- case EOpAddAssign: outputTriplet(visit, NULL, " += ", NULL); break;
- case EOpSubAssign: outputTriplet(visit, NULL, " -= ", NULL); break;
- case EOpMulAssign: outputTriplet(visit, NULL, " *= ", NULL); break;
+ case EOpAssign: outputTriplet(visit, "(", " = ", ")"); break;
+ case EOpInitialize: outputTriplet(visit, NULL, " = ", NULL); break;
+ case EOpAddAssign: outputTriplet(visit, NULL, " += ", NULL); break;
+ case EOpSubAssign: outputTriplet(visit, NULL, " -= ", NULL); break;
+ case EOpMulAssign: outputTriplet(visit, NULL, " *= ", NULL); break;
case EOpVectorTimesMatrixAssign: UNIMPLEMENTED(); /* FIXME */ out << "matrix mult second child into first child"; break;
- case EOpVectorTimesScalarAssign: outputTriplet(visit, NULL, " *= ", NULL); break;
+ case EOpVectorTimesScalarAssign: outputTriplet(visit, NULL, " *= ", NULL); break;
case EOpMatrixTimesScalarAssign: UNIMPLEMENTED(); /* FIXME */ out << "matrix scale second child into first child"; break;
case EOpMatrixTimesMatrixAssign: UNIMPLEMENTED(); /* FIXME */ out << "matrix mult second child into first child"; break;
- case EOpDivAssign: outputTriplet(visit, NULL, " /= ", NULL); break;
+ case EOpDivAssign: outputTriplet(visit, NULL, " /= ", NULL); break;
case EOpModAssign: UNIMPLEMENTED(); /* FIXME */ out << "mod second child into first child"; break;
case EOpAndAssign: UNIMPLEMENTED(); /* FIXME */ out << "and second child into first child"; break;
case EOpInclusiveOrAssign: UNIMPLEMENTED(); /* FIXME */ out << "or second child into first child"; break;
case EOpExclusiveOrAssign: UNIMPLEMENTED(); /* FIXME */ out << "exclusive or second child into first child"; break;
case EOpLeftShiftAssign: UNIMPLEMENTED(); /* FIXME */ out << "left shift second child into first child"; break;
case EOpRightShiftAssign: UNIMPLEMENTED(); /* FIXME */ out << "right shift second child into first child"; break;
- case EOpIndexDirect: outputTriplet(visit, NULL, "[", "]"); break;
- case EOpIndexIndirect: outputTriplet(visit, NULL, "[", "]"); break;
- case EOpIndexDirectStruct: UNIMPLEMENTED(); /* FIXME */ out << "direct index for structure"; break;
+ case EOpIndexDirect: outputTriplet(visit, NULL, "[", "]"); break;
+ case EOpIndexIndirect: outputTriplet(visit, NULL, "[", "]"); break;
+ case EOpIndexDirectStruct: outputTriplet(visit, NULL, ".", NULL); break;
case EOpVectorSwizzle:
if (visit == InVisit)
{
@@ -540,9 +540,9 @@
case EOpFract: outputTriplet(visit, "frac(", NULL, ")"); break;
case EOpLength: outputTriplet(visit, "length(", NULL, ")"); break;
case EOpNormalize: outputTriplet(visit, "normalize(", NULL, ")"); break;
-// case EOpDPdx: outputTriplet(visit, "ddx(", NULL, ")"); break;
-// case EOpDPdy: outputTriplet(visit, "ddy(", NULL, ")"); break;
-// case EOpFwidth: outputTriplet(visit, "fwidth(", NULL, ")"); break;
+// case EOpDPdx: outputTriplet(visit, "ddx(", NULL, ")"); break;
+// case EOpDPdy: outputTriplet(visit, "ddy(", NULL, ")"); break;
+// case EOpFwidth: outputTriplet(visit, "fwidth(", NULL, ")"); break;
case EOpAny: outputTriplet(visit, "any(", NULL, ")"); break;
case EOpAll: outputTriplet(visit, "all(", NULL, ")"); break;
default: UNREACHABLE();
@@ -919,100 +919,109 @@
{
TInfoSinkBase &out = context.infoSink.obj;
- int size = node->getType().getObjectSize();
- bool matrix = node->getType().isMatrix();
- TBasicType type = node->getUnionArrayPointer()[0].getType();
+ TType &type = node->getType();
- switch (type)
- {
- case EbtBool:
- if (!matrix)
- {
- switch (size)
- {
- case 1: out << "bool("; break;
- case 2: out << "bool2("; break;
- case 3: out << "bool3("; break;
- case 4: out << "bool4("; break;
- default: UNREACHABLE();
- }
- }
- else
- {
- UNIMPLEMENTED();
- }
- break;
- case EbtFloat:
- if (!matrix)
- {
- switch (size)
- {
- case 1: out << "float("; break;
- case 2: out << "float2("; break;
- case 3: out << "float3("; break;
- case 4: out << "float4("; break;
- default: UNREACHABLE();
- }
- }
- else
- {
- switch (size)
- {
- case 4: out << "float2x2("; break;
- case 9: out << "float3x3("; break;
- case 16: out << "float4x4("; break;
- default: UNREACHABLE();
- }
- }
- break;
- case EbtInt:
- if (!matrix)
- {
- switch (size)
- {
- case 1: out << "int("; break;
- case 2: out << "int2("; break;
- case 3: out << "int3("; break;
- case 4: out << "int4("; break;
- default: UNREACHABLE();
- }
- }
- else
- {
- UNIMPLEMENTED();
- }
- break;
- default:
- UNIMPLEMENTED(); // FIXME
- }
-
- for (int i = 0; i < size; i++)
- {
- switch (type)
+ if(type.isField())
+ {
+ out << type.getFieldName();
+ }
+ else
+ {
+ int size = type.getObjectSize();
+ bool matrix = type.isMatrix();
+ TBasicType basicType = node->getUnionArrayPointer()[0].getType();
+
+ switch (basicType)
{
case EbtBool:
- if (node->getUnionArrayPointer()[i].getBConst())
+ if (!matrix)
{
- out << "true";
+ switch (size)
+ {
+ case 1: out << "bool("; break;
+ case 2: out << "bool2("; break;
+ case 3: out << "bool3("; break;
+ case 4: out << "bool4("; break;
+ default: UNREACHABLE();
+ }
}
else
{
- out << "false";
+ UNIMPLEMENTED();
}
break;
case EbtFloat:
- out << node->getUnionArrayPointer()[i].getFConst();
+ if (!matrix)
+ {
+ switch (size)
+ {
+ case 1: out << "float("; break;
+ case 2: out << "float2("; break;
+ case 3: out << "float3("; break;
+ case 4: out << "float4("; break;
+ default: UNREACHABLE();
+ }
+ }
+ else
+ {
+ switch (size)
+ {
+ case 4: out << "float2x2("; break;
+ case 9: out << "float3x3("; break;
+ case 16: out << "float4x4("; break;
+ default: UNREACHABLE();
+ }
+ }
break;
case EbtInt:
- out << node->getUnionArrayPointer()[i].getIConst();
+ if (!matrix)
+ {
+ switch (size)
+ {
+ case 1: out << "int("; break;
+ case 2: out << "int2("; break;
+ case 3: out << "int3("; break;
+ case 4: out << "int4("; break;
+ default: UNREACHABLE();
+ }
+ }
+ else
+ {
+ UNIMPLEMENTED();
+ }
break;
- default:
+ default:
UNIMPLEMENTED(); // FIXME
}
- if (i != size - 1)
+ for (int i = 0; i < size; i++)
{
- out << ", ";
+ switch (basicType)
+ {
+ case EbtBool:
+ if (node->getUnionArrayPointer()[i].getBConst())
+ {
+ out << "true";
+ }
+ else
+ {
+ out << "false";
+ }
+ break;
+ case EbtFloat:
+ out << node->getUnionArrayPointer()[i].getFConst();
+ break;
+ case EbtInt:
+ out << node->getUnionArrayPointer()[i].getIConst();
+ break;
+ default:
+ UNIMPLEMENTED(); // FIXME
+ }
+
+ if (i != size - 1)
+ {
+ out << ", ";
+ }
}
}