Ignore glGenerateMipmap for unspecified or zero-sized textures.
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>
diff --git a/src/OpenGL/libGLESv2/Texture.cpp b/src/OpenGL/libGLESv2/Texture.cpp
index ec96373..82c68e4 100644
--- a/src/OpenGL/libGLESv2/Texture.cpp
+++ b/src/OpenGL/libGLESv2/Texture.cpp
@@ -769,7 +769,15 @@
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::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 @@
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 @@
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());
diff --git a/src/OpenGL/libGLESv2/utilities.cpp b/src/OpenGL/libGLESv2/utilities.cpp
index fff4d7b..b863f1d 100644
--- a/src/OpenGL/libGLESv2/utilities.cpp
+++ b/src/OpenGL/libGLESv2/utilities.cpp
@@ -1386,6 +1386,11 @@
bool IsMipmappable(GLint internalformat, GLint clientVersion)
{
+ if(internalformat == GL_NONE)
+ {
+ return true; // Image unspecified. Not an error.
+ }
+
if(IsNonNormalizedInteger(internalformat))
{
return false;