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