Commit 55ec3b11 by Jamie Madill

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/205605Reviewed-by: 's avatarGeoff Lang <geofflang@chromium.org> Reviewed-by: 's avatarShannon Woods <shannonwoods@chromium.org> Tested-by: 's avatarJamie Madill <jmadill@chromium.org>
parent 23a8a433
...@@ -1446,21 +1446,112 @@ bool ValidateDrawElementsInstanced(const gl::Context *context, GLenum mode, GLsi ...@@ -1446,21 +1446,112 @@ bool ValidateDrawElementsInstanced(const gl::Context *context, GLenum mode, GLsi
return (primcount > 0); return (primcount > 0);
} }
bool ValidateFramebufferTextureBase(const gl::Context *context, GLenum target, GLenum attachment,
GLuint texture, GLint level)
{
if (!ValidFramebufferTarget(target))
{
return gl::error(GL_INVALID_ENUM, false);
}
if (!ValidateAttachmentTarget(context, attachment))
{
return false;
}
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);
}
}
const gl::Framebuffer *framebuffer = context->getTargetFramebuffer(target);
GLuint framebufferHandle = context->getTargetFramebufferHandle(target);
if (framebufferHandle == 0 || !framebuffer)
{
return gl::error(GL_INVALID_OPERATION, false);
}
return true;
}
bool ValidateFramebufferTexture2D(const gl::Context *context, GLenum target, GLenum attachment, bool ValidateFramebufferTexture2D(const gl::Context *context, GLenum target, GLenum attachment,
GLenum textarget, GLuint texture, GLint level) GLenum textarget, GLuint texture, GLint level)
{ {
if (context->getClientVersion() < 3 && // Attachments are required to be bound to level 0 in ES2
!ValidateES2FramebufferTextureParameters(context, target, attachment, textarget, texture, level)) if (context->getClientVersion() < 3 && level != 0)
{ {
return false; return gl::error(GL_INVALID_VALUE, false);
} }
if (context->getClientVersion() >= 3 && if (!ValidateFramebufferTextureBase(context, target, attachment, texture, level))
!ValidateES3FramebufferTextureParameters(context, target, attachment, textarget, texture, level, 0, false))
{ {
return false; return false;
} }
if (texture != 0)
{
gl::Texture *tex = context->getTexture(texture);
ASSERT(tex);
switch (textarget)
{
case GL_TEXTURE_2D:
{
if (level > gl::log2(context->getMaximum2DTextureDimension()))
{
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(context->getMaximumCubeTextureDimension()))
{
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);
}
}
return true; return true;
} }
......
...@@ -64,6 +64,9 @@ bool ValidateDrawArraysInstanced(const gl::Context *context, GLenum mode, GLint ...@@ -64,6 +64,9 @@ bool ValidateDrawArraysInstanced(const gl::Context *context, GLenum mode, GLint
bool ValidateDrawElements(const gl::Context *context, GLenum mode, GLsizei count, GLenum type, const GLvoid* indices); bool ValidateDrawElements(const gl::Context *context, GLenum mode, GLsizei count, GLenum type, const GLvoid* indices);
bool ValidateDrawElementsInstanced(const gl::Context *context, GLenum mode, GLsizei count, GLenum type, bool ValidateDrawElementsInstanced(const gl::Context *context, GLenum mode, GLsizei count, GLenum type,
const GLvoid *indices, GLsizei primcount); const GLvoid *indices, GLsizei primcount);
bool ValidateFramebufferTextureBase(const gl::Context *context, GLenum target, GLenum attachment,
GLuint texture, GLint level);
bool ValidateFramebufferTexture2D(const gl::Context *context, GLenum target, GLenum attachment, bool ValidateFramebufferTexture2D(const gl::Context *context, GLenum target, GLenum attachment,
GLenum textarget, GLuint texture, GLint level); GLenum textarget, GLuint texture, GLint level);
......
...@@ -843,96 +843,6 @@ bool ValidateES2TexStorageParameters(gl::Context *context, GLenum target, GLsize ...@@ -843,96 +843,6 @@ bool ValidateES2TexStorageParameters(gl::Context *context, GLenum target, GLsize
return true; return true;
} }
bool ValidateES2FramebufferTextureParameters(const gl::Context *context, GLenum target, GLenum attachment,
GLenum textarget, GLuint texture, GLint level)
{
META_ASSERT(GL_DRAW_FRAMEBUFFER == GL_DRAW_FRAMEBUFFER_ANGLE && GL_READ_FRAMEBUFFER == GL_READ_FRAMEBUFFER_ANGLE);
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;
}
if (texture != 0)
{
gl::Texture *tex = context->getTexture(texture);
if (tex == NULL)
{
return gl::error(GL_INVALID_OPERATION, false);
}
switch (textarget)
{
case GL_TEXTURE_2D:
{
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 (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);
}
if (level != 0)
{
return gl::error(GL_INVALID_VALUE, 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;
}
// check for combinations of format and type that are valid for ReadPixels // check for combinations of format and type that are valid for ReadPixels
bool ValidES2ReadFormatType(gl::Context *context, GLenum format, GLenum type) bool ValidES2ReadFormatType(gl::Context *context, GLenum format, GLenum type)
{ {
......
...@@ -25,9 +25,6 @@ bool ValidateES2CopyTexImageParameters(gl::Context* context, GLenum target, GLin ...@@ -25,9 +25,6 @@ bool ValidateES2CopyTexImageParameters(gl::Context* context, GLenum target, GLin
bool ValidateES2TexStorageParameters(gl::Context *context, GLenum target, GLsizei levels, GLenum internalformat, bool ValidateES2TexStorageParameters(gl::Context *context, GLenum target, GLsizei levels, GLenum internalformat,
GLsizei width, GLsizei height); GLsizei width, GLsizei height);
bool ValidateES2FramebufferTextureParameters(const gl::Context *context, GLenum target, GLenum attachment,
GLenum textarget, GLuint texture, GLint level);
bool ValidES2ReadFormatType(gl::Context *context, GLenum format, GLenum type); bool ValidES2ReadFormatType(gl::Context *context, GLenum format, GLenum type);
} }
......
...@@ -453,16 +453,20 @@ bool ValidateES3TexStorageParameters(gl::Context *context, GLenum target, GLsize ...@@ -453,16 +453,20 @@ bool ValidateES3TexStorageParameters(gl::Context *context, GLenum target, GLsize
return true; return true;
} }
bool ValidateES3FramebufferTextureParameters(const gl::Context *context, GLenum target, GLenum attachment, bool ValidateFramebufferTextureLayer(const gl::Context *context, GLenum target, GLenum attachment,
GLenum textarget, GLuint texture, GLint level, GLint layer, GLuint texture, GLint level, GLint layer)
bool layerCall)
{ {
if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER && target != GL_READ_FRAMEBUFFER) if (context->getClientVersion() < 3)
{ {
return gl::error(GL_INVALID_ENUM, false); return gl::error(GL_INVALID_OPERATION, false);
} }
if (!ValidateAttachmentTarget(context, attachment)) if (layer < 0)
{
return gl::error(GL_INVALID_VALUE, false);
}
if (!ValidateFramebufferTextureBase(context, target, attachment, texture, level))
{ {
return false; return false;
} }
...@@ -471,155 +475,58 @@ bool ValidateES3FramebufferTextureParameters(const gl::Context *context, GLenum ...@@ -471,155 +475,58 @@ bool ValidateES3FramebufferTextureParameters(const gl::Context *context, GLenum
if (texture != 0) if (texture != 0)
{ {
gl::Texture *tex = context->getTexture(texture); gl::Texture *tex = context->getTexture(texture);
ASSERT(tex);
if (tex == NULL) switch (tex->getTarget())
{ {
return gl::error(GL_INVALID_OPERATION, false); case GL_TEXTURE_2D_ARRAY:
}
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))
{ {
if (level > gl::log2(caps.max2DTextureSize)) return gl::error(GL_INVALID_VALUE, false);
{
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: if (static_cast<GLuint>(layer) >= caps.maxArrayTextureLayers)
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);
{
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: gl::Texture2DArray *texArray = static_cast<gl::Texture2DArray *>(tex);
return gl::error(GL_INVALID_ENUM, false); if (texArray->isCompressed(level))
{
return gl::error(GL_INVALID_OPERATION, false);
}
} }
} break;
else
{ case GL_TEXTURE_3D:
switch (tex->getTarget())
{ {
case GL_TEXTURE_2D_ARRAY: if (level > gl::log2(caps.max3DTextureSize))
{ {
if (level > gl::log2(caps.max2DTextureSize)) return gl::error(GL_INVALID_VALUE, false);
{
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 (static_cast<GLuint>(layer) >= caps.max3DTextureSize)
{ {
if (level > gl::log2(caps.max3DTextureSize)) return gl::error(GL_INVALID_VALUE, false);
{
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: gl::Texture3D *tex3d = static_cast<gl::Texture3D *>(tex);
return gl::error(GL_INVALID_OPERATION, false); if (tex3d->isCompressed(level))
{
return gl::error(GL_INVALID_OPERATION, false);
}
} }
} break;
}
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) default:
{ return gl::error(GL_INVALID_OPERATION, false);
return gl::error(GL_INVALID_OPERATION, false); }
} }
return true; return true;
} }
bool ValidateFramebufferTextureLayer(const gl::Context *context, GLenum target, GLenum attachment,
GLuint texture, GLint level, GLint layer)
{
if (context->getClientVersion() < 3)
{
return gl::error(GL_INVALID_OPERATION, false);
}
return ValidateES3FramebufferTextureParameters(context, target, attachment, GL_NONE, texture, level, layer, true);
}
bool ValidES3ReadFormatType(gl::Context *context, GLenum internalFormat, GLenum format, GLenum type) bool ValidES3ReadFormatType(gl::Context *context, GLenum internalFormat, GLenum format, GLenum type)
{ {
switch (format) switch (format)
......
...@@ -25,9 +25,6 @@ bool ValidateES3CopyTexImageParameters(gl::Context *context, GLenum target, GLin ...@@ -25,9 +25,6 @@ bool ValidateES3CopyTexImageParameters(gl::Context *context, GLenum target, GLin
bool ValidateES3TexStorageParameters(gl::Context *context, GLenum target, GLsizei levels, GLenum internalformat, bool ValidateES3TexStorageParameters(gl::Context *context, GLenum target, GLsizei levels, GLenum internalformat,
GLsizei width, GLsizei height, GLsizei depth); GLsizei width, GLsizei height, GLsizei depth);
bool ValidateES3FramebufferTextureParameters(const gl::Context *context, GLenum target, GLenum attachment,
GLenum textarget, GLuint texture, GLint level, GLint layer,
bool layerCall);
bool ValidateFramebufferTextureLayer(const gl::Context *context, GLenum target, GLenum attachment, bool ValidateFramebufferTextureLayer(const gl::Context *context, GLenum target, GLenum attachment,
GLuint texture, GLint level, GLint layer); GLuint texture, GLint level, GLint layer);
......
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