Fix texture unit enable/disable and binding prioritization.
Bug 21194513
Change-Id: I487a7e07aa936b8613200fae319fe09b86e81cb1
Reviewed-on: https://swiftshader-review.googlesource.com/3148
Reviewed-by: Alexis Hétu <sugoi@google.com>
Reviewed-by: Nicolas Capens <capn@google.com>
Tested-by: Nicolas Capens <capn@google.com>
diff --git a/src/OpenGL/libGLES_CM/Context.cpp b/src/OpenGL/libGLES_CM/Context.cpp
index 181acc3..7ef1327 100644
--- a/src/OpenGL/libGLES_CM/Context.cpp
+++ b/src/OpenGL/libGLES_CM/Context.cpp
@@ -164,7 +164,13 @@
materialEmission = {0.0f, 0.0f, 0.0f, 1.0f};
matrixMode = GL_MODELVIEW;
- texture2D = false;
+
+ for(int i = 0; i < MAX_TEXTURE_UNITS; i++)
+ {
+ texture2Denabled[i] = false;
+ textureExternalEnabled[i] = false;
+ }
+
clientTexture = GL_TEXTURE0;
setVertexAttrib(sw::Color0, 1.0f, 1.0f, 1.0f, 1.0f);
@@ -619,9 +625,14 @@
device->setFogColor(sw::Color<float>(r, g, b, a));
}
-void Context::setTexture2D(bool enable)
+void Context::setTexture2Denabled(bool enable)
{
- texture2D = enable;
+ texture2Denabled[mState.activeSampler] = enable;
+}
+
+void Context::setTextureExternalEnabled(bool enable)
+{
+ textureExternalEnabled[mState.activeSampler] = enable;
}
void Context::setLineWidth(GLfloat width)
@@ -1774,9 +1785,18 @@
for(int samplerIndex = 0; samplerIndex < MAX_TEXTURE_UNITS; samplerIndex++)
{
- Texture *texture = getSamplerTexture(samplerIndex, TEXTURE_2D);
+ Texture *texture = nullptr;
+
+ if(textureExternalEnabled[samplerIndex])
+ {
+ texture = getSamplerTexture(samplerIndex, TEXTURE_EXTERNAL);
+ }
+ else if(texture2Denabled[samplerIndex])
+ {
+ texture = getSamplerTexture(samplerIndex, TEXTURE_2D);
+ }
- if(texture2D && texture->isSamplerComplete())
+ if(texture && texture->isSamplerComplete())
{
GLenum wrapS = texture->getWrapS();
GLenum wrapT = texture->getWrapT();
diff --git a/src/OpenGL/libGLES_CM/Context.h b/src/OpenGL/libGLES_CM/Context.h
index 8e7cc43..ce69258 100644
--- a/src/OpenGL/libGLES_CM/Context.h
+++ b/src/OpenGL/libGLES_CM/Context.h
@@ -322,7 +322,8 @@
void setFogEnd(float fogEnd);
void setFogColor(float r, float g, float b, float a);
- void setTexture2D(bool enabled);
+ void setTexture2Denabled(bool enabled);
+ void setTextureExternalEnabled(bool enabled);
void clientActiveTexture(GLenum texture);
GLenum getClientActiveTexture() const;
unsigned int getActiveTexture() const;
@@ -513,7 +514,8 @@
sw::MatrixStack textureStack0;
sw::MatrixStack textureStack1;
- bool texture2D;
+ bool texture2Denabled[MAX_TEXTURE_UNITS];
+ bool textureExternalEnabled[MAX_TEXTURE_UNITS];
GLenum clientTexture;
Device *device;
diff --git a/src/OpenGL/libGLES_CM/libGLES_CM.cpp b/src/OpenGL/libGLES_CM/libGLES_CM.cpp
index fcd6089..d212231 100644
--- a/src/OpenGL/libGLES_CM/libGLES_CM.cpp
+++ b/src/OpenGL/libGLES_CM/libGLES_CM.cpp
@@ -1228,7 +1228,8 @@
case GL_LIGHT6: context->setLight(6, false); break;
case GL_LIGHT7: context->setLight(7, false); break;
case GL_FOG: context->setFog(false); break;
- case GL_TEXTURE_2D: context->setTexture2D(false); break;
+ case GL_TEXTURE_2D: context->setTexture2Denabled(false); break;
+ case GL_TEXTURE_EXTERNAL_OES: context->setTextureExternalEnabled(false); break;
case GL_ALPHA_TEST: UNIMPLEMENTED(); break;
case GL_COLOR_LOGIC_OP: UNIMPLEMENTED(); break;
case GL_POINT_SMOOTH: UNIMPLEMENTED(); break;
@@ -1343,7 +1344,8 @@
case GL_LIGHT6: context->setLight(6, true); break;
case GL_LIGHT7: context->setLight(7, true); break;
case GL_FOG: context->setFog(true); break;
- case GL_TEXTURE_2D: context->setTexture2D(true); break;
+ case GL_TEXTURE_2D: context->setTexture2Denabled(true); break;
+ case GL_TEXTURE_EXTERNAL_OES: context->setTextureExternalEnabled(true); break;
case GL_ALPHA_TEST: UNIMPLEMENTED(); break;
case GL_COLOR_LOGIC_OP: UNIMPLEMENTED(); break;
case GL_POINT_SMOOTH: UNIMPLEMENTED(); break;