Commit 7c0ec1ef by Nicolas Capens Committed by Nicolas Capens

Produce constructors instead of conversions.

GLSL only supports explicit conversion through constructors. Therefore the conversion nodes are redundant. BUG=15415045 Change-Id: Ia6bd93c9c4a69d013a4ec82f81826e6ff5c18eb2 Reviewed-on: https://swiftshader-review.googlesource.com/1113Reviewed-by: 's avatarNicolas Capens <nicolascapens@google.com>
parent c3bfb403
...@@ -32,7 +32,7 @@ const char* getOperatorString(TOperator op) { ...@@ -32,7 +32,7 @@ const char* getOperatorString(TOperator op) {
case EOpDivAssign: return "/="; case EOpDivAssign: return "/=";
// Fall-through. // Fall-through.
case EOpMulAssign: case EOpMulAssign:
case EOpVectorTimesMatrixAssign: case EOpVectorTimesMatrixAssign:
case EOpVectorTimesScalarAssign: case EOpVectorTimesScalarAssign:
case EOpMatrixTimesScalarAssign: case EOpMatrixTimesScalarAssign:
...@@ -77,11 +77,11 @@ const char* getOperatorString(TOperator op) { ...@@ -77,11 +77,11 @@ const char* getOperatorString(TOperator op) {
// Fall-through. // Fall-through.
case EOpConvIntToBool: case EOpConvIntToBool:
case EOpConvFloatToBool: return "bool"; case EOpConvFloatToBool: return "bool";
// Fall-through. // Fall-through.
case EOpConvBoolToFloat: case EOpConvBoolToFloat:
case EOpConvIntToFloat: return "float"; case EOpConvIntToFloat: return "float";
// Fall-through. // Fall-through.
case EOpConvFloatToInt: case EOpConvFloatToInt:
case EOpConvBoolToInt: return "int"; case EOpConvBoolToInt: return "int";
...@@ -176,23 +176,9 @@ TIntermTyped* TIntermediate::addBinaryMath(TOperator op, TIntermTyped* left, TIn ...@@ -176,23 +176,9 @@ TIntermTyped* TIntermediate::addBinaryMath(TOperator op, TIntermTyped* left, TIn
default: break; default: break;
} }
// if (left->getBasicType() != right->getBasicType())
// First try converting the children to compatible types. {
// return 0;
if (left->getType().getStruct() && right->getType().getStruct()) {
if (left->getType() != right->getType())
return 0;
} else {
TIntermTyped* child = addConversion(op, left->getType(), right);
if (child)
right = child;
else {
child = addConversion(op, right->getType(), left);
if (child)
left = child;
else
return 0;
}
} }
// //
...@@ -212,11 +198,10 @@ TIntermTyped* TIntermediate::addBinaryMath(TOperator op, TIntermTyped* left, TIn ...@@ -212,11 +198,10 @@ TIntermTyped* TIntermediate::addBinaryMath(TOperator op, TIntermTyped* left, TIn
// //
// See if we can fold constants. // See if we can fold constants.
// //
TIntermTyped* typedReturnNode = 0;
TIntermConstantUnion *leftTempConstant = left->getAsConstantUnion(); TIntermConstantUnion *leftTempConstant = left->getAsConstantUnion();
TIntermConstantUnion *rightTempConstant = right->getAsConstantUnion(); TIntermConstantUnion *rightTempConstant = right->getAsConstantUnion();
if (leftTempConstant && rightTempConstant) { if (leftTempConstant && rightTempConstant) {
typedReturnNode = leftTempConstant->fold(node->getOp(), rightTempConstant, infoSink); TIntermTyped *typedReturnNode = leftTempConstant->fold(node->getOp(), rightTempConstant, infoSink);
if (typedReturnNode) if (typedReturnNode)
return typedReturnNode; return typedReturnNode;
...@@ -232,21 +217,21 @@ TIntermTyped* TIntermediate::addBinaryMath(TOperator op, TIntermTyped* left, TIn ...@@ -232,21 +217,21 @@ TIntermTyped* TIntermediate::addBinaryMath(TOperator op, TIntermTyped* left, TIn
// //
TIntermTyped* TIntermediate::addAssign(TOperator op, TIntermTyped* left, TIntermTyped* right, TSourceLoc line) TIntermTyped* TIntermediate::addAssign(TOperator op, TIntermTyped* left, TIntermTyped* right, TSourceLoc line)
{ {
// if (left->getType().getStruct() || right->getType().getStruct())
// Like adding binary math, except the conversion can only go {
// from right to left. if (left->getType() != right->getType())
// {
return 0;
}
}
TIntermBinary* node = new TIntermBinary(op); TIntermBinary* node = new TIntermBinary(op);
if (line == 0) if(line == 0)
line = left->getLine(); line = left->getLine();
node->setLine(line); node->setLine(line);
TIntermTyped* child = addConversion(op, left->getType(), right);
if (child == 0)
return 0;
node->setLeft(left); node->setLeft(left);
node->setRight(child); node->setRight(right);
if (! node->promote(infoSink)) if (! node->promote(infoSink))
return 0; return 0;
...@@ -306,40 +291,6 @@ TIntermTyped* TIntermediate::addUnaryMath(TOperator op, TIntermNode* childNode, ...@@ -306,40 +291,6 @@ TIntermTyped* TIntermediate::addUnaryMath(TOperator op, TIntermNode* childNode,
default: break; default: break;
} }
//
// Do we need to promote the operand?
//
// Note: Implicit promotions were removed from the language.
//
TBasicType newType = EbtVoid;
switch (op) {
case EOpConstructInt: newType = EbtInt; break;
case EOpConstructBool: newType = EbtBool; break;
case EOpConstructFloat: newType = EbtFloat; break;
default: break;
}
if (newType != EbtVoid) {
child = addConversion(op, TType(newType, child->getPrecision(), EvqTemporary,
child->getNominalSize(),
child->isMatrix(),
child->isArray()),
child);
if (child == 0)
return 0;
}
//
// For constructors, we are now done, it's all in the conversion.
//
switch (op) {
case EOpConstructInt:
case EOpConstructBool:
case EOpConstructFloat:
return child;
default: break;
}
TIntermConstantUnion *childTempConstant = 0; TIntermConstantUnion *childTempConstant = 0;
if (child->getAsConstantUnion()) if (child->getAsConstantUnion())
childTempConstant = child->getAsConstantUnion(); childTempConstant = child->getAsConstantUnion();
...@@ -625,18 +576,9 @@ TIntermTyped* TIntermediate::addComma(TIntermTyped* left, TIntermTyped* right, T ...@@ -625,18 +576,9 @@ TIntermTyped* TIntermediate::addComma(TIntermTyped* left, TIntermTyped* right, T
// //
TIntermTyped* TIntermediate::addSelection(TIntermTyped* cond, TIntermTyped* trueBlock, TIntermTyped* falseBlock, TSourceLoc line) TIntermTyped* TIntermediate::addSelection(TIntermTyped* cond, TIntermTyped* trueBlock, TIntermTyped* falseBlock, TSourceLoc line)
{ {
// if (trueBlock->getType() != falseBlock->getType())
// Get compatible types. {
// return 0;
TIntermTyped* child = addConversion(EOpSequence, trueBlock->getType(), falseBlock);
if (child)
falseBlock = child;
else {
child = addConversion(EOpSequence, falseBlock->getType(), trueBlock);
if (child)
trueBlock = child;
else
return 0;
} }
// //
...@@ -809,6 +751,7 @@ bool TIntermOperator::isConstructor() const ...@@ -809,6 +751,7 @@ bool TIntermOperator::isConstructor() const
return false; return false;
} }
} }
// //
// Make sure the type of a unary operator is appropriate for its // Make sure the type of a unary operator is appropriate for its
// combination of operation and operand type. // combination of operation and operand type.
...@@ -869,7 +812,9 @@ bool TIntermBinary::promote(TInfoSink& infoSink) ...@@ -869,7 +812,9 @@ bool TIntermBinary::promote(TInfoSink& infoSink)
// GLSL ES 2.0 does not support implicit type casting. // GLSL ES 2.0 does not support implicit type casting.
// So the basic type should always match. // So the basic type should always match.
if (left->getBasicType() != right->getBasicType()) if (left->getBasicType() != right->getBasicType())
{
return false; return false;
}
// //
// Base assumption: just make the type the same as the left // Base assumption: just make the type the same as the left
......
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