glInstanceID implementation

Implementation attempt for glInstanceID.
Related dEQP tests pass.

Change-Id: I6391699a127cc7c159a2a64e3ffeaa528b611f97
Reviewed-on: https://swiftshader-review.googlesource.com/3412
Tested-by: Alexis Hétu <sugoi@google.com>
Reviewed-by: Nicolas Capens <capn@google.com>
diff --git a/src/Renderer/Renderer.cpp b/src/Renderer/Renderer.cpp
index be111ff..881c6d9 100644
--- a/src/Renderer/Renderer.cpp
+++ b/src/Renderer/Renderer.cpp
@@ -424,6 +424,11 @@
 					memcpy(&data->vs.b, VertexProcessor::b, sizeof(bool) * draw->vsDirtyConstB);
 					draw->vsDirtyConstB = 0;
 				}
+
+				if(context->vertexShader->instanceIdDeclared)
+				{
+					data->instanceID = context->instanceID;
+				}
 			}
 			else
 			{
diff --git a/src/Shader/VertexProgram.cpp b/src/Shader/VertexProgram.cpp
index 14bd5f6..5a516c4 100644
--- a/src/Shader/VertexProgram.cpp
+++ b/src/Shader/VertexProgram.cpp
@@ -665,6 +665,9 @@
 				reg = r.o[i + relativeAddress(r, src)];
 			}
 			break;
+		case Shader::PARAMETER_MISCTYPE:
+			reg.x = Float(r.instanceID);
+			return reg;
 		default:
 			ASSERT(false);
 		}
diff --git a/src/Shader/VertexRoutine.cpp b/src/Shader/VertexRoutine.cpp
index 94bbdeb..61bca55 100644
--- a/src/Shader/VertexRoutine.cpp
+++ b/src/Shader/VertexRoutine.cpp
@@ -52,6 +52,10 @@
 			Registers r(shader);
 			r.data = data;
 			r.constants = *Pointer<Pointer<Byte> >(data + OFFSET(DrawData,constants));
+			if(shader->instanceIdDeclared)
+			{
+				r.instanceID = *Pointer<Int>(data + OFFSET(DrawData, instanceID));
+			}
 
 			Do
 			{
diff --git a/src/Shader/VertexRoutine.hpp b/src/Shader/VertexRoutine.hpp
index 17c04dd..e023992 100644
--- a/src/Shader/VertexRoutine.hpp
+++ b/src/Shader/VertexRoutine.hpp
@@ -67,6 +67,8 @@
 			Int4 enableBreak;
 			Int4 enableContinue;
 			Int4 enableLeave;
+
+			Int instanceID;
 		};
 
 	public:
diff --git a/src/Shader/VertexShader.cpp b/src/Shader/VertexShader.cpp
index 3b888d7..7bb7f0a 100644
--- a/src/Shader/VertexShader.cpp
+++ b/src/Shader/VertexShader.cpp
@@ -41,6 +41,7 @@
 			memcpy(input, vs->input, sizeof(input));
 			positionRegister = vs->positionRegister;
 			pointSizeRegister = vs->pointSizeRegister;
+			instanceIdDeclared = vs->instanceIdDeclared;
 			usedSamplers = vs->usedSamplers;
 
 			optimize();