Commit 13f7d7dc by Jamie Madill

Move FBO check from applyRenderTarget to the API.

We would traverse the applyRenderTarget path from several entry points, which could then trigger a GL error. In-line with our validation refactoring, move all error checks prior to executing any state logic. BUG=angle:571 Change-Id: I51f5bcfa41be7cdba7771eb87d5a831fa622f984 Reviewed-on: https://chromium-review.googlesource.com/203772Tested-by: 's avatarJamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarShannon Woods <shannonwoods@chromium.org>
parent 1aeb1314
......@@ -1133,6 +1133,11 @@ Framebuffer *Context::getDrawFramebuffer()
return mBoundDrawFramebuffer;
}
const Framebuffer *Context::getDrawFramebuffer() const
{
return mBoundDrawFramebuffer;
}
VertexArray *Context::getCurrentVertexArray() const
{
VertexArray *vao = getVertexArray(mState.vertexArray);
......@@ -2352,11 +2357,7 @@ bool Context::getIndexedQueryParameterInfo(GLenum target, GLenum *type, unsigned
bool Context::applyRenderTarget(GLenum drawMode, bool ignoreViewport)
{
Framebuffer *framebufferObject = getDrawFramebuffer();
if (!framebufferObject || framebufferObject->completeness() != GL_FRAMEBUFFER_COMPLETE)
{
return gl::error(GL_INVALID_FRAMEBUFFER_OPERATION, false);
}
ASSERT(framebufferObject && framebufferObject->completeness() == GL_FRAMEBUFFER_COMPLETE);
mRenderer->applyRenderTarget(framebufferObject);
......@@ -2639,7 +2640,6 @@ void Context::clear(GLbitfield mask)
}
}
if (!applyRenderTarget(GL_TRIANGLES, true)) // Clips the clear to the scissor rectangle but not the viewport
{
return;
......
......@@ -365,6 +365,7 @@ class Context
GLuint getTargetFramebufferHandle(GLenum target) const;
Framebuffer *getReadFramebuffer();
Framebuffer *getDrawFramebuffer();
const Framebuffer *getDrawFramebuffer() const;
VertexArray *getCurrentVertexArray() const;
TransformFeedback *getCurrentTransformFeedback() const;
......
......@@ -7863,9 +7863,9 @@ void __stdcall glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint* val
if (context)
{
if (context->getClientVersion() < 3)
if (!ValidateClearBuffer(context))
{
return gl::error(GL_INVALID_OPERATION);
return;
}
switch (buffer)
......@@ -7906,9 +7906,9 @@ void __stdcall glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint* v
if (context)
{
if (context->getClientVersion() < 3)
if (!ValidateClearBuffer(context))
{
return gl::error(GL_INVALID_OPERATION);
return;
}
switch (buffer)
......@@ -7943,9 +7943,9 @@ void __stdcall glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat* v
if (context)
{
if (context->getClientVersion() < 3)
if (!ValidateClearBuffer(context))
{
return gl::error(GL_INVALID_OPERATION);
return;
}
switch (buffer)
......@@ -7986,9 +7986,9 @@ void __stdcall glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, G
if (context)
{
if (context->getClientVersion() < 3)
if (!ValidateClearBuffer(context))
{
return gl::error(GL_INVALID_OPERATION);
return;
}
switch (buffer)
......
......@@ -1340,6 +1340,12 @@ static bool ValidateDrawBase(const gl::Context *context, GLenum mode, GLsizei co
return gl::error(GL_INVALID_OPERATION, false);
}
const gl::Framebuffer *fbo = context->getDrawFramebuffer();
if (!fbo || fbo->completeness() != GL_FRAMEBUFFER_COMPLETE)
{
return gl::error(GL_INVALID_FRAMEBUFFER_OPERATION, false);
}
// No-op if zero count
return (count > 0);
}
......
......@@ -757,4 +757,20 @@ bool ValidateInvalidateFramebufferParameters(gl::Context *context, GLenum target
return true;
}
bool ValidateClearBuffer(const gl::Context *context)
{
if (context->getClientVersion() < 3)
{
return gl::error(GL_INVALID_OPERATION, false);
}
const gl::Framebuffer *fbo = context->getDrawFramebuffer();
if (!fbo || fbo->completeness() != GL_FRAMEBUFFER_COMPLETE)
{
return gl::error(GL_INVALID_FRAMEBUFFER_OPERATION, false);
}
return true;
}
}
......@@ -34,6 +34,8 @@ bool ValidES3ReadFormatType(gl::Context *context, GLenum internalFormat, GLenum
bool ValidateInvalidateFramebufferParameters(gl::Context *context, GLenum target, GLsizei numAttachments,
const GLenum* attachments);
bool ValidateClearBuffer(const gl::Context *context);
}
#endif // LIBGLESV2_VALIDATION_ES3_H
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