Fix auto generating mipmaps for incomplete textures.
Bug 21278131
Change-Id: I1969f40ab4cb5e475c9c0a4e5f7d4238a3deb7be
Reviewed-on: https://swiftshader-review.googlesource.com/3220
Tested-by: Nicolas Capens <capn@google.com>
Reviewed-by: Alexis Hétu <sugoi@google.com>
Tested-by: Ping-Hao Wu <pinghao@google.com>
Reviewed-by: Nicolas Capens <capn@google.com>
diff --git a/src/OpenGL/libGLES_CM/Context.cpp b/src/OpenGL/libGLES_CM/Context.cpp
index cc295a2..7b725b0 100644
--- a/src/OpenGL/libGLES_CM/Context.cpp
+++ b/src/OpenGL/libGLES_CM/Context.cpp
@@ -1810,6 +1810,8 @@
if(texture && texture->isSamplerComplete())
{
+ texture->autoGenerateMipmaps();
+
GLenum wrapS = texture->getWrapS();
GLenum wrapT = texture->getWrapT();
GLenum texFilter = texture->getMinFilter();
diff --git a/src/OpenGL/libGLES_CM/Texture.cpp b/src/OpenGL/libGLES_CM/Texture.cpp
index 0c3d443..c2d02c9 100644
--- a/src/OpenGL/libGLES_CM/Texture.cpp
+++ b/src/OpenGL/libGLES_CM/Texture.cpp
@@ -618,7 +618,7 @@
if(isMipmapFiltered())
{
- if(!isMipmapComplete())
+ if(!generateMipmap && !isMipmapComplete())
{
return false;
}
@@ -703,14 +703,17 @@
}
}
-egl::Image *Texture2D::getImage(unsigned int level)
+void Texture2D::autoGenerateMipmaps()
{
if(generateMipmap && image[0]->hasDirtyMipmaps())
{
generateMipmaps();
image[0]->cleanMipmaps();
}
+}
+egl::Image *Texture2D::getImage(unsigned int level)
+{
return image[level];
}
diff --git a/src/OpenGL/libGLES_CM/Texture.h b/src/OpenGL/libGLES_CM/Texture.h
index d72f512..13501cb 100644
--- a/src/OpenGL/libGLES_CM/Texture.h
+++ b/src/OpenGL/libGLES_CM/Texture.h
@@ -95,6 +95,8 @@
virtual bool isShared(GLenum target, unsigned int level) const = 0;
virtual void generateMipmaps() = 0;
+ virtual void autoGenerateMipmaps() = 0;
+
virtual void copySubImage(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height, Framebuffer *source) = 0;
protected:
@@ -156,6 +158,7 @@
virtual void releaseTexImage();
virtual void generateMipmaps();
+ virtual void autoGenerateMipmaps();
virtual Renderbuffer *getRenderbuffer(GLenum target);
virtual egl::Image *getRenderTarget(GLenum target, unsigned int level);