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