Commit 51182ab9 by Olli Etuaho Committed by Commit Bot

Clean up TIntermAggregate folding

The division between 2- and 3-parameter built-ins is superfluous and can be removed. Also folding support for ESSL 3.00 is complete, so the comments about needing to add folding support for more functions can be removed. BUG=angleproject:1730 TEST=angle_unittests Change-Id: I5ca93a957a98a7740eca506e44af48e7b4b83bad Reviewed-on: https://chromium-review.googlesource.com/431108Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarCorentin Wallez <cwallez@chromium.org> Commit-Queue: Olli Etuaho <oetuaho@nvidia.com>
parent a2aff2a4
...@@ -2313,11 +2313,7 @@ TConstantUnion *TIntermConstantUnion::FoldAggregateBuiltIn(TIntermAggregate *agg ...@@ -2313,11 +2313,7 @@ TConstantUnion *TIntermConstantUnion::FoldAggregateBuiltIn(TIntermAggregate *agg
} }
TConstantUnion *resultArray = nullptr; TConstantUnion *resultArray = nullptr;
if (paramsCount == 2)
{
//
// Binary built-in
//
switch (op) switch (op)
{ {
case EOpAtan: case EOpAtan:
...@@ -2330,8 +2326,7 @@ TConstantUnion *TIntermConstantUnion::FoldAggregateBuiltIn(TIntermAggregate *agg ...@@ -2330,8 +2326,7 @@ TConstantUnion *TIntermConstantUnion::FoldAggregateBuiltIn(TIntermAggregate *agg
float x = unionArrays[1][i].getFConst(); float x = unionArrays[1][i].getFConst();
// Results are undefined if x and y are both 0. // Results are undefined if x and y are both 0.
if (x == 0.0f && y == 0.0f) if (x == 0.0f && y == 0.0f)
UndefinedConstantFoldingError(loc, op, basicType, diagnostics, UndefinedConstantFoldingError(loc, op, basicType, diagnostics, &resultArray[i]);
&resultArray[i]);
else else
resultArray[i].setFConst(atan2f(y, x)); resultArray[i].setFConst(atan2f(y, x));
} }
...@@ -2349,11 +2344,9 @@ TConstantUnion *TIntermConstantUnion::FoldAggregateBuiltIn(TIntermAggregate *agg ...@@ -2349,11 +2344,9 @@ TConstantUnion *TIntermConstantUnion::FoldAggregateBuiltIn(TIntermAggregate *agg
// Results are undefined if x < 0. // Results are undefined if x < 0.
// Results are undefined if x = 0 and y <= 0. // Results are undefined if x = 0 and y <= 0.
if (x < 0.0f) if (x < 0.0f)
UndefinedConstantFoldingError(loc, op, basicType, diagnostics, UndefinedConstantFoldingError(loc, op, basicType, diagnostics, &resultArray[i]);
&resultArray[i]);
else if (x == 0.0f && y <= 0.0f) else if (x == 0.0f && y <= 0.0f)
UndefinedConstantFoldingError(loc, op, basicType, diagnostics, UndefinedConstantFoldingError(loc, op, basicType, diagnostics, &resultArray[i]);
&resultArray[i]);
else else
resultArray[i].setFConst(powf(x, y)); resultArray[i].setFConst(powf(x, y));
} }
...@@ -2381,16 +2374,16 @@ TConstantUnion *TIntermConstantUnion::FoldAggregateBuiltIn(TIntermAggregate *agg ...@@ -2381,16 +2374,16 @@ TConstantUnion *TIntermConstantUnion::FoldAggregateBuiltIn(TIntermAggregate *agg
switch (basicType) switch (basicType)
{ {
case EbtFloat: case EbtFloat:
resultArray[i].setFConst(std::min(unionArrays[0][i].getFConst(), resultArray[i].setFConst(
unionArrays[1][i].getFConst())); std::min(unionArrays[0][i].getFConst(), unionArrays[1][i].getFConst()));
break; break;
case EbtInt: case EbtInt:
resultArray[i].setIConst(std::min(unionArrays[0][i].getIConst(), resultArray[i].setIConst(
unionArrays[1][i].getIConst())); std::min(unionArrays[0][i].getIConst(), unionArrays[1][i].getIConst()));
break; break;
case EbtUInt: case EbtUInt:
resultArray[i].setUConst(std::min(unionArrays[0][i].getUConst(), resultArray[i].setUConst(
unionArrays[1][i].getUConst())); std::min(unionArrays[0][i].getUConst(), unionArrays[1][i].getUConst()));
break; break;
default: default:
UNREACHABLE(); UNREACHABLE();
...@@ -2408,16 +2401,16 @@ TConstantUnion *TIntermConstantUnion::FoldAggregateBuiltIn(TIntermAggregate *agg ...@@ -2408,16 +2401,16 @@ TConstantUnion *TIntermConstantUnion::FoldAggregateBuiltIn(TIntermAggregate *agg
switch (basicType) switch (basicType)
{ {
case EbtFloat: case EbtFloat:
resultArray[i].setFConst(std::max(unionArrays[0][i].getFConst(), resultArray[i].setFConst(
unionArrays[1][i].getFConst())); std::max(unionArrays[0][i].getFConst(), unionArrays[1][i].getFConst()));
break; break;
case EbtInt: case EbtInt:
resultArray[i].setIConst(std::max(unionArrays[0][i].getIConst(), resultArray[i].setIConst(
unionArrays[1][i].getIConst())); std::max(unionArrays[0][i].getIConst(), unionArrays[1][i].getIConst()));
break; break;
case EbtUInt: case EbtUInt:
resultArray[i].setUConst(std::max(unionArrays[0][i].getUConst(), resultArray[i].setUConst(
unionArrays[1][i].getUConst())); std::max(unionArrays[0][i].getUConst(), unionArrays[1][i].getUConst()));
break; break;
default: default:
UNREACHABLE(); UNREACHABLE();
...@@ -2433,8 +2426,7 @@ TConstantUnion *TIntermConstantUnion::FoldAggregateBuiltIn(TIntermAggregate *agg ...@@ -2433,8 +2426,7 @@ TConstantUnion *TIntermConstantUnion::FoldAggregateBuiltIn(TIntermAggregate *agg
resultArray = new TConstantUnion[maxObjectSize]; resultArray = new TConstantUnion[maxObjectSize];
for (size_t i = 0; i < maxObjectSize; i++) for (size_t i = 0; i < maxObjectSize; i++)
resultArray[i].setFConst( resultArray[i].setFConst(
unionArrays[1][i].getFConst() < unionArrays[0][i].getFConst() ? 0.0f unionArrays[1][i].getFConst() < unionArrays[0][i].getFConst() ? 0.0f : 1.0f);
: 1.0f);
break; break;
} }
...@@ -2625,8 +2617,7 @@ TConstantUnion *TIntermConstantUnion::FoldAggregateBuiltIn(TIntermAggregate *agg ...@@ -2625,8 +2617,7 @@ TConstantUnion *TIntermConstantUnion::FoldAggregateBuiltIn(TIntermAggregate *agg
case EOpDot: case EOpDot:
ASSERT(basicType == EbtFloat); ASSERT(basicType == EbtFloat);
resultArray = new TConstantUnion(); resultArray = new TConstantUnion();
resultArray->setFConst( resultArray->setFConst(VectorDotProduct(unionArrays[0], unionArrays[1], maxObjectSize));
VectorDotProduct(unionArrays[0], unionArrays[1], maxObjectSize));
break; break;
case EOpCross: case EOpCross:
...@@ -2689,20 +2680,6 @@ TConstantUnion *TIntermConstantUnion::FoldAggregateBuiltIn(TIntermAggregate *agg ...@@ -2689,20 +2680,6 @@ TConstantUnion *TIntermConstantUnion::FoldAggregateBuiltIn(TIntermAggregate *agg
break; break;
} }
default:
UNREACHABLE();
// TODO: Add constant folding support for other built-in operations that take 2
// parameters and not handled above.
return nullptr;
}
}
else if (paramsCount == 3)
{
//
// Ternary built-in
//
switch (op)
{
case EOpClamp: case EOpClamp:
{ {
resultArray = new TConstantUnion[maxObjectSize]; resultArray = new TConstantUnion[maxObjectSize];
...@@ -2800,8 +2777,7 @@ TConstantUnion *TIntermConstantUnion::FoldAggregateBuiltIn(TIntermAggregate *agg ...@@ -2800,8 +2777,7 @@ TConstantUnion *TIntermConstantUnion::FoldAggregateBuiltIn(TIntermAggregate *agg
// Results are undefined if edge0 >= edge1. // Results are undefined if edge0 >= edge1.
if (edge0 >= edge1) if (edge0 >= edge1)
{ {
UndefinedConstantFoldingError(loc, op, basicType, diagnostics, UndefinedConstantFoldingError(loc, op, basicType, diagnostics, &resultArray[i]);
&resultArray[i]);
} }
else else
{ {
...@@ -2861,11 +2837,8 @@ TConstantUnion *TIntermConstantUnion::FoldAggregateBuiltIn(TIntermAggregate *agg ...@@ -2861,11 +2837,8 @@ TConstantUnion *TIntermConstantUnion::FoldAggregateBuiltIn(TIntermAggregate *agg
default: default:
UNREACHABLE(); UNREACHABLE();
// TODO: Add constant folding support for other built-in operations that take 3
// parameters and not handled above.
return nullptr; return nullptr;
} }
}
return resultArray; return resultArray;
} }
......
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