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