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