glGenerateMipmap validation - Added *ALPHA8*/*LUMINANCE8* formats and *_SNORM formats to non color renderable formats - Added a new function IsMipMappable in order to allow mipmapping of the *ALPHA8*/*LUMINANCE8* formats Fixes all (24) failures in: dEQP-GLES3.functional.texture.mipmap.2d.generate* dEQP-GLES3.functional.texture.mipmap.cube.generate* Also fixes WebGL test: conformance/textures/misc/texture-npot.html Change-Id: I5f3210094fbc5b2e5bae25c88a5ef4f1ffb69cbd Reviewed-on: https://swiftshader-review.googlesource.com/14130 Tested-by: Alexis Hétu <sugoi@google.com> Reviewed-by: Nicolas Capens <nicolascapens@google.com>
diff --git a/src/OpenGL/libGLESv2/libGLESv2.cpp b/src/OpenGL/libGLESv2/libGLESv2.cpp index 5f14e9c..3d7aa42 100644 --- a/src/OpenGL/libGLESv2/libGLESv2.cpp +++ b/src/OpenGL/libGLESv2/libGLESv2.cpp
@@ -2306,8 +2306,7 @@ return error(GL_INVALID_OPERATION); } - if(!IsColorRenderable(texture->getFormat(target, 0), clientVersion, true) || - sw::Surface::isNonNormalizedInteger(texture->getInternalFormat(target, 0))) + if(!IsMipmappable(texture->getFormat(target, 0), texture->getInternalFormat(target, 0), clientVersion)) { return error(GL_INVALID_OPERATION); }
diff --git a/src/OpenGL/libGLESv2/utilities.cpp b/src/OpenGL/libGLESv2/utilities.cpp index 24f415a..0d86291 100644 --- a/src/OpenGL/libGLESv2/utilities.cpp +++ b/src/OpenGL/libGLESv2/utilities.cpp
@@ -1126,6 +1126,13 @@ case GL_RGBA32UI: case GL_R11F_G11F_B10F: return clientVersion >= 3; + case GL_R8_SNORM: + case GL_RG8_SNORM: + case GL_RGB8_SNORM: + case GL_RGBA8_SNORM: + case GL_ALPHA8_EXT: + case GL_LUMINANCE8_EXT: + case GL_LUMINANCE8_ALPHA8_EXT: case GL_DEPTH_COMPONENT24: case GL_DEPTH_COMPONENT32_OES: case GL_DEPTH_COMPONENT32F: @@ -1141,6 +1148,24 @@ return false; } + bool IsMipmappable(GLenum internalformat, sw::Format internalFormat, GLint clientVersion) + { + if(sw::Surface::isNonNormalizedInteger(internalFormat)) + { + return false; + } + + switch(internalformat) + { + case GL_ALPHA8_EXT: + case GL_LUMINANCE8_EXT: + case GL_LUMINANCE8_ALPHA8_EXT: + return true; + default: + return IsColorRenderable(internalformat, clientVersion, true); + } + } + bool IsDepthRenderable(GLenum internalformat, GLint clientVersion) { switch(internalformat)
diff --git a/src/OpenGL/libGLESv2/utilities.h b/src/OpenGL/libGLESv2/utilities.h index 815a191..6e18252 100644 --- a/src/OpenGL/libGLESv2/utilities.h +++ b/src/OpenGL/libGLESv2/utilities.h
@@ -57,6 +57,7 @@ GLsizei GetTypeSize(GLenum type); bool IsColorRenderable(GLenum internalformat, GLint clientVersion, bool isTexture); + bool IsMipmappable(GLenum format, sw::Format internalFormat, GLint clientVersion); bool IsDepthRenderable(GLenum internalformat, GLint clientVersion); bool IsStencilRenderable(GLenum internalformat, GLint clientVersion);