Fix 2D texture image functions not returning GL_INVALID_ENUM with target == GL_TEXTURE_3D
In particular, many of these would produce an UNREACHABLE assert in libGLESv2, such as glCopyTexSubImage2D.
Bug: b/116827965
Change-Id: I719ff20b7452d0b933b8e4120abe831783844342
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/29048
Kokoro-Presubmit: kokoro <noreply+kokoro@google.com>
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
Tested-by: Antonio Maiorano <amaiorano@google.com>
diff --git a/src/OpenGL/libGLESv2/libGLESv2.cpp b/src/OpenGL/libGLESv2/libGLESv2.cpp
index 86ebabb..75f4d06 100644
--- a/src/OpenGL/libGLESv2/libGLESv2.cpp
+++ b/src/OpenGL/libGLESv2/libGLESv2.cpp
@@ -794,7 +794,7 @@
"GLsizei imageSize = %d, const GLvoid* data = %p)",
target, level, xoffset, yoffset, width, height, format, imageSize, data);
- if(!es2::IsTextureTarget(target))
+ if(!es2::IsTexImageTarget(target))
{
return error(GL_INVALID_ENUM);
}
@@ -1017,7 +1017,7 @@
"GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
target, level, xoffset, yoffset, x, y, width, height);
- if(!es2::IsTextureTarget(target))
+ if(!es2::IsTexImageTarget(target))
{
return error(GL_INVALID_ENUM);
}
@@ -4886,7 +4886,7 @@
"const GLvoid* data = %p)",
target, level, xoffset, yoffset, width, height, format, type, data);
- if(!es2::IsTextureTarget(target))
+ if(!es2::IsTexImageTarget(target))
{
return error(GL_INVALID_ENUM);
}
diff --git a/src/OpenGL/libGLESv2/utilities.cpp b/src/OpenGL/libGLESv2/utilities.cpp
index 4db3b93..aa14300 100644
--- a/src/OpenGL/libGLESv2/utilities.cpp
+++ b/src/OpenGL/libGLESv2/utilities.cpp
@@ -869,9 +869,14 @@
}
}
+ bool IsTexImageTarget(GLenum target)
+ {
+ return target == GL_TEXTURE_2D || IsCubemapTextureTarget(target) || target == GL_TEXTURE_2D_ARRAY || target == GL_TEXTURE_RECTANGLE_ARB;
+ }
+
bool IsTextureTarget(GLenum target)
{
- return target == GL_TEXTURE_2D || IsCubemapTextureTarget(target) || target == GL_TEXTURE_3D || target == GL_TEXTURE_2D_ARRAY || target == GL_TEXTURE_RECTANGLE_ARB;
+ return IsTexImageTarget(target) || target == GL_TEXTURE_3D;
}
GLenum ValidateTextureFormatType(GLenum format, GLenum type, GLint internalformat, GLenum target)
diff --git a/src/OpenGL/libGLESv2/utilities.h b/src/OpenGL/libGLESv2/utilities.h
index a698d20..187ef13 100644
--- a/src/OpenGL/libGLESv2/utilities.h
+++ b/src/OpenGL/libGLESv2/utilities.h
@@ -56,6 +56,7 @@
bool IsStencilTexture(GLint format);
bool IsCubemapTextureTarget(GLenum target);
int CubeFaceIndex(GLenum cubeTarget);
+ bool IsTexImageTarget(GLenum target);
bool IsTextureTarget(GLenum target);
GLenum ValidateTextureFormatType(GLenum format, GLenum type, GLint internalformat, GLenum target);
size_t GetTypeSize(GLenum type);
diff --git a/tests/GLESUnitTests/unittests.cpp b/tests/GLESUnitTests/unittests.cpp
index ed8c441..a9c4f31 100644
--- a/tests/GLESUnitTests/unittests.cpp
+++ b/tests/GLESUnitTests/unittests.cpp
@@ -1583,6 +1583,35 @@
Uninitialize();
}
+TEST_F(SwiftShaderTest, InvalidEnum_TexImage2D)
+{
+ Initialize(3, false);
+
+ const GLenum invalidTarget = GL_TEXTURE_3D;
+
+ glTexImage2D(invalidTarget, 0, GL_R11F_G11F_B10F, 256, 256, 0, GL_RGB, GL_UNSIGNED_INT_10F_11F_11F_REV, nullptr);
+ EXPECT_GLENUM_EQ(GL_INVALID_ENUM, glGetError());
+
+ float pixels[3] = { 0.0f, 0.0f, 0.0f };
+ glTexSubImage2D(invalidTarget, 0, 0, 0, 1, 1, GL_RGB, GL_FLOAT, pixels);
+ EXPECT_GLENUM_EQ(GL_INVALID_ENUM, glGetError());
+
+ glCopyTexImage2D(invalidTarget, 0, GL_RGB, 2, 6, 8, 8, 0);
+ EXPECT_GLENUM_EQ(GL_INVALID_ENUM, glGetError());
+
+ glCopyTexSubImage2D(invalidTarget, 0, 0, 0, 0, 0, 1, 1);
+ EXPECT_GLENUM_EQ(GL_INVALID_ENUM, glGetError());
+
+ const char data[128] = { 0 };
+ glCompressedTexImage2D(invalidTarget, 0, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, 16, 16, 0, 128, data);
+ EXPECT_GLENUM_EQ(GL_INVALID_ENUM, glGetError());
+
+ glCompressedTexSubImage2D(invalidTarget, 0, 0, 0, 0, 0, GL_COMPRESSED_RGB_S3TC_DXT1_EXT, 0, 0);
+ EXPECT_GLENUM_EQ(GL_INVALID_ENUM, glGetError());
+
+ Uninitialize();
+}
+
TEST_F(SwiftShaderTest, CompilerLimits_DeepNestedIfs)
{
std::string body = "return 1.0;";