Fix min/max constant folding.

Change-Id: I9ac2051f5cc8703e804b86c0006bb1b9fe48f521
Reviewed-on: https://swiftshader-review.googlesource.com/5082
Tested-by: Nicolas Capens <capn@google.com>
Reviewed-by: Alexis Hétu <sugoi@google.com>
Reviewed-by: Nicolas Capens <capn@google.com>
diff --git a/src/OpenGL/compiler/Intermediate.cpp b/src/OpenGL/compiler/Intermediate.cpp
index 5f84222..14cd5b2 100644
--- a/src/OpenGL/compiler/Intermediate.cpp
+++ b/src/OpenGL/compiler/Intermediate.cpp
@@ -1611,7 +1611,20 @@
                 tempNode->setLine(getLine());
 
                 return tempNode;
-
+			case EOpMax:
+                tempConstArray = new ConstantUnion[objectSize];
+                {// support MSVC++6.0
+                    for (int i = 0; i < objectSize; i++)
+                        tempConstArray[i] = unionArray[i] > rightUnionArray[i] ? unionArray[i] : rightUnionArray[i];
+                }
+                break;
+            case EOpMin:
+                tempConstArray = new ConstantUnion[objectSize];
+                {// support MSVC++6.0
+                    for (int i = 0; i < objectSize; i++)
+                        tempConstArray[i] = unionArray[i] < rightUnionArray[i] ? unionArray[i] : rightUnionArray[i];
+                }
+                break;
             default:
                 return 0;
         }
diff --git a/src/OpenGL/compiler/ParseHelper.cpp b/src/OpenGL/compiler/ParseHelper.cpp
index df9ffd0..ddf0765 100644
--- a/src/OpenGL/compiler/ParseHelper.cpp
+++ b/src/OpenGL/compiler/ParseHelper.cpp
@@ -3581,6 +3581,25 @@
 					functionCallLValueErrorCheck(fnCandidate, aggregate);
 
 					callNode = aggregate;
+
+					if(fnCandidate->getParamCount() == 2)
+					{
+						TIntermSequence &parameters = paramNode->getAsAggregate()->getSequence();
+						TIntermTyped *left = parameters[0]->getAsTyped();
+						TIntermTyped *right = parameters[1]->getAsTyped();
+
+						TIntermConstantUnion *leftTempConstant = left->getAsConstantUnion();
+						TIntermConstantUnion *rightTempConstant = right->getAsConstantUnion();
+						if (leftTempConstant && rightTempConstant)
+						{
+							TIntermTyped *typedReturnNode = leftTempConstant->fold(op, rightTempConstant, infoSink());
+
+							if(typedReturnNode)
+							{
+								callNode = typedReturnNode;
+							}
+						}
+					}
 				}
 			}
 			else