OSDN Git Service

Ignore glGenerateMipmap for unspecified or zero-sized textures.
authorNicolas Capens <capn@google.com>
Tue, 15 May 2018 20:31:10 +0000 (16:31 -0400)
committerNicolas Capens <nicolascapens@google.com>
Wed, 16 May 2018 20:44:10 +0000 (20:44 +0000)
https://gitlab.khronos.org/opengl/API/issues/72 was resolved to treat
these cases as a no-op and not generate an error.

Bug chromium:825545

Change-Id: Ic4cfbc728156bb88a6dc70486ae57c3e12ea43ae
Reviewed-on: https://swiftshader-review.googlesource.com/18870
Tested-by: Nicolas Capens <nicolascapens@google.com>
Reviewed-by: Alexis Hétu <sugoi@google.com>
src/OpenGL/libGLESv2/Texture.cpp
src/OpenGL/libGLESv2/utilities.cpp

index ec96373..82c68e4 100644 (file)
@@ -769,7 +769,15 @@ bool Texture2D::isDepth(GLenum target, GLint level) const
 
 void Texture2D::generateMipmaps()
 {
-       ASSERT(image[mBaseLevel]);
+       if(!image[mBaseLevel])
+       {
+               return;   // Image unspecified. Not an error.
+       }
+
+       if(image[mBaseLevel]->getWidth() == 0 || image[mBaseLevel]->getHeight() == 0)
+       {
+               return;   // Zero dimension. Not an error.
+       }
 
        int maxsize = std::max(image[mBaseLevel]->getWidth(), image[mBaseLevel]->getHeight());
        int p = log2(maxsize) + mBaseLevel;
@@ -1321,7 +1329,10 @@ void TextureCubeMap::copySubImage(GLenum target, GLint level, GLint xoffset, GLi
 
 void TextureCubeMap::generateMipmaps()
 {
-       ASSERT(isCubeComplete());
+       if(!isCubeComplete())
+       {
+               return error(GL_INVALID_OPERATION);
+       }
 
        int p = log2(image[0][mBaseLevel]->getWidth()) + mBaseLevel;
        int q = std::min(p, mMaxLevel);
@@ -1739,7 +1750,15 @@ bool Texture3D::isDepth(GLenum target, GLint level) const
 
 void Texture3D::generateMipmaps()
 {
-       ASSERT(image[mBaseLevel]);
+       if(!image[mBaseLevel])
+       {
+               return;   // Image unspecified. Not an error.
+       }
+
+       if(image[mBaseLevel]->getWidth() == 0 || image[mBaseLevel]->getHeight() == 0 || image[mBaseLevel]->getDepth() == 0)
+       {
+               return;   // Zero dimension. Not an error.
+       }
 
        int maxsize = std::max(std::max(image[mBaseLevel]->getWidth(), image[mBaseLevel]->getHeight()), image[mBaseLevel]->getDepth());
        int p = log2(maxsize) + mBaseLevel;
@@ -1833,7 +1852,15 @@ GLenum Texture2DArray::getTarget() const
 
 void Texture2DArray::generateMipmaps()
 {
-       ASSERT(image[mBaseLevel]);
+       if(!image[mBaseLevel])
+       {
+               return;   // Image unspecified. Not an error.
+       }
+
+       if(image[mBaseLevel]->getWidth() == 0 || image[mBaseLevel]->getHeight() == 0 || image[mBaseLevel]->getDepth() == 0)
+       {
+               return;   // Zero dimension. Not an error.
+       }
 
        int depth = image[mBaseLevel]->getDepth();
        int maxsize = std::max(image[mBaseLevel]->getWidth(), image[mBaseLevel]->getHeight());
index fff4d7b..b863f1d 100644 (file)
@@ -1386,6 +1386,11 @@ namespace es2
 
        bool IsMipmappable(GLint internalformat, GLint clientVersion)
        {
+               if(internalformat == GL_NONE)
+               {
+                       return true;   // Image unspecified. Not an error.
+               }
+
                if(IsNonNormalizedInteger(internalformat))
                {
                        return false;