Commit de1e00e1 by Zhenyao Mo

Implement support of unary operator "+" in translator.

BUG=angle:779 TEST=conformance/glsl/misc/struct-unary-operators.html Change-Id: Ia827e07dcfc8ad3bbbc078e54336815be9027945 Reviewed-on: https://chromium-review.googlesource.com/222720Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarKenneth Russell <kbr@chromium.org> Tested-by: 's avatarZhenyao Mo <zmo@chromium.org>
parent 9ad2ab33
...@@ -336,6 +336,7 @@ bool TIntermUnary::promote(TInfoSink &) ...@@ -336,6 +336,7 @@ bool TIntermUnary::promote(TInfoSink &)
return false; return false;
break; break;
case EOpNegative: case EOpNegative:
case EOpPositive:
case EOpPostIncrement: case EOpPostIncrement:
case EOpPostDecrement: case EOpPostDecrement:
case EOpPreIncrement: case EOpPreIncrement:
...@@ -1068,6 +1069,27 @@ TIntermTyped *TIntermConstantUnion::fold( ...@@ -1068,6 +1069,27 @@ TIntermTyped *TIntermConstantUnion::fold(
} }
break; break;
case EOpPositive:
switch (getType().getBasicType())
{
case EbtFloat:
tempConstArray[i].setFConst(unionArray[i].getFConst());
break;
case EbtInt:
tempConstArray[i].setIConst(unionArray[i].getIConst());
break;
case EbtUInt:
tempConstArray[i].setUConst(static_cast<unsigned int>(
static_cast<int>(unionArray[i].getUConst())));
break;
default:
infoSink.info.message(
EPrefixInternalError, getLine(),
"Unary operation not folded into constant");
return NULL;
}
break;
case EOpLogicalNot: case EOpLogicalNot:
// this code is written for possible future use, // this code is written for possible future use,
// will not get executed currently // will not get executed currently
......
...@@ -45,6 +45,7 @@ enum TOperator ...@@ -45,6 +45,7 @@ enum TOperator
// //
EOpNegative, EOpNegative,
EOpPositive,
EOpLogicalNot, EOpLogicalNot,
EOpVectorLogicalNot, EOpVectorLogicalNot,
......
...@@ -198,6 +198,7 @@ TIntermTyped *TIntermediate::addUnaryMath( ...@@ -198,6 +198,7 @@ TIntermTyped *TIntermediate::addUnaryMath(
case EOpPostDecrement: case EOpPostDecrement:
case EOpPreDecrement: case EOpPreDecrement:
case EOpNegative: case EOpNegative:
case EOpPositive:
if (child->getType().getBasicType() == EbtStruct || if (child->getType().getBasicType() == EbtStruct ||
child->getType().isArray()) child->getType().isArray())
{ {
......
...@@ -395,6 +395,7 @@ bool TOutputGLSLBase::visitUnary(Visit visit, TIntermUnary *node) ...@@ -395,6 +395,7 @@ bool TOutputGLSLBase::visitUnary(Visit visit, TIntermUnary *node)
switch (node->getOp()) switch (node->getOp())
{ {
case EOpNegative: preString = "(-"; break; case EOpNegative: preString = "(-"; break;
case EOpPositive: preString = "(+"; break;
case EOpVectorLogicalNot: preString = "not("; break; case EOpVectorLogicalNot: preString = "not("; break;
case EOpLogicalNot: preString = "(!"; break; case EOpLogicalNot: preString = "(!"; break;
......
...@@ -1747,6 +1747,7 @@ bool OutputHLSL::visitUnary(Visit visit, TIntermUnary *node) ...@@ -1747,6 +1747,7 @@ bool OutputHLSL::visitUnary(Visit visit, TIntermUnary *node)
switch (node->getOp()) switch (node->getOp())
{ {
case EOpNegative: outputTriplet(visit, "(-", "", ")"); break; case EOpNegative: outputTriplet(visit, "(-", "", ")"); break;
case EOpPositive: outputTriplet(visit, "(+", "", ")"); break;
case EOpVectorLogicalNot: outputTriplet(visit, "(!", "", ")"); break; case EOpVectorLogicalNot: outputTriplet(visit, "(!", "", ")"); break;
case EOpLogicalNot: outputTriplet(visit, "(!", "", ")"); break; case EOpLogicalNot: outputTriplet(visit, "(!", "", ")"); break;
case EOpPostIncrement: outputTriplet(visit, "(", "", "++)"); break; case EOpPostIncrement: outputTriplet(visit, "(", "", "++)"); break;
......
...@@ -94,6 +94,7 @@ const char *GetOperatorString(TOperator op) ...@@ -94,6 +94,7 @@ const char *GetOperatorString(TOperator op)
case EOpLogicalXor: return "^^"; case EOpLogicalXor: return "^^";
case EOpLogicalAnd: return "&&"; case EOpLogicalAnd: return "&&";
case EOpNegative: return "-"; case EOpNegative: return "-";
case EOpPositive: return "+";
case EOpVectorLogicalNot: return "not"; case EOpVectorLogicalNot: return "not";
case EOpLogicalNot: return "!"; case EOpLogicalNot: return "!";
case EOpPostIncrement: return "++"; case EOpPostIncrement: return "++";
......
...@@ -500,6 +500,7 @@ unary_expression ...@@ -500,6 +500,7 @@ unary_expression
const char* errorOp = ""; const char* errorOp = "";
switch($1.op) { switch($1.op) {
case EOpNegative: errorOp = "-"; break; case EOpNegative: errorOp = "-"; break;
case EOpPositive: errorOp = "+"; break;
case EOpLogicalNot: errorOp = "!"; break; case EOpLogicalNot: errorOp = "!"; break;
default: break; default: break;
} }
...@@ -514,7 +515,7 @@ unary_expression ...@@ -514,7 +515,7 @@ unary_expression
// Grammar Note: No traditional style type casts. // Grammar Note: No traditional style type casts.
unary_operator unary_operator
: PLUS { $$.op = EOpNull; } : PLUS { $$.op = EOpPositive; }
| DASH { $$.op = EOpNegative; } | DASH { $$.op = EOpNegative; }
| BANG { $$.op = EOpLogicalNot; } | BANG { $$.op = EOpLogicalNot; }
; ;
......
...@@ -2919,6 +2919,7 @@ yyreduce: ...@@ -2919,6 +2919,7 @@ yyreduce:
const char* errorOp = ""; const char* errorOp = "";
switch((yyvsp[(1) - (2)].interm).op) { switch((yyvsp[(1) - (2)].interm).op) {
case EOpNegative: errorOp = "-"; break; case EOpNegative: errorOp = "-"; break;
case EOpPositive: errorOp = "+"; break;
case EOpLogicalNot: errorOp = "!"; break; case EOpLogicalNot: errorOp = "!"; break;
default: break; default: break;
} }
...@@ -2933,7 +2934,7 @@ yyreduce: ...@@ -2933,7 +2934,7 @@ yyreduce:
case 34: case 34:
{ (yyval.interm).op = EOpNull; } { (yyval.interm).op = EOpPositive; }
break; break;
case 35: case 35:
......
...@@ -221,6 +221,7 @@ bool TOutputTraverser::visitUnary(Visit visit, TIntermUnary *node) ...@@ -221,6 +221,7 @@ bool TOutputTraverser::visitUnary(Visit visit, TIntermUnary *node)
switch (node->getOp()) switch (node->getOp())
{ {
case EOpNegative: out << "Negate value"; break; case EOpNegative: out << "Negate value"; break;
case EOpPositive: out << "Positive sign"; break;
case EOpVectorLogicalNot: case EOpVectorLogicalNot:
case EOpLogicalNot: out << "Negate conditional"; break; case EOpLogicalNot: out << "Negate conditional"; 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