Add constant casting support.
BUG=15415045
Change-Id: I35b27fec33aede0fedde892cd9379ca19fdb6f08
Reviewed-on: https://swiftshader-review.googlesource.com/1112
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
diff --git a/src/GLES2/compiler/parseConst.cpp b/src/GLES2/compiler/parseConst.cpp
index f8fb6be..c864836 100644
--- a/src/GLES2/compiler/parseConst.cpp
+++ b/src/GLES2/compiler/parseConst.cpp
@@ -61,24 +61,23 @@
{
infoSink.info.message(EPrefixInternalError, "Symbol Node found in constant constructor", node->getLine());
return;
-
}
bool TConstTraverser::visitBinary(Visit visit, TIntermBinary* node)
{
TQualifier qualifier = node->getType().getQualifier();
-
+
if (qualifier != EvqConst) {
TString buf;
buf.append("'constructor' : assigning non-constant to ");
buf.append(type.getCompleteString());
infoSink.info.message(EPrefixError, buf.c_str(), node->getLine());
error = true;
- return false;
+ return false;
}
- infoSink.info.message(EPrefixInternalError, "Binary Node found in constant constructor", node->getLine());
-
+ infoSink.info.message(EPrefixInternalError, "Binary Node found in constant constructor", node->getLine());
+
return false;
}
@@ -89,7 +88,7 @@
buf.append(type.getCompleteString());
infoSink.info.message(EPrefixError, buf.c_str(), node->getLine());
error = true;
- return false;
+ return false;
}
bool TConstTraverser::visitAggregate(Visit visit, TIntermAggregate* node)
@@ -100,7 +99,7 @@
buf.append(type.getCompleteString());
infoSink.info.message(EPrefixError, buf.c_str(), node->getLine());
error = true;
- return false;
+ return false;
}
if (node->getSequence().size() == 0) {
@@ -109,9 +108,9 @@
}
bool flag = node->getSequence().size() == 1 && node->getSequence()[0]->getAsTyped()->getAsConstantUnion();
- if (flag)
+ if (flag)
{
- singleConstantParam = true;
+ singleConstantParam = true;
constructorType = node->getOp();
size = node->getType().getObjectSize();
@@ -119,19 +118,19 @@
isMatrix = true;
matrixSize = node->getType().getNominalSize();
}
- }
+ }
- for (TIntermSequence::iterator p = node->getSequence().begin();
+ for (TIntermSequence::iterator p = node->getSequence().begin();
p != node->getSequence().end(); p++) {
if (node->getOp() == EOpComma)
- index = 0;
+ index = 0;
(*p)->traverse(this);
- }
- if (flag)
+ }
+ if (flag)
{
- singleConstantParam = false;
+ singleConstantParam = false;
constructorType = EOpNull;
size = 0;
isMatrix = false;
@@ -151,18 +150,19 @@
{
ConstantUnion* leftUnionArray = unionArray;
int instanceSize = type.getObjectSize();
+ TBasicType basicType = type.getBasicType();
if (index >= instanceSize)
return;
if (!singleConstantParam) {
int size = node->getType().getObjectSize();
-
+
ConstantUnion *rightUnionArray = node->getUnionArrayPointer();
for (int i=0; i < size; i++) {
if (index >= instanceSize)
return;
- leftUnionArray[index] = rightUnionArray[i];
+ leftUnionArray[index].cast(basicType, rightUnionArray[i]);
(index)++;
}
@@ -175,10 +175,10 @@
if (i >= instanceSize)
return;
- leftUnionArray[i] = rightUnionArray[count];
+ leftUnionArray[i].cast(basicType, rightUnionArray[count]);
(index)++;
-
+
if (node->getType().getObjectSize() > 1)
count++;
}
@@ -189,14 +189,14 @@
if (i >= instanceSize)
return;
if (element - i == 0 || (i - element) % (matrixSize + 1) == 0 )
- leftUnionArray[i] = rightUnionArray[count];
- else
+ leftUnionArray[i].cast(basicType, rightUnionArray[0]);
+ else
leftUnionArray[i].setFConst(0.0f);
(index)++;
if (node->getType().getObjectSize() > 1)
- count++;
+ count++;
}
}
}