Texture rectangle related fixes and associated tests
Imported texture rectangle tests from angle and fixed all
texture rectangle related failures:
- Rectangle textures can be rendered to
- Rectangle textures only support level 0
- Rectangle textures can't be compressed
- glTexStorage2D can no longer create a texture larger
than the maximum size allowed
Change-Id: I089291c94aad79e244782a8d56dd224c7510d237
Reviewed-on: https://swiftshader-review.googlesource.com/16908
Reviewed-by: Alexis Hétu <sugoi@google.com>
Tested-by: Alexis Hétu <sugoi@google.com>
diff --git a/src/OpenGL/libGLESv2/libGLESv3.cpp b/src/OpenGL/libGLESv2/libGLESv3.cpp
index 5006161..a13000e 100644
--- a/src/OpenGL/libGLESv2/libGLESv3.cpp
+++ b/src/OpenGL/libGLESv2/libGLESv3.cpp
@@ -3594,7 +3594,7 @@
TRACE("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
target, levels, internalformat, width, height);
- if(width < 1 || height < 1 || levels < 1)
+ if(width < 1 || height < 1 || levels < 1 || ((target == GL_TEXTURE_RECTANGLE_ARB) && (levels != 1)))
{
return error(GL_INVALID_VALUE);
}
@@ -3604,7 +3604,8 @@
return error(GL_INVALID_OPERATION);
}
- if(!IsSizedInternalFormat(internalformat) && !IsCompressed(internalformat, egl::getClientVersion()))
+ bool isCompressed = IsCompressed(internalformat, egl::getClientVersion());
+ if(!IsSizedInternalFormat(internalformat) && !isCompressed)
{
return error(GL_INVALID_ENUM);
}
@@ -3615,9 +3616,19 @@
{
switch(target)
{
- case GL_TEXTURE_2D:
case GL_TEXTURE_RECTANGLE_ARB:
+ if(isCompressed) // Rectangle textures cannot be compressed
{
+ return error(GL_INVALID_ENUM);
+ }
+ case GL_TEXTURE_2D:
+ {
+ if((width > es2::IMPLEMENTATION_MAX_TEXTURE_SIZE) ||
+ (height > es2::IMPLEMENTATION_MAX_TEXTURE_SIZE))
+ {
+ return error(GL_INVALID_VALUE);
+ }
+
es2::Texture2D *texture = context->getTexture2D(target);
if(!texture || texture->name == 0 || texture->getImmutableFormat() == GL_TRUE)
{
@@ -3635,6 +3646,12 @@
break;
case GL_TEXTURE_CUBE_MAP:
{
+ if((width > es2::IMPLEMENTATION_MAX_CUBE_MAP_TEXTURE_SIZE) ||
+ (height > es2::IMPLEMENTATION_MAX_CUBE_MAP_TEXTURE_SIZE))
+ {
+ return error(GL_INVALID_VALUE);
+ }
+
es2::TextureCubeMap *texture = context->getTextureCubeMap();
if(!texture || texture->name == 0 || texture->getImmutableFormat())
{