Implement GL_GENERATE_MIPMAP.

Bug 21278131

Change-Id: I6252b84f0fd810496475a6e19c9f131bb69d977f
Reviewed-on: https://swiftshader-review.googlesource.com/3194
Reviewed-by: Nicolas Capens <capn@google.com>
Tested-by: Nicolas Capens <capn@google.com>
diff --git a/src/OpenGL/libGLES_CM/Texture.cpp b/src/OpenGL/libGLES_CM/Texture.cpp
index d75a5c2..0c3d443 100644
--- a/src/OpenGL/libGLES_CM/Texture.cpp
+++ b/src/OpenGL/libGLES_CM/Texture.cpp
@@ -35,6 +35,7 @@
     mWrapS = GL_REPEAT;

     mWrapT = GL_REPEAT;

 	mMaxAnisotropy = 1.0f;

+	generateMipmap = GL_FALSE;

 	cropRectU = 0;

 	cropRectV = 0;

 	cropRectW = 0;

@@ -148,6 +149,11 @@
     return true;

 }

 

+void Texture::setGenerateMipmap(GLboolean enable)

+{

+	generateMipmap = enable;

+}

+

 void Texture::setCropRect(GLint u, GLint v, GLint w, GLint h)

 {

 	cropRectU = u;

@@ -181,6 +187,11 @@
     return mMaxAnisotropy;

 }

 

+GLboolean Texture::getGenerateMipmap() const

+{

+	return generateMipmap;

+}

+

 GLint Texture::getCropRectU() const

 {

 	return cropRectU;

@@ -694,6 +705,12 @@
 

 egl::Image *Texture2D::getImage(unsigned int level)

 {

+	if(generateMipmap && image[0]->hasDirtyMipmaps())

+	{

+		generateMipmaps();

+		image[0]->cleanMipmaps();

+	}

+

 	return image[level];

 }

 

diff --git a/src/OpenGL/libGLES_CM/Texture.h b/src/OpenGL/libGLES_CM/Texture.h
index ddf9c4d..d72f512 100644
--- a/src/OpenGL/libGLES_CM/Texture.h
+++ b/src/OpenGL/libGLES_CM/Texture.h
@@ -64,6 +64,7 @@
     bool setWrapS(GLenum wrap);

     bool setWrapT(GLenum wrap);

 	bool setMaxAnisotropy(GLfloat textureMaxAnisotropy);

+	void setGenerateMipmap(GLboolean enable);

 	void setCropRect(GLint u, GLint v, GLint w, GLint h);

 

     GLenum getMinFilter() const;

@@ -71,6 +72,7 @@
     GLenum getWrapS() const;

     GLenum getWrapT() const;

 	GLfloat getMaxAnisotropy() const;

+	GLboolean getGenerateMipmap() const;

 	GLint getCropRectU() const;

     GLint getCropRectV() const;

     GLint getCropRectW() const;

@@ -110,6 +112,7 @@
     GLenum mWrapS;

     GLenum mWrapT;

 	GLfloat mMaxAnisotropy;

+	GLboolean generateMipmap;

 	GLint cropRectU;

 	GLint cropRectV;

 	GLint cropRectW;

diff --git a/src/OpenGL/libGLES_CM/libGLES_CM.cpp b/src/OpenGL/libGLES_CM/libGLES_CM.cpp
index 3f28b05..273aeab 100644
--- a/src/OpenGL/libGLES_CM/libGLES_CM.cpp
+++ b/src/OpenGL/libGLES_CM/libGLES_CM.cpp
@@ -2263,6 +2263,9 @@
 		case GL_TEXTURE_MAX_ANISOTROPY_EXT:

 			*params = texture->getMaxAnisotropy();

 			break;

+		case GL_GENERATE_MIPMAP:

+			*params = (GLfloat)texture->getGenerateMipmap();

+			break;

 		case GL_REQUIRED_TEXTURE_IMAGE_UNITS_OES:

 			*params = (GLfloat)1;

 			break;

@@ -2311,6 +2314,9 @@
 		case GL_TEXTURE_MAX_ANISOTROPY_EXT:

 			*params = (GLint)texture->getMaxAnisotropy();

 			break;

+		case GL_GENERATE_MIPMAP:

+			*params = (GLint)texture->getGenerateMipmap();

+			break;

 		case GL_REQUIRED_TEXTURE_IMAGE_UNITS_OES:

 			*params = 1;

 			break;

@@ -3376,6 +3382,9 @@
 				return error(GL_INVALID_VALUE);

 			}

 			break;

+		case GL_GENERATE_MIPMAP:

+			texture->setGenerateMipmap((GLboolean)param);

+			break;

 		default:

 			return error(GL_INVALID_ENUM);

 		}

@@ -3441,6 +3450,9 @@
 				return error(GL_INVALID_VALUE);

 			}

 			break;

+		case GL_GENERATE_MIPMAP:

+			texture->setGenerateMipmap((GLboolean)param);

+			break;

 		default:

 			return error(GL_INVALID_ENUM);

 		}