Refactor common attachment validation to base method.
Split the validation of FBO attachment binding to common methods
and separate logic for layers and for 2D attachments.
BUG=angle:571
Change-Id: I9a59055cca60dd853311751be355440ad1e5ead0
Reviewed-on: https://chromium-review.googlesource.com/205605
Reviewed-by: Geoff Lang <geofflang@chromium.org>
Reviewed-by: Shannon Woods <shannonwoods@chromium.org>
Tested-by: Jamie Madill <jmadill@chromium.org>
diff --git a/src/libGLESv2/validationES3.cpp b/src/libGLESv2/validationES3.cpp
index dfb0356..76ba62c 100644
--- a/src/libGLESv2/validationES3.cpp
+++ b/src/libGLESv2/validationES3.cpp
@@ -453,162 +453,6 @@
return true;
}
-bool ValidateES3FramebufferTextureParameters(const gl::Context *context, GLenum target, GLenum attachment,
- GLenum textarget, GLuint texture, GLint level, GLint layer,
- bool layerCall)
-{
- if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER && target != GL_READ_FRAMEBUFFER)
- {
- return gl::error(GL_INVALID_ENUM, false);
- }
-
- if (!ValidateAttachmentTarget(context, attachment))
- {
- return false;
- }
-
- const gl::Caps &caps = context->getCaps();
- if (texture != 0)
- {
- gl::Texture *tex = context->getTexture(texture);
-
- if (tex == NULL)
- {
- return gl::error(GL_INVALID_OPERATION, false);
- }
-
- if (level < 0)
- {
- return gl::error(GL_INVALID_VALUE, false);
- }
-
- if (layer < 0)
- {
- return gl::error(GL_INVALID_VALUE, false);
- }
-
- if (!layerCall)
- {
- switch (textarget)
- {
- case GL_TEXTURE_2D:
- {
- if (level > gl::log2(caps.max2DTextureSize))
- {
- return gl::error(GL_INVALID_VALUE, false);
- }
- if (tex->getTarget() != GL_TEXTURE_2D)
- {
- return gl::error(GL_INVALID_OPERATION, false);
- }
- gl::Texture2D *tex2d = static_cast<gl::Texture2D *>(tex);
- if (tex2d->isCompressed(level))
- {
- return gl::error(GL_INVALID_OPERATION, false);
- }
- break;
- }
-
- case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
- case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
- case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
- case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
- case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
- case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
- {
- if (level > gl::log2(caps.maxCubeMapTextureSize))
- {
- return gl::error(GL_INVALID_VALUE, false);
- }
- if (tex->getTarget() != GL_TEXTURE_CUBE_MAP)
- {
- return gl::error(GL_INVALID_OPERATION, false);
- }
- gl::TextureCubeMap *texcube = static_cast<gl::TextureCubeMap *>(tex);
- if (texcube->isCompressed(textarget, level))
- {
- return gl::error(GL_INVALID_OPERATION, false);
- }
- break;
- }
-
- default:
- return gl::error(GL_INVALID_ENUM, false);
- }
- }
- else
- {
- switch (tex->getTarget())
- {
- case GL_TEXTURE_2D_ARRAY:
- {
- if (level > gl::log2(caps.max2DTextureSize))
- {
- return gl::error(GL_INVALID_VALUE, false);
- }
-
- if (static_cast<GLuint>(layer) >= caps.maxArrayTextureLayers)
- {
- return gl::error(GL_INVALID_VALUE, false);
- }
-
- gl::Texture2DArray *texArray = static_cast<gl::Texture2DArray *>(tex);
- if (texArray->isCompressed(level))
- {
- return gl::error(GL_INVALID_OPERATION, false);
- }
-
- break;
- }
-
- case GL_TEXTURE_3D:
- {
- if (level > gl::log2(caps.max3DTextureSize))
- {
- return gl::error(GL_INVALID_VALUE, false);
- }
-
- if (static_cast<GLuint>(layer) >= caps.max3DTextureSize)
- {
- return gl::error(GL_INVALID_VALUE, false);
- }
-
- gl::Texture3D *tex3d = static_cast<gl::Texture3D *>(tex);
- if (tex3d->isCompressed(level))
- {
- return gl::error(GL_INVALID_OPERATION, false);
- }
-
- break;
- }
-
- default:
- return gl::error(GL_INVALID_OPERATION, false);
- }
- }
- }
-
- const gl::Framebuffer *framebuffer = NULL;
- GLuint framebufferHandle = 0;
- if (target == GL_READ_FRAMEBUFFER)
- {
- framebuffer = context->getReadFramebuffer();
- framebufferHandle = context->getReadFramebufferHandle();
- }
- else
- {
- framebuffer = context->getDrawFramebuffer();
- framebufferHandle = context->getDrawFramebufferHandle();
- }
-
- if (framebufferHandle == 0 || !framebuffer)
- {
- return gl::error(GL_INVALID_OPERATION, false);
- }
-
- return true;
-}
-
bool ValidateFramebufferTextureLayer(const gl::Context *context, GLenum target, GLenum attachment,
GLuint texture, GLint level, GLint layer)
{
@@ -617,7 +461,70 @@
return gl::error(GL_INVALID_OPERATION, false);
}
- return ValidateES3FramebufferTextureParameters(context, target, attachment, GL_NONE, texture, level, layer, true);
+ if (layer < 0)
+ {
+ return gl::error(GL_INVALID_VALUE, false);
+ }
+
+ if (!ValidateFramebufferTextureBase(context, target, attachment, texture, level))
+ {
+ return false;
+ }
+
+ const gl::Caps &caps = context->getCaps();
+ if (texture != 0)
+ {
+ gl::Texture *tex = context->getTexture(texture);
+ ASSERT(tex);
+
+ switch (tex->getTarget())
+ {
+ case GL_TEXTURE_2D_ARRAY:
+ {
+ if (level > gl::log2(caps.max2DTextureSize))
+ {
+ return gl::error(GL_INVALID_VALUE, false);
+ }
+
+ if (static_cast<GLuint>(layer) >= caps.maxArrayTextureLayers)
+ {
+ return gl::error(GL_INVALID_VALUE, false);
+ }
+
+ gl::Texture2DArray *texArray = static_cast<gl::Texture2DArray *>(tex);
+ if (texArray->isCompressed(level))
+ {
+ return gl::error(GL_INVALID_OPERATION, false);
+ }
+ }
+ break;
+
+ case GL_TEXTURE_3D:
+ {
+ if (level > gl::log2(caps.max3DTextureSize))
+ {
+ return gl::error(GL_INVALID_VALUE, false);
+ }
+
+ if (static_cast<GLuint>(layer) >= caps.max3DTextureSize)
+ {
+ return gl::error(GL_INVALID_VALUE, false);
+ }
+
+ gl::Texture3D *tex3d = static_cast<gl::Texture3D *>(tex);
+ if (tex3d->isCompressed(level))
+ {
+ return gl::error(GL_INVALID_OPERATION, false);
+ }
+ }
+ break;
+
+ default:
+ return gl::error(GL_INVALID_OPERATION, false);
+ }
+ }
+
+ return true;
}
bool ValidES3ReadFormatType(gl::Context *context, GLenum internalFormat, GLenum format, GLenum type)