Commit cc79b8c6 by Geoff Lang

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/211440Reviewed-by: 's avatarShannon Woods <shannonwoods@chromium.org> Tested-by: 's avatarGeoff Lang <geofflang@chromium.org>
parent 2a1c15a1
......@@ -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,
......
......@@ -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);
......
......@@ -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;
}
}
}
......
......@@ -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;
......
......@@ -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)
......
......@@ -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;
......
......@@ -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()
......
......@@ -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();
......
......@@ -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()
......
......@@ -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();
......
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