Commit d1fff586 by Antonio Maiorano

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: 's avatarNicolas Capens <nicolascapens@google.com> Tested-by: 's avatarAntonio Maiorano <amaiorano@google.com>
parent 8e2440d0
......@@ -794,7 +794,7 @@ void CompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yo
"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 @@ void CopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset,
"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 @@ void TexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLs
"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);
}
......
......@@ -869,9 +869,14 @@ namespace es2
}
}
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)
......
......@@ -56,6 +56,7 @@ namespace es2
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);
......
......@@ -1583,6 +1583,35 @@ TEST_F(SwiftShaderTest, TextureRectangle_CopyTexSubImage)
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;";
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment