Refactor Texture to track image information for size and format queries.
BUG=angle:681
Change-Id: Ifb3f52d6348e4479181e66f1c39578f49e9dcf76
Reviewed-on: https://chromium-review.googlesource.com/235613
Reviewed-by: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Brandon Jones <bajones@chromium.org>
Tested-by: Geoff Lang <geofflang@chromium.org>
diff --git a/src/libANGLE/validationES.cpp b/src/libANGLE/validationES.cpp
index 9db35c8..51b8d9a 100644
--- a/src/libANGLE/validationES.cpp
+++ b/src/libANGLE/validationES.cpp
@@ -1230,28 +1230,11 @@
const gl::Caps &caps = context->getCaps();
- gl::Texture *texture = NULL;
- GLenum textureInternalFormat = GL_NONE;
- GLint textureLevelWidth = 0;
- GLint textureLevelHeight = 0;
- GLint textureLevelDepth = 0;
GLuint maxDimension = 0;
-
switch (target)
{
case GL_TEXTURE_2D:
- {
- gl::Texture2D *texture2d = context->getTexture2D();
- if (texture2d)
- {
- textureInternalFormat = texture2d->getInternalFormat(level);
- textureLevelWidth = texture2d->getWidth(level);
- textureLevelHeight = texture2d->getHeight(level);
- textureLevelDepth = 1;
- texture = texture2d;
- maxDimension = caps.max2DTextureSize;
- }
- }
+ maxDimension = caps.max2DTextureSize;
break;
case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
@@ -1260,48 +1243,15 @@
case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
- {
- gl::TextureCubeMap *textureCube = context->getTextureCubeMap();
- if (textureCube)
- {
- textureInternalFormat = textureCube->getInternalFormat(target, level);
- textureLevelWidth = textureCube->getWidth(target, level);
- textureLevelHeight = textureCube->getHeight(target, level);
- textureLevelDepth = 1;
- texture = textureCube;
- maxDimension = caps.maxCubeMapTextureSize;
- }
- }
+ maxDimension = caps.maxCubeMapTextureSize;
break;
case GL_TEXTURE_2D_ARRAY:
- {
- gl::Texture2DArray *texture2dArray = context->getTexture2DArray();
- if (texture2dArray)
- {
- textureInternalFormat = texture2dArray->getInternalFormat(level);
- textureLevelWidth = texture2dArray->getWidth(level);
- textureLevelHeight = texture2dArray->getHeight(level);
- textureLevelDepth = texture2dArray->getLayers(level);
- texture = texture2dArray;
- maxDimension = caps.max2DTextureSize;
- }
- }
+ maxDimension = caps.max2DTextureSize;
break;
case GL_TEXTURE_3D:
- {
- gl::Texture3D *texture3d = context->getTexture3D();
- if (texture3d)
- {
- textureInternalFormat = texture3d->getInternalFormat(level);
- textureLevelWidth = texture3d->getWidth(level);
- textureLevelHeight = texture3d->getHeight(level);
- textureLevelDepth = texture3d->getDepth(level);
- texture = texture3d;
- maxDimension = caps.max3DTextureSize;
- }
- }
+ maxDimension = caps.max3DTextureSize;
break;
default:
@@ -1309,6 +1259,7 @@
return false;
}
+ gl::Texture *texture = context->getTargetTexture(IsCubemapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target);
if (!texture)
{
context->recordError(Error(GL_INVALID_OPERATION));
@@ -1329,21 +1280,17 @@
return false;
}
- if (formatInfo.compressed)
+ if (formatInfo.compressed && !ValidCompressedImageSize(context, internalformat, width, height))
{
- if (((width % formatInfo.compressedBlockWidth) != 0 && width != textureLevelWidth) ||
- ((height % formatInfo.compressedBlockHeight) != 0 && height != textureLevelHeight))
- {
- context->recordError(Error(GL_INVALID_OPERATION));
- return false;
- }
+ context->recordError(Error(GL_INVALID_OPERATION));
+ return false;
}
if (isSubImage)
{
- if (xoffset + width > textureLevelWidth ||
- yoffset + height > textureLevelHeight ||
- zoffset >= textureLevelDepth)
+ if (static_cast<size_t>(xoffset + width) > texture->getWidth(target, level) ||
+ static_cast<size_t>(yoffset + height) > texture->getHeight(target, level) ||
+ static_cast<size_t>(zoffset) >= texture->getDepth(target, level))
{
context->recordError(Error(GL_INVALID_VALUE));
return false;
@@ -1371,7 +1318,7 @@
}
}
- *textureFormatOut = textureInternalFormat;
+ *textureFormatOut = texture->getInternalFormat(target, level);
return true;
}
@@ -1786,12 +1733,6 @@
context->recordError(Error(GL_INVALID_OPERATION));
return false;
}
- gl::Texture2D *tex2d = static_cast<gl::Texture2D *>(tex);
- if (tex2d->isCompressed(level))
- {
- context->recordError(Error(GL_INVALID_OPERATION));
- return false;
- }
}
break;
@@ -1812,12 +1753,6 @@
context->recordError(Error(GL_INVALID_OPERATION));
return false;
}
- gl::TextureCubeMap *texcube = static_cast<gl::TextureCubeMap *>(tex);
- if (texcube->isCompressed(textarget, level))
- {
- context->recordError(Error(GL_INVALID_OPERATION));
- return false;
- }
}
break;
@@ -1825,6 +1760,13 @@
context->recordError(Error(GL_INVALID_ENUM));
return false;
}
+
+ const gl::InternalFormat &internalFormatInfo = gl::GetInternalFormatInfo(tex->getInternalFormat(textarget, level));
+ if (internalFormatInfo.compressed)
+ {
+ context->recordError(Error(GL_INVALID_OPERATION));
+ return false;
+ }
}
return true;