Commit 63458a3e by Geoff Lang Committed by Commit Bot

CopyTextureCHROMIUM: Validate the texture target enums first.

INVALID_ENUM should be generated before any INVALID_VALUE errors based on the texture state. BUG=angleproject:1932 Change-Id: If74440602d56b1a86fa24ff87c38d2b0dec2bfb2 Reviewed-on: https://chromium-review.googlesource.com/744448 Commit-Queue: Corentin Wallez <cwallez@chromium.org> Reviewed-by: 's avatarCorentin Wallez <cwallez@chromium.org>
parent 206a58d1
...@@ -306,30 +306,39 @@ bool IsValidCopyTextureDestinationFormatType(Context *context, GLint internalFor ...@@ -306,30 +306,39 @@ bool IsValidCopyTextureDestinationFormatType(Context *context, GLint internalFor
return true; return true;
} }
bool IsValidCopyTextureDestinationTarget(Context *context, GLenum textureType, GLenum target) bool IsValidCopyTextureDestinationTargetEnum(Context *context, GLenum target)
{ {
switch (target) switch (target)
{ {
case GL_TEXTURE_2D: case GL_TEXTURE_2D:
return textureType == GL_TEXTURE_2D;
case GL_TEXTURE_CUBE_MAP_POSITIVE_X: case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
case GL_TEXTURE_CUBE_MAP_NEGATIVE_X: case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
case GL_TEXTURE_CUBE_MAP_POSITIVE_Y: case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y: case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
case GL_TEXTURE_CUBE_MAP_POSITIVE_Z: case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z: case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
return textureType == GL_TEXTURE_CUBE_MAP; return true;
case GL_TEXTURE_RECTANGLE_ANGLE: case GL_TEXTURE_RECTANGLE_ANGLE:
return textureType == GL_TEXTURE_RECTANGLE_ANGLE && return context->getExtensions().textureRectangle;
context->getExtensions().textureRectangle;
default: default:
return false; return false;
} }
} }
bool IsValidCopyTextureDestinationTarget(Context *context, GLenum textureType, GLenum target)
{
if (IsCubeMapTextureTarget(target))
{
return textureType == GL_TEXTURE_CUBE_MAP;
}
else
{
return textureType == target;
}
}
bool IsValidCopyTextureSourceTarget(Context *context, GLenum target) bool IsValidCopyTextureSourceTarget(Context *context, GLenum target)
{ {
switch (target) switch (target)
...@@ -3871,6 +3880,12 @@ bool ValidateCopyTextureCHROMIUM(Context *context, ...@@ -3871,6 +3880,12 @@ bool ValidateCopyTextureCHROMIUM(Context *context,
return false; return false;
} }
if (!IsValidCopyTextureDestinationTargetEnum(context, destTarget))
{
ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidTextureTarget);
return false;
}
const Texture *dest = context->getTexture(destId); const Texture *dest = context->getTexture(destId);
if (dest == nullptr) if (dest == nullptr)
{ {
...@@ -3993,6 +4008,12 @@ bool ValidateCopySubTextureCHROMIUM(Context *context, ...@@ -3993,6 +4008,12 @@ bool ValidateCopySubTextureCHROMIUM(Context *context,
return false; return false;
} }
if (!IsValidCopyTextureDestinationTargetEnum(context, destTarget))
{
ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidTextureTarget);
return false;
}
const Texture *dest = context->getTexture(destId); const Texture *dest = context->getTexture(destId);
if (dest == nullptr) if (dest == nullptr)
{ {
......
...@@ -395,6 +395,29 @@ TEST_P(CopyTextureTest, CopySubTextureInvalidTextureIds) ...@@ -395,6 +395,29 @@ TEST_P(CopyTextureTest, CopySubTextureInvalidTextureIds)
EXPECT_GL_NO_ERROR(); EXPECT_GL_NO_ERROR();
} }
TEST_P(CopyTextureTest, InvalidTarget)
{
ANGLE_SKIP_TEST_IF(!checkExtensions());
GLTexture textures[2];
glBindTexture(GL_TEXTURE_2D, textures[0]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
glBindTexture(GL_TEXTURE_2D, textures[1]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 3, 3, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
// Invalid enum for a completely invalid target
glCopySubTextureCHROMIUM(textures[0], 0, GL_INVALID_VALUE, textures[1], 0, 1, 1, 0, 0, 1, 1,
false, false, false);
EXPECT_GL_ERROR(GL_INVALID_ENUM);
// Invalid value for a valid target enum but is not valid for the destination texture
glCopySubTextureCHROMIUM(textures[0], 0, GL_TEXTURE_CUBE_MAP_POSITIVE_X, textures[1], 0, 1, 1,
0, 0, 1, 1, false, false, false);
EXPECT_GL_ERROR(GL_INVALID_VALUE);
}
// Test that using an offset in CopySubTexture works correctly // Test that using an offset in CopySubTexture works correctly
TEST_P(CopyTextureTest, CopySubTextureOffset) TEST_P(CopyTextureTest, CopySubTextureOffset)
{ {
......
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