Fixed shader-varying-packing-restrictions.html

Return an error instead of asserting when exceeding
the number of available varying variables.

Change-Id: Ia4d76897b4b214a5b3bdd37cd420c0437faa216a
Reviewed-on: https://swiftshader-review.googlesource.com/1451
Tested-by: Alexis Hétu <sugoi@google.com>
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
diff --git a/src/OpenGL/compiler/OutputASM.cpp b/src/OpenGL/compiler/OutputASM.cpp
index 2ffc576..e8aa3f3 100644
--- a/src/OpenGL/compiler/OutputASM.cpp
+++ b/src/OpenGL/compiler/OutputASM.cpp
@@ -1943,8 +1943,14 @@
 			int componentCount = varying->getNominalSize();

 			int registerCount = varying->totalRegisterCount();

 

-			if(pixelShader && (var + registerCount) <= sw::PixelShader::MAX_INPUT_VARYINGS)

+			if(pixelShader)

 			{

+				if((var + registerCount) > sw::PixelShader::MAX_INPUT_VARYINGS)

+				{

+					mContext.error(varying->getLine(), "Varyings packing failed: Too many varyings", "fragment shader");

+					return 0;

+				}

+

 				if(varying->getQualifier() == EvqPointCoord)

 				{

 					ASSERT(varying->isRegister());

@@ -1964,8 +1970,14 @@
 					}

 				}

 			}

-			else if(vertexShader && (var + registerCount) <= sw::VertexShader::MAX_OUTPUT_VARYINGS)

+			else if(vertexShader)

 			{

+				if((var + registerCount) > sw::VertexShader::MAX_OUTPUT_VARYINGS)

+				{

+					mContext.error(varying->getLine(), "Varyings packing failed: Too many varyings", "vertex shader");

+					return 0;

+				}

+

 				if(varying->getQualifier() == EvqPosition)

 				{

 					ASSERT(varying->isRegister());

diff --git a/src/Radiance/compiler/OutputASM.cpp b/src/Radiance/compiler/OutputASM.cpp
index 57af4a3..b85edf6 100644
--- a/src/Radiance/compiler/OutputASM.cpp
+++ b/src/Radiance/compiler/OutputASM.cpp
@@ -1943,8 +1943,14 @@
 			int componentCount = varying->getNominalSize();

 			int registerCount = varying->totalRegisterCount();

 

-			if(pixelShader && (var + registerCount) <= sw::PixelShader::MAX_INPUT_VARYINGS)

+			if(pixelShader)

 			{

+				if((var + registerCount) > sw::PixelShader::MAX_INPUT_VARYINGS)

+				{

+					mContext.error(varying->getLine(), "Varyings packing failed: Too many varyings", "fragment shader");

+					return 0;

+				}

+

 				if(varying->getQualifier() == EvqPointCoord)

 				{

 					ASSERT(varying->isRegister());

@@ -1964,8 +1970,14 @@
 					}

 				}

 			}

-			else if(vertexShader && (var + registerCount) <= sw::VertexShader::MAX_OUTPUT_VARYINGS)

+			else if(vertexShader)

 			{

+				if((var + registerCount) > sw::VertexShader::MAX_OUTPUT_VARYINGS)

+				{

+					mContext.error(varying->getLine(), "Varyings packing failed: Too many varyings", "vertex shader");

+					return 0;

+				}

+

 				if(varying->getQualifier() == EvqPosition)

 				{

 					ASSERT(varying->isRegister());