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();