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
parent fbb6dfa3
...@@ -387,25 +387,25 @@ bool OutputHLSL::visitBinary(Visit visit, TIntermBinary *node) ...@@ -387,25 +387,25 @@ bool OutputHLSL::visitBinary(Visit visit, TIntermBinary *node)
switch (node->getOp()) switch (node->getOp())
{ {
case EOpAssign: outputTriplet(visit, "(", " = ", ")"); break; case EOpAssign: outputTriplet(visit, "(", " = ", ")"); break;
case EOpInitialize: outputTriplet(visit, NULL, " = ", NULL); break; case EOpInitialize: outputTriplet(visit, NULL, " = ", NULL); break;
case EOpAddAssign: outputTriplet(visit, NULL, " += ", NULL); break; case EOpAddAssign: outputTriplet(visit, NULL, " += ", NULL); break;
case EOpSubAssign: outputTriplet(visit, NULL, " -= ", NULL); break; case EOpSubAssign: outputTriplet(visit, NULL, " -= ", NULL); break;
case EOpMulAssign: 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 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 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 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 EOpModAssign: UNIMPLEMENTED(); /* FIXME */ out << "mod second child into first child"; break;
case EOpAndAssign: UNIMPLEMENTED(); /* FIXME */ out << "and 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 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 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 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 EOpRightShiftAssign: UNIMPLEMENTED(); /* FIXME */ out << "right shift second child into first child"; break;
case EOpIndexDirect: outputTriplet(visit, NULL, "[", "]"); break; case EOpIndexDirect: outputTriplet(visit, NULL, "[", "]"); break;
case EOpIndexIndirect: outputTriplet(visit, NULL, "[", "]"); break; case EOpIndexIndirect: outputTriplet(visit, NULL, "[", "]"); break;
case EOpIndexDirectStruct: UNIMPLEMENTED(); /* FIXME */ out << "direct index for structure"; break; case EOpIndexDirectStruct: outputTriplet(visit, NULL, ".", NULL); break;
case EOpVectorSwizzle: case EOpVectorSwizzle:
if (visit == InVisit) if (visit == InVisit)
{ {
...@@ -540,9 +540,9 @@ bool OutputHLSL::visitUnary(Visit visit, TIntermUnary *node) ...@@ -540,9 +540,9 @@ bool OutputHLSL::visitUnary(Visit visit, TIntermUnary *node)
case EOpFract: outputTriplet(visit, "frac(", NULL, ")"); break; case EOpFract: outputTriplet(visit, "frac(", NULL, ")"); break;
case EOpLength: outputTriplet(visit, "length(", NULL, ")"); break; case EOpLength: outputTriplet(visit, "length(", NULL, ")"); break;
case EOpNormalize: outputTriplet(visit, "normalize(", NULL, ")"); break; case EOpNormalize: outputTriplet(visit, "normalize(", NULL, ")"); break;
// case EOpDPdx: outputTriplet(visit, "ddx(", NULL, ")"); break; // case EOpDPdx: outputTriplet(visit, "ddx(", NULL, ")"); break;
// case EOpDPdy: outputTriplet(visit, "ddy(", NULL, ")"); break; // case EOpDPdy: outputTriplet(visit, "ddy(", NULL, ")"); break;
// case EOpFwidth: outputTriplet(visit, "fwidth(", NULL, ")"); break; // case EOpFwidth: outputTriplet(visit, "fwidth(", NULL, ")"); break;
case EOpAny: outputTriplet(visit, "any(", NULL, ")"); break; case EOpAny: outputTriplet(visit, "any(", NULL, ")"); break;
case EOpAll: outputTriplet(visit, "all(", NULL, ")"); break; case EOpAll: outputTriplet(visit, "all(", NULL, ")"); break;
default: UNREACHABLE(); default: UNREACHABLE();
...@@ -919,100 +919,109 @@ void OutputHLSL::visitConstantUnion(TIntermConstantUnion *node) ...@@ -919,100 +919,109 @@ void OutputHLSL::visitConstantUnion(TIntermConstantUnion *node)
{ {
TInfoSinkBase &out = context.infoSink.obj; TInfoSinkBase &out = context.infoSink.obj;
int size = node->getType().getObjectSize(); TType &type = node->getType();
bool matrix = node->getType().isMatrix();
TBasicType type = node->getUnionArrayPointer()[0].getType(); if(type.isField())
{
switch (type) out << type.getFieldName();
{ }
case EbtBool: else
if (!matrix) {
int size = type.getObjectSize();
bool matrix = type.isMatrix();
TBasicType basicType = node->getUnionArrayPointer()[0].getType();
switch (basicType)
{ {
switch (size) case EbtBool:
if (!matrix)
{ {
case 1: out << "bool("; break; switch (size)
case 2: out << "bool2("; break; {
case 3: out << "bool3("; break; case 1: out << "bool("; break;
case 4: out << "bool4("; break; case 2: out << "bool2("; break;
default: UNREACHABLE(); case 3: out << "bool3("; break;
case 4: out << "bool4("; break;
default: UNREACHABLE();
}
} }
} else
else
{
UNIMPLEMENTED();
}
break;
case EbtFloat:
if (!matrix)
{
switch (size)
{ {
case 1: out << "float("; break; UNIMPLEMENTED();
case 2: out << "float2("; break;
case 3: out << "float3("; break;
case 4: out << "float4("; break;
default: UNREACHABLE();
} }
} break;
else case EbtFloat:
{ if (!matrix)
switch (size)
{ {
case 4: out << "float2x2("; break; switch (size)
case 9: out << "float3x3("; break; {
case 16: out << "float4x4("; break; case 1: out << "float("; break;
default: UNREACHABLE(); case 2: out << "float2("; break;
case 3: out << "float3("; break;
case 4: out << "float4("; break;
default: UNREACHABLE();
}
} }
} else
break;
case EbtInt:
if (!matrix)
{
switch (size)
{ {
case 1: out << "int("; break; switch (size)
case 2: out << "int2("; break; {
case 3: out << "int3("; break; case 4: out << "float2x2("; break;
case 4: out << "int4("; break; case 9: out << "float3x3("; break;
default: UNREACHABLE(); case 16: out << "float4x4("; break;
default: UNREACHABLE();
}
} }
} break;
else case EbtInt:
{ if (!matrix)
UNIMPLEMENTED();
}
break;
default:
UNIMPLEMENTED(); // FIXME
}
for (int i = 0; i < size; i++)
{
switch (type)
{
case EbtBool:
if (node->getUnionArrayPointer()[i].getBConst())
{ {
out << "true"; 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 else
{ {
out << "false"; UNIMPLEMENTED();
} }
break; break;
case EbtFloat: default:
out << node->getUnionArrayPointer()[i].getFConst();
break;
case EbtInt:
out << node->getUnionArrayPointer()[i].getIConst();
break;
default:
UNIMPLEMENTED(); // FIXME 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 << ", ";
}
} }
} }
......
...@@ -205,6 +205,7 @@ public: ...@@ -205,6 +205,7 @@ public:
virtual bool isMatrix() const { return matrix ? true : false; } virtual bool isMatrix() const { return matrix ? true : false; }
virtual bool isArray() const { return array ? true : false; } virtual bool isArray() const { return array ? true : false; }
bool isField() const { return fieldName != 0; }
int getArraySize() const { return arraySize; } int getArraySize() const { return arraySize; }
void setArraySize(int s) { array = true; arraySize = s; } void setArraySize(int s) { array = true; arraySize = s; }
void setMaxArraySize (int s) { maxArraySize = s; } void setMaxArraySize (int s) { maxArraySize = s; }
......
...@@ -422,7 +422,7 @@ postfix_expression ...@@ -422,7 +422,7 @@ postfix_expression
} else { } else {
constUnion *unionArray = new constUnion[1]; constUnion *unionArray = new constUnion[1];
unionArray->setIConst(i); unionArray->setIConst(i);
TIntermTyped* index = parseContext.intermediate.addConstantUnion(unionArray, TType(EbtInt, EvqConst), $3.line); TIntermTyped* index = parseContext.intermediate.addConstantUnion(unionArray, *(*fields)[i].type, $3.line);
$$ = parseContext.intermediate.addIndex(EOpIndexDirectStruct, $1, index, $2.line); $$ = parseContext.intermediate.addIndex(EOpIndexDirectStruct, $1, index, $2.line);
$$->setType(*(*fields)[i].type); $$->setType(*(*fields)[i].type);
} }
......
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