Commit b6664925 by Jamie Madill Committed by Commit Bot

Add error handling macro to Context.

This is a small specialized macro to remove all the redundant handleError calls and return value checking. Also add a Context::prepareForDraw member that will be used in follow-up patches to do necessary work prior to a draw call. BUG=angleproject:2107 BUG=angleproject:2116 Change-Id: I8a32d2206c218fcca5236abfd3f2ce370296ca99 Reviewed-on: https://chromium-review.googlesource.com/585288Reviewed-by: 's avatarGeoff Lang <geofflang@chromium.org> Commit-Queue: Jamie Madill <jmadill@chromium.org>
parent 14a26aea
......@@ -45,6 +45,11 @@
namespace
{
#define ANGLE_HANDLE_ERR(X) \
handleError(X); \
return;
#define ANGLE_CONTEXT_TRY(EXPR) ANGLE_TRY_TEMPLATE(EXPR, ANGLE_HANDLE_ERR);
template <typename T>
std::vector<gl::Path *> GatherPaths(gl::PathManager &resourceManager,
GLsizei numPaths,
......@@ -1832,30 +1837,23 @@ void Context::texParameteriv(GLenum target, GLenum pname, const GLint *params)
void Context::drawArrays(GLenum mode, GLint first, GLsizei count)
{
syncRendererState();
auto error = mImplementation->drawArrays(this, mode, first, count);
handleError(error);
if (!error.isError())
{
MarkTransformFeedbackBufferUsage(mGLState.getCurrentTransformFeedback());
}
ANGLE_CONTEXT_TRY(prepareForDraw());
ANGLE_CONTEXT_TRY(mImplementation->drawArrays(this, mode, first, count));
MarkTransformFeedbackBufferUsage(mGLState.getCurrentTransformFeedback());
}
void Context::drawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instanceCount)
{
syncRendererState();
auto error = mImplementation->drawArraysInstanced(this, mode, first, count, instanceCount);
handleError(error);
if (!error.isError())
{
MarkTransformFeedbackBufferUsage(mGLState.getCurrentTransformFeedback());
}
ANGLE_CONTEXT_TRY(prepareForDraw());
ANGLE_CONTEXT_TRY(
mImplementation->drawArraysInstanced(this, mode, first, count, instanceCount));
MarkTransformFeedbackBufferUsage(mGLState.getCurrentTransformFeedback());
}
void Context::drawElements(GLenum mode, GLsizei count, GLenum type, const void *indices)
{
syncRendererState();
handleError(mImplementation->drawElements(this, mode, count, type, indices));
ANGLE_CONTEXT_TRY(prepareForDraw());
ANGLE_CONTEXT_TRY(mImplementation->drawElements(this, mode, count, type, indices));
}
void Context::drawElementsInstanced(GLenum mode,
......@@ -1864,8 +1862,8 @@ void Context::drawElementsInstanced(GLenum mode,
const void *indices,
GLsizei instances)
{
syncRendererState();
handleError(
ANGLE_CONTEXT_TRY(prepareForDraw());
ANGLE_CONTEXT_TRY(
mImplementation->drawElementsInstanced(this, mode, count, type, indices, instances));
}
......@@ -1876,20 +1874,21 @@ void Context::drawRangeElements(GLenum mode,
GLenum type,
const void *indices)
{
syncRendererState();
handleError(mImplementation->drawRangeElements(this, mode, start, end, count, type, indices));
ANGLE_CONTEXT_TRY(prepareForDraw());
ANGLE_CONTEXT_TRY(
mImplementation->drawRangeElements(this, mode, start, end, count, type, indices));
}
void Context::drawArraysIndirect(GLenum mode, const void *indirect)
{
syncRendererState();
handleError(mImplementation->drawArraysIndirect(this, mode, indirect));
ANGLE_CONTEXT_TRY(prepareForDraw());
ANGLE_CONTEXT_TRY(mImplementation->drawArraysIndirect(this, mode, indirect));
}
void Context::drawElementsIndirect(GLenum mode, GLenum type, const void *indirect)
{
syncRendererState();
handleError(mImplementation->drawElementsIndirect(this, mode, type, indirect));
ANGLE_CONTEXT_TRY(prepareForDraw());
ANGLE_CONTEXT_TRY(mImplementation->drawElementsIndirect(this, mode, type, indirect));
}
void Context::flush()
......@@ -2821,6 +2820,12 @@ void Context::initWorkarounds()
mWorkarounds.loseContextOnOutOfMemory = (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT);
}
Error Context::prepareForDraw()
{
syncRendererState();
return NoError();
}
void Context::syncRendererState()
{
const State::DirtyBits &dirtyBits = mGLState.getDirtyBits();
......@@ -2915,11 +2920,11 @@ void Context::readPixels(GLint x,
syncStateForReadPixels();
Framebuffer *framebufferObject = mGLState.getReadFramebuffer();
ASSERT(framebufferObject);
Framebuffer *readFBO = mGLState.getReadFramebuffer();
ASSERT(readFBO);
Rectangle area(x, y, width, height);
handleError(framebufferObject->readPixels(this, area, format, type, pixels));
handleError(readFBO->readPixels(this, area, format, type, pixels));
}
void Context::copyTexImage2D(GLenum target,
......@@ -4645,7 +4650,6 @@ void Context::linkProgram(GLuint program)
Program *programObject = getProgram(program);
ASSERT(programObject);
handleError(programObject->link(this));
mGLState.onProgramExecutableChange(programObject);
}
void Context::releaseShaderCompiler()
......@@ -4840,8 +4844,8 @@ void Context::programBinary(GLuint program, GLenum binaryFormat, const void *bin
{
Program *programObject = getProgram(program);
ASSERT(programObject != nullptr);
handleError(programObject->loadBinary(this, binaryFormat, binary, length));
mGLState.onProgramExecutableChange(programObject);
}
} // namespace gl
......@@ -832,6 +832,7 @@ class Context final : public ValidationContext
egl::Surface *getCurrentReadSurface() const { return mCurrentSurface; }
private:
Error prepareForDraw();
void syncRendererState();
void syncRendererState(const State::DirtyBits &bitMask, const State::DirtyObjects &objectMask);
void syncStateForReadPixels();
......
......@@ -205,16 +205,19 @@ inline Error NoError()
#define ANGLE_CONCAT2(x, y) ANGLE_CONCAT1(x, y)
#define ANGLE_LOCAL_VAR ANGLE_CONCAT2(_localVar, __LINE__)
#define ANGLE_TRY(EXPR) \
#define ANGLE_TRY_TEMPLATE(EXPR, FUNC) \
{ \
auto ANGLE_LOCAL_VAR = EXPR; \
if (ANGLE_LOCAL_VAR.isError()) \
{ \
return ANGLE_LOCAL_VAR; \
FUNC(ANGLE_LOCAL_VAR); \
} \
} \
ANGLE_EMPTY_STATEMENT
#define ANGLE_RETURN(X) return X;
#define ANGLE_TRY(EXPR) ANGLE_TRY_TEMPLATE(EXPR, ANGLE_RETURN);
#define ANGLE_TRY_RESULT(EXPR, RESULT) \
{ \
auto ANGLE_LOCAL_VAR = EXPR; \
......
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