diff options
author | Geoff Lang <geofflang@chromium.org> | 2014-07-25 13:48:02 -0400 |
---|---|---|
committer | Geoff Lang <geofflang@chromium.org> | 2014-09-08 19:08:47 +0000 |
commit | cc79b8c6b3c713904fa6d0613018b3e2f7fd8eac (patch) | |
tree | 96ef78a1d5a16853eeff0627b5e314ad0df8c2d0 | |
parent | 2a1c15a1ab1852ab11fb8d12822c98aac11619ae (diff) | |
download | angle-cc79b8c6b3c713904fa6d0613018b3e2f7fd8eac.tar.gz |
Update clear calls to return Error objects instead of calling gl::error.
BUG=angle:520
Change-Id: I474a6ed29b882963f7f3425515e7d65f8f69b3e4
Reviewed-on: https://chromium-review.googlesource.com/211440
Reviewed-by: Shannon Woods <shannonwoods@chromium.org>
Tested-by: Geoff Lang <geofflang@chromium.org>
-rw-r--r-- | src/libGLESv2/Context.cpp | 40 | ||||
-rw-r--r-- | src/libGLESv2/Context.h | 10 | ||||
-rw-r--r-- | src/libGLESv2/libGLESv2.cpp | 35 | ||||
-rw-r--r-- | src/libGLESv2/renderer/Renderer.h | 3 | ||||
-rw-r--r-- | src/libGLESv2/renderer/d3d/d3d11/Clear11.cpp | 26 | ||||
-rw-r--r-- | src/libGLESv2/renderer/d3d/d3d11/Clear11.h | 3 | ||||
-rw-r--r-- | src/libGLESv2/renderer/d3d/d3d11/Renderer11.cpp | 11 | ||||
-rw-r--r-- | src/libGLESv2/renderer/d3d/d3d11/Renderer11.h | 2 | ||||
-rw-r--r-- | src/libGLESv2/renderer/d3d/d3d9/Renderer9.cpp | 8 | ||||
-rw-r--r-- | src/libGLESv2/renderer/d3d/d3d9/Renderer9.h | 2 |
10 files changed, 86 insertions, 54 deletions
diff --git a/src/libGLESv2/Context.cpp b/src/libGLESv2/Context.cpp index 5569bd01..ac9914be 100644 --- a/src/libGLESv2/Context.cpp +++ b/src/libGLESv2/Context.cpp @@ -1543,28 +1543,28 @@ void Context::markTransformFeedbackUsage() } } -void Context::clear(GLbitfield mask) +Error Context::clear(GLbitfield mask) { if (mState.isRasterizerDiscardEnabled()) { - return; + return Error(GL_NO_ERROR); } ClearParameters clearParams = mState.getClearParameters(mask); if (!applyRenderTarget(GL_TRIANGLES, true)) // Clips the clear to the scissor rectangle but not the viewport { - return; + return Error(GL_NO_ERROR); } - mRenderer->clear(clearParams, mState.getDrawFramebuffer()); + return mRenderer->clear(clearParams, mState.getDrawFramebuffer()); } -void Context::clearBufferfv(GLenum buffer, int drawbuffer, const float *values) +Error Context::clearBufferfv(GLenum buffer, int drawbuffer, const float *values) { if (mState.isRasterizerDiscardEnabled()) { - return; + return Error(GL_NO_ERROR); } // glClearBufferfv can be called to clear the color buffer or depth buffer @@ -1588,17 +1588,17 @@ void Context::clearBufferfv(GLenum buffer, int drawbuffer, const float *values) if (!applyRenderTarget(GL_TRIANGLES, true)) // Clips the clear to the scissor rectangle but not the viewport { - return; + return Error(GL_NO_ERROR); } - mRenderer->clear(clearParams, mState.getDrawFramebuffer()); + return mRenderer->clear(clearParams, mState.getDrawFramebuffer()); } -void Context::clearBufferuiv(GLenum buffer, int drawbuffer, const unsigned int *values) +Error Context::clearBufferuiv(GLenum buffer, int drawbuffer, const unsigned int *values) { if (mState.isRasterizerDiscardEnabled()) { - return; + return Error(GL_NO_ERROR); } // glClearBufferuv can only be called to clear a color buffer @@ -1612,17 +1612,17 @@ void Context::clearBufferuiv(GLenum buffer, int drawbuffer, const unsigned int * if (!applyRenderTarget(GL_TRIANGLES, true)) // Clips the clear to the scissor rectangle but not the viewport { - return; + return Error(GL_NO_ERROR); } - mRenderer->clear(clearParams, mState.getDrawFramebuffer()); + return mRenderer->clear(clearParams, mState.getDrawFramebuffer()); } -void Context::clearBufferiv(GLenum buffer, int drawbuffer, const int *values) +Error Context::clearBufferiv(GLenum buffer, int drawbuffer, const int *values) { if (mState.isRasterizerDiscardEnabled()) { - return; + return Error(GL_NO_ERROR); } // glClearBufferfv can be called to clear the color buffer or stencil buffer @@ -1646,17 +1646,17 @@ void Context::clearBufferiv(GLenum buffer, int drawbuffer, const int *values) if (!applyRenderTarget(GL_TRIANGLES, true)) // Clips the clear to the scissor rectangle but not the viewport { - return; + return Error(GL_NO_ERROR); } - mRenderer->clear(clearParams, mState.getDrawFramebuffer()); + return mRenderer->clear(clearParams, mState.getDrawFramebuffer()); } -void Context::clearBufferfi(GLenum buffer, int drawbuffer, float depth, int stencil) +Error Context::clearBufferfi(GLenum buffer, int drawbuffer, float depth, int stencil) { if (mState.isRasterizerDiscardEnabled()) { - return; + return Error(GL_NO_ERROR); } // glClearBufferfi can only be called to clear a depth stencil buffer @@ -1668,10 +1668,10 @@ void Context::clearBufferfi(GLenum buffer, int drawbuffer, float depth, int sten if (!applyRenderTarget(GL_TRIANGLES, true)) // Clips the clear to the scissor rectangle but not the viewport { - return; + return Error(GL_NO_ERROR); } - mRenderer->clear(clearParams, mState.getDrawFramebuffer()); + return mRenderer->clear(clearParams, mState.getDrawFramebuffer()); } void Context::readPixels(GLint x, GLint y, GLsizei width, GLsizei height, diff --git a/src/libGLESv2/Context.h b/src/libGLESv2/Context.h index 5a19eea0..6b6a583c 100644 --- a/src/libGLESv2/Context.h +++ b/src/libGLESv2/Context.h @@ -185,11 +185,11 @@ class Context bool getQueryParameterInfo(GLenum pname, GLenum *type, unsigned int *numParams); bool getIndexedQueryParameterInfo(GLenum target, GLenum *type, unsigned int *numParams); - void clear(GLbitfield mask); - void clearBufferfv(GLenum buffer, int drawbuffer, const float *values); - void clearBufferuiv(GLenum buffer, int drawbuffer, const unsigned int *values); - void clearBufferiv(GLenum buffer, int drawbuffer, const int *values); - void clearBufferfi(GLenum buffer, int drawbuffer, float depth, int stencil); + Error clear(GLbitfield mask); + Error clearBufferfv(GLenum buffer, int drawbuffer, const float *values); + Error clearBufferuiv(GLenum buffer, int drawbuffer, const unsigned int *values); + Error clearBufferiv(GLenum buffer, int drawbuffer, const int *values); + Error clearBufferfi(GLenum buffer, int drawbuffer, float depth, int stencil); void readPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei *bufSize, void* pixels); void drawArrays(GLenum mode, GLint first, GLsizei count, GLsizei instances); diff --git a/src/libGLESv2/libGLESv2.cpp b/src/libGLESv2/libGLESv2.cpp index e0443da7..9b48f8b3 100644 --- a/src/libGLESv2/libGLESv2.cpp +++ b/src/libGLESv2/libGLESv2.cpp @@ -654,7 +654,12 @@ void __stdcall glClear(GLbitfield mask) return; } - context->clear(mask); + gl::Error error = context->clear(mask); + if (error.isError()) + { + context->recordError(error); + return; + } } } @@ -6598,7 +6603,12 @@ void __stdcall glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint* val return; } - context->clearBufferiv(buffer, drawbuffer, value); + gl::Error error = context->clearBufferiv(buffer, drawbuffer, value); + if (error.isError()) + { + context->recordError(error); + return; + } } } @@ -6630,7 +6640,12 @@ void __stdcall glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint* v return; } - context->clearBufferuiv(buffer, drawbuffer, value); + gl::Error error = context->clearBufferuiv(buffer, drawbuffer, value); + if (error.isError()) + { + context->recordError(error); + return; + } } } @@ -6670,7 +6685,12 @@ void __stdcall glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat* v return; } - context->clearBufferfv(buffer, drawbuffer, value); + gl::Error error = context->clearBufferfv(buffer, drawbuffer, value); + if (error.isError()) + { + context->recordError(error); + return; + } } } @@ -6702,7 +6722,12 @@ void __stdcall glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, G return; } - context->clearBufferfi(buffer, drawbuffer, depth, stencil); + gl::Error error = context->clearBufferfi(buffer, drawbuffer, depth, stencil); + if (error.isError()) + { + context->recordError(error); + return; + } } } diff --git a/src/libGLESv2/renderer/Renderer.h b/src/libGLESv2/renderer/Renderer.h index d3d253bc..490d3c16 100644 --- a/src/libGLESv2/renderer/Renderer.h +++ b/src/libGLESv2/renderer/Renderer.h @@ -13,6 +13,7 @@ #include "libGLESv2/Uniform.h" #include "libGLESv2/angletypes.h" #include "libGLESv2/Caps.h" +#include "libGLESv2/Error.h" #include <cstdint> @@ -140,7 +141,7 @@ class Renderer virtual void drawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, gl::Buffer *elementArrayBuffer, const TranslatedIndexData &indexInfo, GLsizei instances) = 0; - virtual void clear(const gl::ClearParameters &clearParams, gl::Framebuffer *frameBuffer) = 0; + virtual gl::Error clear(const gl::ClearParameters &clearParams, gl::Framebuffer *frameBuffer) = 0; virtual void markAllStateDirty() = 0; diff --git a/src/libGLESv2/renderer/d3d/d3d11/Clear11.cpp b/src/libGLESv2/renderer/d3d/d3d11/Clear11.cpp index ba9970bf..8aac2f1d 100644 --- a/src/libGLESv2/renderer/d3d/d3d11/Clear11.cpp +++ b/src/libGLESv2/renderer/d3d/d3d11/Clear11.cpp @@ -148,7 +148,7 @@ Clear11::~Clear11() SafeRelease(mRasterizerState); } -void Clear11::clearFramebuffer(const gl::ClearParameters &clearParams, gl::Framebuffer *frameBuffer) +gl::Error Clear11::clearFramebuffer(const gl::ClearParameters &clearParams, gl::Framebuffer *frameBuffer) { // First determine if a scissored clear is needed, this will always require drawing a quad. // @@ -183,7 +183,7 @@ void Clear11::clearFramebuffer(const gl::ClearParameters &clearParams, gl::Frame else { UNREACHABLE(); - return; + return gl::Error(GL_INVALID_OPERATION); } if (clearParams.scissorEnabled && (clearParams.scissor.x >= framebufferSize.width || @@ -192,7 +192,7 @@ void Clear11::clearFramebuffer(const gl::ClearParameters &clearParams, gl::Frame clearParams.scissor.y + clearParams.scissor.height <= 0)) { // Scissor is enabled and the scissor rectangle is outside the renderbuffer - return; + return gl::Error(GL_NO_ERROR); } bool needScissoredClear = clearParams.scissorEnabled && (clearParams.scissor.x > 0 || clearParams.scissor.y > 0 || @@ -214,8 +214,7 @@ void Clear11::clearFramebuffer(const gl::ClearParameters &clearParams, gl::Frame RenderTarget11 *renderTarget = RenderTarget11::makeRenderTarget11(attachment->getRenderTarget()); if (!renderTarget) { - ERR("Render target pointer unexpectedly null."); - return; + return gl::Error(GL_OUT_OF_MEMORY, "Internal render target view pointer unexpectedly null."); } const gl::InternalFormat &formatInfo = gl::GetInternalFormatInfo(attachment->getInternalFormat()); @@ -259,8 +258,7 @@ void Clear11::clearFramebuffer(const gl::ClearParameters &clearParams, gl::Frame ID3D11RenderTargetView *framebufferRTV = renderTarget->getRenderTargetView(); if (!framebufferRTV) { - ERR("Render target view pointer unexpectedly null."); - return; + return gl::Error(GL_OUT_OF_MEMORY, "Internal render target view pointer unexpectedly null."); } const gl::InternalFormat &actualFormatInfo = gl::GetInternalFormatInfo(attachment->getActualFormat()); @@ -289,8 +287,7 @@ void Clear11::clearFramebuffer(const gl::ClearParameters &clearParams, gl::Frame RenderTarget11 *renderTarget = RenderTarget11::makeRenderTarget11(attachment->getRenderTarget()); if (!renderTarget) { - ERR("Depth stencil render target pointer unexpectedly null."); - return; + return gl::Error(GL_OUT_OF_MEMORY, "Internal depth stencil view pointer unexpectedly null."); } const gl::InternalFormat &actualFormatInfo = gl::GetInternalFormatInfo(attachment->getActualFormat()); @@ -307,8 +304,7 @@ void Clear11::clearFramebuffer(const gl::ClearParameters &clearParams, gl::Frame ID3D11DepthStencilView *framebufferDSV = renderTarget->getDepthStencilView(); if (!framebufferDSV) { - ERR("Depth stencil view pointer unexpectedly null."); - return; + return gl::Error(GL_OUT_OF_MEMORY, "Internal depth stencil view pointer unexpectedly null."); } UINT clearFlags = (clearParams.clearDepth ? D3D11_CLEAR_DEPTH : 0) | @@ -355,8 +351,7 @@ void Clear11::clearFramebuffer(const gl::ClearParameters &clearParams, gl::Frame ID3D11RenderTargetView *rtv = renderTarget->getRenderTargetView(); if (!rtv) { - ERR("Render target view unexpectedly null."); - return; + return gl::Error(GL_OUT_OF_MEMORY, "Internal render target view pointer unexpectedly null."); } rtvs[i] = rtv; @@ -378,8 +373,7 @@ void Clear11::clearFramebuffer(const gl::ClearParameters &clearParams, gl::Frame HRESULT result = deviceContext->Map(mVertexBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource); if (FAILED(result)) { - ERR("Failed to map masked clear vertex buffer, HRESULT: 0x%X.", result); - return; + return gl::Error(GL_OUT_OF_MEMORY, "Failed to map internal masked clear vertex buffer, HRESULT: 0x%X.", result); } const gl::Rectangle *scissorPtr = clearParams.scissorEnabled ? &clearParams.scissor : NULL; @@ -444,6 +438,8 @@ void Clear11::clearFramebuffer(const gl::ClearParameters &clearParams, gl::Frame // Clean up mRenderer->markAllStateDirty(); } + + return gl::Error(GL_NO_ERROR); } ID3D11BlendState *Clear11::getBlendState(const std::vector<MaskedRenderTarget>& rts) diff --git a/src/libGLESv2/renderer/d3d/d3d11/Clear11.h b/src/libGLESv2/renderer/d3d/d3d11/Clear11.h index be1a9c72..be8e187c 100644 --- a/src/libGLESv2/renderer/d3d/d3d11/Clear11.h +++ b/src/libGLESv2/renderer/d3d/d3d11/Clear11.h @@ -10,6 +10,7 @@ #define LIBGLESV2_RENDERER_CLEAR11_H_ #include "libGLESv2/angletypes.h" +#include "libGLESv2/Error.h" #include <map> #include <vector> @@ -31,7 +32,7 @@ class Clear11 ~Clear11(); // Clears the framebuffer with the supplied clear parameters, assumes that the framebuffer is currently applied. - void clearFramebuffer(const gl::ClearParameters &clearParams, gl::Framebuffer *frameBuffer); + gl::Error clearFramebuffer(const gl::ClearParameters &clearParams, gl::Framebuffer *frameBuffer); private: Renderer11 *mRenderer; diff --git a/src/libGLESv2/renderer/d3d/d3d11/Renderer11.cpp b/src/libGLESv2/renderer/d3d/d3d11/Renderer11.cpp index 46d5e7d0..7c45105b 100644 --- a/src/libGLESv2/renderer/d3d/d3d11/Renderer11.cpp +++ b/src/libGLESv2/renderer/d3d/d3d11/Renderer11.cpp @@ -1521,10 +1521,17 @@ void Renderer11::applyUniforms(const gl::ProgramBinary &programBinary) } } -void Renderer11::clear(const gl::ClearParameters &clearParams, gl::Framebuffer *frameBuffer) +gl::Error Renderer11::clear(const gl::ClearParameters &clearParams, gl::Framebuffer *frameBuffer) { - mClear->clearFramebuffer(clearParams, frameBuffer); + gl::Error error = mClear->clearFramebuffer(clearParams, frameBuffer); + if (error.isError()) + { + return error; + } + invalidateFramebufferSwizzles(frameBuffer); + + return gl::Error(GL_NO_ERROR); } void Renderer11::markAllStateDirty() diff --git a/src/libGLESv2/renderer/d3d/d3d11/Renderer11.h b/src/libGLESv2/renderer/d3d/d3d11/Renderer11.h index 47fcf290..a3d52a71 100644 --- a/src/libGLESv2/renderer/d3d/d3d11/Renderer11.h +++ b/src/libGLESv2/renderer/d3d/d3d11/Renderer11.h @@ -89,7 +89,7 @@ class Renderer11 : public Renderer virtual void drawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, gl::Buffer *elementArrayBuffer, const TranslatedIndexData &indexInfo, GLsizei instances); - virtual void clear(const gl::ClearParameters &clearParams, gl::Framebuffer *frameBuffer); + virtual gl::Error clear(const gl::ClearParameters &clearParams, gl::Framebuffer *frameBuffer); virtual void markAllStateDirty(); diff --git a/src/libGLESv2/renderer/d3d/d3d9/Renderer9.cpp b/src/libGLESv2/renderer/d3d/d3d9/Renderer9.cpp index 7450fc03..5583dfe1 100644 --- a/src/libGLESv2/renderer/d3d/d3d9/Renderer9.cpp +++ b/src/libGLESv2/renderer/d3d/d3d9/Renderer9.cpp @@ -1713,13 +1713,13 @@ void Renderer9::applyUniformnbv(gl::LinkedUniform *targetUniform, const GLint *v applyUniformnfv(targetUniform, (GLfloat*)vector); } -void Renderer9::clear(const gl::ClearParameters &clearParams, gl::Framebuffer *frameBuffer) +gl::Error Renderer9::clear(const gl::ClearParameters &clearParams, gl::Framebuffer *frameBuffer) { if (clearParams.colorClearType != GL_FLOAT) { // Clearing buffers with non-float values is not supported by Renderer9 and ES 2.0 UNREACHABLE(); - return; + return gl::Error(GL_INVALID_OPERATION); } bool clearColor = clearParams.clearColor[0]; @@ -1729,7 +1729,7 @@ void Renderer9::clear(const gl::ClearParameters &clearParams, gl::Framebuffer *f { // Clearing individual buffers other than buffer zero is not supported by Renderer9 and ES 2.0 UNREACHABLE(); - return; + return gl::Error(GL_INVALID_OPERATION); } } @@ -1926,6 +1926,8 @@ void Renderer9::clear(const gl::ClearParameters &clearParams, gl::Framebuffer *f mDevice->Clear(0, NULL, dxClearFlags, color, depth, stencil); } + + return gl::Error(GL_NO_ERROR); } void Renderer9::markAllStateDirty() diff --git a/src/libGLESv2/renderer/d3d/d3d9/Renderer9.h b/src/libGLESv2/renderer/d3d/d3d9/Renderer9.h index 5858d2d2..e1398f2f 100644 --- a/src/libGLESv2/renderer/d3d/d3d9/Renderer9.h +++ b/src/libGLESv2/renderer/d3d/d3d9/Renderer9.h @@ -90,7 +90,7 @@ class Renderer9 : public Renderer virtual void drawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, gl::Buffer *elementArrayBuffer, const TranslatedIndexData &indexInfo, GLsizei instances); - virtual void clear(const gl::ClearParameters &clearParams, gl::Framebuffer *frameBuffer); + virtual gl::Error clear(const gl::ClearParameters &clearParams, gl::Framebuffer *frameBuffer); virtual void markAllStateDirty(); |