Added check for temporary register overflow

Currently, when overflowing the number of temporary registers
allowed, SwiftShader will crash somewhere in the generated
code. This cl adds an early check to prevent the crash and
instead output an error message to the user.

Bug chromium:814987

Change-Id: Idadda21ee14298662763d986ee1283a5114c1c01
Reviewed-on: https://swiftshader-review.googlesource.com/18388
Tested-by: Alexis Hétu <sugoi@google.com>
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
diff --git a/src/Main/Config.hpp b/src/Main/Config.hpp
index ff8bb7e..764bfed 100644
--- a/src/Main/Config.hpp
+++ b/src/Main/Config.hpp
@@ -96,6 +96,7 @@
 		MAX_PROGRAM_TEXEL_OFFSET = 7,
 		MAX_TEXTURE_LOD = MIPMAP_LEVELS - 2,   // Trilinear accesses lod+1
 		RENDERTARGETS = 8,
+		NUM_TEMPORARY_REGISTERS = 4096,
 	};
 }
 
diff --git a/src/OpenGL/compiler/OutputASM.cpp b/src/OpenGL/compiler/OutputASM.cpp
index b3385c2..8477af2 100644
--- a/src/OpenGL/compiler/OutputASM.cpp
+++ b/src/OpenGL/compiler/OutputASM.cpp
@@ -3031,7 +3031,14 @@
 
 	int OutputASM::temporaryRegister(TIntermTyped *temporary)
 	{
-		return allocate(temporaries, temporary);
+		int index = allocate(temporaries, temporary);
+		if(index >= sw::NUM_TEMPORARY_REGISTERS)
+		{
+			mContext.error(temporary->getLine(),
+				"Too many temporary registers required to compile shader",
+				pixelShader ? "pixel shader" : "vertex shader");
+		}
+		return index;
 	}
 
 	void OutputASM::setPixelShaderInputs(const TType& type, int var, bool flat)
diff --git a/src/Shader/PixelProgram.hpp b/src/Shader/PixelProgram.hpp
index 951e147..1f60bde 100644
--- a/src/Shader/PixelProgram.hpp
+++ b/src/Shader/PixelProgram.hpp
@@ -55,7 +55,7 @@
 
 	private:
 		// Temporary registers
-		RegisterArray<4096> r;
+		RegisterArray<NUM_TEMPORARY_REGISTERS> r;
 
 		// Color outputs
 		Vector4f c[RENDERTARGETS];
diff --git a/src/Shader/VertexProgram.hpp b/src/Shader/VertexProgram.hpp
index c42ab71..fcd2a93 100644
--- a/src/Shader/VertexProgram.hpp
+++ b/src/Shader/VertexProgram.hpp
@@ -37,7 +37,7 @@
 	private:
 		const VertexShader *const shader;
 
-		RegisterArray<4096> r;   // Temporary registers
+		RegisterArray<NUM_TEMPORARY_REGISTERS> r;   // Temporary registers
 		Vector4f a0;
 		Array<Int, 4> aL;
 		Vector4f p0;