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() ...@@ -1133,6 +1133,11 @@ Framebuffer *Context::getDrawFramebuffer()
return mBoundDrawFramebuffer; return mBoundDrawFramebuffer;
} }
const Framebuffer *Context::getDrawFramebuffer() const
{
return mBoundDrawFramebuffer;
}
VertexArray *Context::getCurrentVertexArray() const VertexArray *Context::getCurrentVertexArray() const
{ {
VertexArray *vao = getVertexArray(mState.vertexArray); VertexArray *vao = getVertexArray(mState.vertexArray);
...@@ -2352,11 +2357,7 @@ bool Context::getIndexedQueryParameterInfo(GLenum target, GLenum *type, unsigned ...@@ -2352,11 +2357,7 @@ bool Context::getIndexedQueryParameterInfo(GLenum target, GLenum *type, unsigned
bool Context::applyRenderTarget(GLenum drawMode, bool ignoreViewport) bool Context::applyRenderTarget(GLenum drawMode, bool ignoreViewport)
{ {
Framebuffer *framebufferObject = getDrawFramebuffer(); Framebuffer *framebufferObject = getDrawFramebuffer();
ASSERT(framebufferObject && framebufferObject->completeness() == GL_FRAMEBUFFER_COMPLETE);
if (!framebufferObject || framebufferObject->completeness() != GL_FRAMEBUFFER_COMPLETE)
{
return gl::error(GL_INVALID_FRAMEBUFFER_OPERATION, false);
}
mRenderer->applyRenderTarget(framebufferObject); mRenderer->applyRenderTarget(framebufferObject);
...@@ -2639,7 +2640,6 @@ void Context::clear(GLbitfield mask) ...@@ -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 if (!applyRenderTarget(GL_TRIANGLES, true)) // Clips the clear to the scissor rectangle but not the viewport
{ {
return; return;
......
...@@ -365,6 +365,7 @@ class Context ...@@ -365,6 +365,7 @@ class Context
GLuint getTargetFramebufferHandle(GLenum target) const; GLuint getTargetFramebufferHandle(GLenum target) const;
Framebuffer *getReadFramebuffer(); Framebuffer *getReadFramebuffer();
Framebuffer *getDrawFramebuffer(); Framebuffer *getDrawFramebuffer();
const Framebuffer *getDrawFramebuffer() const;
VertexArray *getCurrentVertexArray() const; VertexArray *getCurrentVertexArray() const;
TransformFeedback *getCurrentTransformFeedback() const; TransformFeedback *getCurrentTransformFeedback() const;
......
...@@ -7863,9 +7863,9 @@ void __stdcall glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint* val ...@@ -7863,9 +7863,9 @@ void __stdcall glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint* val
if (context) if (context)
{ {
if (context->getClientVersion() < 3) if (!ValidateClearBuffer(context))
{ {
return gl::error(GL_INVALID_OPERATION); return;
} }
switch (buffer) switch (buffer)
...@@ -7906,9 +7906,9 @@ void __stdcall glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint* v ...@@ -7906,9 +7906,9 @@ void __stdcall glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint* v
if (context) if (context)
{ {
if (context->getClientVersion() < 3) if (!ValidateClearBuffer(context))
{ {
return gl::error(GL_INVALID_OPERATION); return;
} }
switch (buffer) switch (buffer)
...@@ -7943,9 +7943,9 @@ void __stdcall glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat* v ...@@ -7943,9 +7943,9 @@ void __stdcall glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat* v
if (context) if (context)
{ {
if (context->getClientVersion() < 3) if (!ValidateClearBuffer(context))
{ {
return gl::error(GL_INVALID_OPERATION); return;
} }
switch (buffer) switch (buffer)
...@@ -7986,9 +7986,9 @@ void __stdcall glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, G ...@@ -7986,9 +7986,9 @@ void __stdcall glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, G
if (context) if (context)
{ {
if (context->getClientVersion() < 3) if (!ValidateClearBuffer(context))
{ {
return gl::error(GL_INVALID_OPERATION); return;
} }
switch (buffer) switch (buffer)
......
...@@ -1340,6 +1340,12 @@ static bool ValidateDrawBase(const gl::Context *context, GLenum mode, GLsizei co ...@@ -1340,6 +1340,12 @@ static bool ValidateDrawBase(const gl::Context *context, GLenum mode, GLsizei co
return gl::error(GL_INVALID_OPERATION, false); 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 // No-op if zero count
return (count > 0); return (count > 0);
} }
......
...@@ -757,4 +757,20 @@ bool ValidateInvalidateFramebufferParameters(gl::Context *context, GLenum target ...@@ -757,4 +757,20 @@ bool ValidateInvalidateFramebufferParameters(gl::Context *context, GLenum target
return true; 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 ...@@ -34,6 +34,8 @@ bool ValidES3ReadFormatType(gl::Context *context, GLenum internalFormat, GLenum
bool ValidateInvalidateFramebufferParameters(gl::Context *context, GLenum target, GLsizei numAttachments, bool ValidateInvalidateFramebufferParameters(gl::Context *context, GLenum target, GLsizei numAttachments,
const GLenum* attachments); const GLenum* attachments);
bool ValidateClearBuffer(const gl::Context *context);
} }
#endif // LIBGLESV2_VALIDATION_ES3_H #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