Make a virtual method Texture::mipLevels to return the value of mip levels defined as in the GL spec.

Also known as the "q" function.

TRAC #23961

Signed-off-by: Geoff Lang
Signed-off-by: Shannon Woods

diff --git a/src/libGLESv2/Texture.cpp b/src/libGLESv2/Texture.cpp
index 34a0158..cc79d25 100644
--- a/src/libGLESv2/Texture.cpp
+++ b/src/libGLESv2/Texture.cpp
@@ -352,6 +352,11 @@
     return creationLevels(size, size);
 }
 
+int Texture::mipLevels() const
+{
+    return log2(std::max(std::max(getBaseLevelWidth(), getBaseLevelHeight()), getBaseLevelDepth()));
+}
+
 Texture2D::Texture2D(rx::Renderer *renderer, GLuint id) : Texture(renderer, id, GL_TEXTURE_2D)
 {
     mTexStorage = NULL;
@@ -731,10 +736,7 @@
 // Tests for 2D texture (mipmap) completeness. [OpenGL ES 2.0.24] section 3.7.10 page 81.
 bool Texture2D::isMipmapComplete() const
 {
-    GLsizei width = getBaseLevelWidth();
-    GLsizei height = getBaseLevelHeight();
-
-    int q = log2(std::max(width, height));
+    int q = mipLevels();
 
     for (int level = 0; level <= q; level++)
     {
@@ -889,28 +891,28 @@
 void Texture2D::generateMipmaps()
 {
     // Purge array levels 1 through q and reset them to represent the generated mipmap levels.
-    unsigned int q = log2(std::max(getBaseLevelWidth(), getBaseLevelHeight()));
-    for (unsigned int i = 1; i <= q; i++)
+    int q = mipLevels();
+    for (int level = 1; level <= q; level++)
     {
-        redefineImage(i, getBaseLevelInternalFormat(),
-                      std::max(getBaseLevelWidth() >> i, 1),
-                      std::max(getBaseLevelHeight() >> i, 1));
+        redefineImage(level, getBaseLevelInternalFormat(),
+                      std::max(getBaseLevelWidth() >> level, 1),
+                      std::max(getBaseLevelHeight() >> level, 1));
     }
 
     if (mTexStorage && mTexStorage->isRenderTarget())
     {
-        for (unsigned int i = 1; i <= q; i++)
+        for (int level = 1; level <= q; level++)
         {
-            mTexStorage->generateMipmap(i);
+            mTexStorage->generateMipmap(level);
 
-            mImageArray[i]->markClean();
+            mImageArray[level]->markClean();
         }
     }
     else
     {
-        for (unsigned int i = 1; i <= q; i++)
+        for (int level = 1; level <= q; level++)
         {
-            mRenderer->generateMipmap(mImageArray[i], mImageArray[i - 1]);
+            mRenderer->generateMipmap(mImageArray[level], mImageArray[level - 1]);
         }
     }
 }
@@ -1203,8 +1205,7 @@
         return false;
     }
 
-    GLsizei size = getBaseLevelWidth();
-    int q = log2(size);
+    int q = mipLevels();
 
     for (int face = 0; face < 6; face++)
     {
@@ -1533,14 +1534,13 @@
 void TextureCubeMap::generateMipmaps()
 {
     // Purge array levels 1 through q and reset them to represent the generated mipmap levels.
-    int q = log2(getBaseLevelWidth());
+    int q = mipLevels();
     for (int faceIndex = 0; faceIndex < 6; faceIndex++)
     {
         for (int level = 1; level <= q; level++)
         {
-            redefineImage(faceIndex, level, mImageArray[faceIndex][0]->getInternalFormat(),
-                          std::max(mImageArray[faceIndex][0]->getWidth() >> level, 1),
-                          std::max(mImageArray[faceIndex][0]->getWidth() >> level, 1));
+            int faceLevelSize = (std::max(mImageArray[faceIndex][0]->getWidth() >> level, 1));
+            redefineImage(faceIndex, level, mImageArray[faceIndex][0]->getInternalFormat(), faceLevelSize, faceLevelSize);
         }
     }
 
@@ -1825,29 +1825,29 @@
 void Texture3D::generateMipmaps()
 {
     // Purge array levels 1 through q and reset them to represent the generated mipmap levels.
-    unsigned int q = log2(std::max(getBaseLevelWidth(), getBaseLevelHeight()));
-    for (unsigned int i = 1; i <= q; i++)
+    int q = mipLevels();
+    for (int level = 1; level <= q; level++)
     {
-        redefineImage(i, getBaseLevelInternalFormat(),
-                      std::max(getBaseLevelWidth() >> i, 1),
-                      std::max(getBaseLevelHeight() >> i, 1),
-                      std::max(getBaseLevelDepth() >> i, 1));
+        redefineImage(level, getBaseLevelInternalFormat(),
+                      std::max(getBaseLevelWidth() >> level, 1),
+                      std::max(getBaseLevelHeight() >> level, 1),
+                      std::max(getBaseLevelDepth() >> level, 1));
     }
 
     if (mTexStorage && mTexStorage->isRenderTarget())
     {
-        for (unsigned int i = 1; i <= q; i++)
+        for (int level = 1; level <= q; level++)
         {
-            mTexStorage->generateMipmap(i);
+            mTexStorage->generateMipmap(level);
 
-            mImageArray[i]->markClean();
+            mImageArray[level]->markClean();
         }
     }
     else
     {
-        for (unsigned int i = 1; i <= q; i++)
+        for (int level = 1; level <= q; level++)
         {
-            mRenderer->generateMipmap(mImageArray[i], mImageArray[i - 1]);
+            mRenderer->generateMipmap(mImageArray[level], mImageArray[level - 1]);
         }
     }
 }
@@ -1926,11 +1926,7 @@
 
 bool Texture3D::isMipmapComplete() const
 {
-    GLsizei width = getBaseLevelWidth();
-    GLsizei height = getBaseLevelHeight();
-    GLsizei depth = getBaseLevelDepth();
-
-    int q = log2(std::max(std::max(width, height), depth));
+    int q = mipLevels();
 
     for (int level = 0; level <= q; level++)
     {
@@ -2400,10 +2396,10 @@
     GLenum baseFormat = getBaseLevelInternalFormat();
 
     // Purge array levels 1 through q and reset them to represent the generated mipmap levels.
-    int q = log2(std::max(baseWidth, baseHeight));
-    for (int i = 1; i <= q; i++)
+    int q = mipLevels();
+    for (int level = 1; level <= q; level++)
     {
-        redefineImage(i, baseFormat, std::max(baseWidth >> i, 1), std::max(baseHeight >> i, 1), baseDepth);
+        redefineImage(level, baseFormat, std::max(baseWidth >> level, 1), std::max(baseHeight >> level, 1), baseDepth);
     }
 
     if (mTexStorage && mTexStorage->isRenderTarget())
@@ -2503,10 +2499,7 @@
 
 bool Texture2DArray::isMipmapComplete() const
 {
-    GLsizei width = getBaseLevelWidth();
-    GLsizei height = getBaseLevelHeight();
-
-    int q = log2(std::max(width, height));
+    int q = mipLevels();
 
     for (int level = 1; level <= q; level++)
     {
diff --git a/src/libGLESv2/Texture.h b/src/libGLESv2/Texture.h
index 3551b86..49acc54 100644
--- a/src/libGLESv2/Texture.h
+++ b/src/libGLESv2/Texture.h
@@ -125,6 +125,7 @@
     GLint creationLevels(GLsizei width, GLsizei height, GLsizei depth) const;
     GLint creationLevels(GLsizei width, GLsizei height) const;
     GLint creationLevels(GLsizei size) const;
+    int mipLevels() const;
 
     virtual void createTexture() = 0;
     virtual void updateTexture() = 0;