Commit a153d4b0 by Jamie Madill

Move Clear logic into RendererD3D.

BUG=angle:789 Change-Id: I56d4398e4c49fe980f649327b105cdba9d944a00 Reviewed-on: https://chromium-review.googlesource.com/226062Tested-by: 's avatarJamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarBrandon Jones <bajones@chromium.org>
parent d9e58303
...@@ -1307,153 +1307,47 @@ Error Context::clear(GLbitfield mask) ...@@ -1307,153 +1307,47 @@ Error Context::clear(GLbitfield mask)
return Error(GL_NO_ERROR); return Error(GL_NO_ERROR);
} }
ClearParameters clearParams = mState.getClearParameters(mask); return mRenderer->clear(getData(), mask);
//TODO(jmadill): Renderer refactor
rx::RendererD3D *rendererD3D = rx::RendererD3D::makeRendererD3D(mRenderer);
// Clips the clear to the scissor rectangle but not the viewport
Error error = rendererD3D->applyRenderTarget(getData(), GL_TRIANGLES, true);
if (error.isError())
{
return error;
}
return mRenderer->clear(clearParams, mState.getDrawFramebuffer());
} }
Error Context::clearBufferfv(GLenum buffer, int drawbuffer, const float *values) Error Context::clearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *values)
{ {
if (mState.isRasterizerDiscardEnabled()) if (mState.isRasterizerDiscardEnabled())
{ {
return Error(GL_NO_ERROR); return Error(GL_NO_ERROR);
} }
// glClearBufferfv can be called to clear the color buffer or depth buffer return mRenderer->clearBufferfv(getData(), buffer, drawbuffer, values);
ClearParameters clearParams = mState.getClearParameters(0);
if (buffer == GL_COLOR)
{
for (unsigned int i = 0; i < ArraySize(clearParams.clearColor); i++)
{
clearParams.clearColor[i] = (drawbuffer == static_cast<int>(i));
}
clearParams.colorFClearValue = ColorF(values[0], values[1], values[2], values[3]);
clearParams.colorClearType = GL_FLOAT;
}
if (buffer == GL_DEPTH)
{
clearParams.clearDepth = true;
clearParams.depthClearValue = values[0];
}
//TODO(jmadill): Renderer refactor
rx::RendererD3D *rendererD3D = rx::RendererD3D::makeRendererD3D(mRenderer);
// Clips the clear to the scissor rectangle but not the viewport
Error error = rendererD3D->applyRenderTarget(getData(), GL_TRIANGLES, true);
if (error.isError())
{
return error;
}
return mRenderer->clear(clearParams, mState.getDrawFramebuffer());
} }
Error Context::clearBufferuiv(GLenum buffer, int drawbuffer, const unsigned int *values) Error Context::clearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *values)
{ {
if (mState.isRasterizerDiscardEnabled()) if (mState.isRasterizerDiscardEnabled())
{ {
return Error(GL_NO_ERROR); return Error(GL_NO_ERROR);
} }
// glClearBufferuv can only be called to clear a color buffer return mRenderer->clearBufferuiv(getData(), buffer, drawbuffer, values);
ClearParameters clearParams = mState.getClearParameters(0);
for (unsigned int i = 0; i < ArraySize(clearParams.clearColor); i++)
{
clearParams.clearColor[i] = (drawbuffer == static_cast<int>(i));
}
clearParams.colorUIClearValue = ColorUI(values[0], values[1], values[2], values[3]);
clearParams.colorClearType = GL_UNSIGNED_INT;
//TODO(jmadill): Renderer refactor
rx::RendererD3D *rendererD3D = rx::RendererD3D::makeRendererD3D(mRenderer);
// Clips the clear to the scissor rectangle but not the viewport
Error error = rendererD3D->applyRenderTarget(getData(), GL_TRIANGLES, true);
if (error.isError())
{
return error;
}
return mRenderer->clear(clearParams, mState.getDrawFramebuffer());
} }
Error Context::clearBufferiv(GLenum buffer, int drawbuffer, const int *values) Error Context::clearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *values)
{ {
if (mState.isRasterizerDiscardEnabled()) if (mState.isRasterizerDiscardEnabled())
{ {
return Error(GL_NO_ERROR); return Error(GL_NO_ERROR);
} }
// glClearBufferfv can be called to clear the color buffer or stencil buffer return mRenderer->clearBufferiv(getData(), buffer, drawbuffer, values);
ClearParameters clearParams = mState.getClearParameters(0);
if (buffer == GL_COLOR)
{
for (unsigned int i = 0; i < ArraySize(clearParams.clearColor); i++)
{
clearParams.clearColor[i] = (drawbuffer == static_cast<int>(i));
}
clearParams.colorIClearValue = ColorI(values[0], values[1], values[2], values[3]);
clearParams.colorClearType = GL_INT;
}
if (buffer == GL_STENCIL)
{
clearParams.clearStencil = true;
clearParams.stencilClearValue = values[1];
}
//TODO(jmadill): Renderer refactor
rx::RendererD3D *rendererD3D = rx::RendererD3D::makeRendererD3D(mRenderer);
// Clips the clear to the scissor rectangle but not the viewport
Error error = rendererD3D->applyRenderTarget(getData(), GL_TRIANGLES, true);
if (error.isError())
{
return error;
}
return mRenderer->clear(clearParams, mState.getDrawFramebuffer());
} }
Error Context::clearBufferfi(GLenum buffer, int drawbuffer, float depth, int stencil) Error Context::clearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
{ {
if (mState.isRasterizerDiscardEnabled()) if (mState.isRasterizerDiscardEnabled())
{ {
return Error(GL_NO_ERROR); return Error(GL_NO_ERROR);
} }
// glClearBufferfi can only be called to clear a depth stencil buffer return mRenderer->clearBufferfi(getData(), buffer, drawbuffer, depth, stencil);
ClearParameters clearParams = mState.getClearParameters(0);
clearParams.clearDepth = true;
clearParams.depthClearValue = depth;
clearParams.clearStencil = true;
clearParams.stencilClearValue = stencil;
//TODO(jmadill): Renderer refactor
rx::RendererD3D *rendererD3D = rx::RendererD3D::makeRendererD3D(mRenderer);
// Clips the clear to the scissor rectangle but not the viewport
Error error = rendererD3D->applyRenderTarget(getData(), GL_TRIANGLES, true);
if (error.isError())
{
return error;
}
return mRenderer->clear(clearParams, mState.getDrawFramebuffer());
} }
Error Context::readPixels(GLint x, GLint y, GLsizei width, GLsizei height, Error Context::readPixels(GLint x, GLint y, GLsizei width, GLsizei height,
......
...@@ -176,10 +176,10 @@ class Context ...@@ -176,10 +176,10 @@ class Context
bool getIndexedQueryParameterInfo(GLenum target, GLenum *type, unsigned int *numParams); bool getIndexedQueryParameterInfo(GLenum target, GLenum *type, unsigned int *numParams);
Error clear(GLbitfield mask); Error clear(GLbitfield mask);
Error clearBufferfv(GLenum buffer, int drawbuffer, const float *values); Error clearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *values);
Error clearBufferuiv(GLenum buffer, int drawbuffer, const unsigned int *values); Error clearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *values);
Error clearBufferiv(GLenum buffer, int drawbuffer, const int *values); Error clearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *values);
Error clearBufferfi(GLenum buffer, int drawbuffer, float depth, int stencil); Error clearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil);
Error readPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei *bufSize, void* pixels); Error readPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei *bufSize, void* pixels);
Error drawArrays(GLenum mode, GLint first, GLsizei count, GLsizei instances); Error drawArrays(GLenum mode, GLint first, GLsizei count, GLsizei instances);
......
...@@ -85,8 +85,13 @@ class Renderer ...@@ -85,8 +85,13 @@ class Renderer
const GLvoid *indices, GLsizei instances, const GLvoid *indices, GLsizei instances,
const RangeUI &indexRange) = 0; const RangeUI &indexRange) = 0;
virtual gl::Error clear(const gl::Data &data, GLbitfield mask) = 0;
virtual gl::Error clearBufferfv(const gl::Data &data, GLenum buffer, GLint drawbuffer, const GLfloat *values) = 0;
virtual gl::Error clearBufferuiv(const gl::Data &data, GLenum buffer, GLint drawbuffer, const GLuint *values) = 0;
virtual gl::Error clearBufferiv(const gl::Data &data, GLenum buffer, GLint drawbuffer, const GLint *values) = 0;
virtual gl::Error clearBufferfi(const gl::Data &data, GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil) = 0;
// TODO(jmadill): pass state and essetial params only // TODO(jmadill): pass state and essetial params only
virtual gl::Error clear(const gl::ClearParameters &clearParams, gl::Framebuffer *frameBuffer) = 0;
virtual gl::Error readPixels(gl::Framebuffer *framebuffer, GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, virtual gl::Error readPixels(gl::Framebuffer *framebuffer, GLint x, GLint y, GLsizei width, GLsizei height, GLenum format,
GLenum type, GLuint outputPitch, const gl::PixelPackState &pack, uint8_t *pixels) = 0; GLenum type, GLuint outputPitch, const gl::PixelPackState &pack, uint8_t *pixels) = 0;
......
...@@ -618,4 +618,126 @@ gl::Texture *RendererD3D::getIncompleteTexture(GLenum type) ...@@ -618,4 +618,126 @@ gl::Texture *RendererD3D::getIncompleteTexture(GLenum type)
return mIncompleteTextures[type].get(); return mIncompleteTextures[type].get();
} }
gl::Error RendererD3D::clear(const gl::Data &data, GLbitfield mask)
{
gl::ClearParameters clearParams = data.state->getClearParameters(mask);
// Clips the clear to the scissor rectangle but not the viewport
gl::Error error = applyRenderTarget(data, GL_TRIANGLES, true);
if (error.isError())
{
return error;
}
return clear(clearParams, data.state->getDrawFramebuffer());
}
gl::Error RendererD3D::clearBufferfv(const gl::Data &data, GLenum buffer, GLint drawbuffer, const GLfloat *values)
{
// glClearBufferfv can be called to clear the color buffer or depth buffer
gl::ClearParameters clearParams = data.state->getClearParameters(0);
if (buffer == GL_COLOR)
{
for (unsigned int i = 0; i < ArraySize(clearParams.clearColor); i++)
{
clearParams.clearColor[i] = (drawbuffer == static_cast<int>(i));
}
clearParams.colorFClearValue = gl::ColorF(values[0], values[1], values[2], values[3]);
clearParams.colorClearType = GL_FLOAT;
}
if (buffer == GL_DEPTH)
{
clearParams.clearDepth = true;
clearParams.depthClearValue = values[0];
}
// Clips the clear to the scissor rectangle but not the viewport
gl::Error error = applyRenderTarget(data, GL_TRIANGLES, true);
if (error.isError())
{
return error;
}
return clear(clearParams, data.state->getDrawFramebuffer());
}
gl::Error RendererD3D::clearBufferuiv(const gl::Data &data, GLenum buffer, GLint drawbuffer, const GLuint *values)
{
// glClearBufferuiv can only be called to clear a color buffer
gl::ClearParameters clearParams = data.state->getClearParameters(0);
for (unsigned int i = 0; i < ArraySize(clearParams.clearColor); i++)
{
clearParams.clearColor[i] = (drawbuffer == static_cast<int>(i));
}
clearParams.colorUIClearValue = gl::ColorUI(values[0], values[1], values[2], values[3]);
clearParams.colorClearType = GL_UNSIGNED_INT;
// Clips the clear to the scissor rectangle but not the viewport
gl::Error error = applyRenderTarget(data, GL_TRIANGLES, true);
if (error.isError())
{
return error;
}
return clear(clearParams, data.state->getDrawFramebuffer());
}
gl::Error RendererD3D::clearBufferiv(const gl::Data &data, GLenum buffer, GLint drawbuffer, const GLint *values)
{
// glClearBufferiv can be called to clear the color buffer or stencil buffer
gl::ClearParameters clearParams = data.state->getClearParameters(0);
if (buffer == GL_COLOR)
{
for (unsigned int i = 0; i < ArraySize(clearParams.clearColor); i++)
{
clearParams.clearColor[i] = (drawbuffer == static_cast<int>(i));
}
clearParams.colorIClearValue = gl::ColorI(values[0], values[1], values[2], values[3]);
clearParams.colorClearType = GL_INT;
}
if (buffer == GL_STENCIL)
{
clearParams.clearStencil = true;
clearParams.stencilClearValue = values[1];
}
// Clips the clear to the scissor rectangle but not the viewport
gl::Error error = applyRenderTarget(data, GL_TRIANGLES, true);
if (error.isError())
{
return error;
}
return clear(clearParams, data.state->getDrawFramebuffer());
}
gl::Error RendererD3D::clearBufferfi(const gl::Data &data, GLenum buffer, GLint drawbuffer,
GLfloat depth, GLint stencil)
{
if (data.state->isRasterizerDiscardEnabled())
{
return gl::Error(GL_NO_ERROR);
}
// glClearBufferfi can only be called to clear a depth stencil buffer
gl::ClearParameters clearParams = data.state->getClearParameters(0);
clearParams.clearDepth = true;
clearParams.depthClearValue = depth;
clearParams.clearStencil = true;
clearParams.stencilClearValue = stencil;
// Clips the clear to the scissor rectangle but not the viewport
gl::Error error = applyRenderTarget(data, GL_TRIANGLES, true);
if (error.isError())
{
return error;
}
return clear(clearParams, data.state->getDrawFramebuffer());
}
} }
...@@ -51,6 +51,12 @@ class RendererD3D : public Renderer ...@@ -51,6 +51,12 @@ class RendererD3D : public Renderer
const GLvoid *indices, GLsizei instances, const GLvoid *indices, GLsizei instances,
const RangeUI &indexRange) override; const RangeUI &indexRange) override;
gl::Error clear(const gl::Data &data, GLbitfield mask) override;
gl::Error clearBufferfv(const gl::Data &data, GLenum buffer, int drawbuffer, const GLfloat *values) override;
gl::Error clearBufferuiv(const gl::Data &data, GLenum buffer, int drawbuffer, const GLuint *values) override;
gl::Error clearBufferiv(const gl::Data &data, GLenum buffer, int drawbuffer, const GLint *values) override;
gl::Error clearBufferfi(const gl::Data &data, GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil) override;
// Direct3D Specific methods // Direct3D Specific methods
virtual SwapChain *createSwapChain(rx::NativeWindow nativeWindow, HANDLE shareHandle, GLenum backBufferFormat, GLenum depthBufferFormat) = 0; virtual SwapChain *createSwapChain(rx::NativeWindow nativeWindow, HANDLE shareHandle, GLenum backBufferFormat, GLenum depthBufferFormat) = 0;
...@@ -143,13 +149,11 @@ class RendererD3D : public Renderer ...@@ -143,13 +149,11 @@ class RendererD3D : public Renderer
virtual VertexBuffer *createVertexBuffer() = 0; virtual VertexBuffer *createVertexBuffer() = 0;
virtual IndexBuffer *createIndexBuffer() = 0; virtual IndexBuffer *createIndexBuffer() = 0;
//TODO(jmadill): Should be private or protected
gl::Error applyRenderTarget(const gl::Data &data, GLenum drawMode, bool ignoreViewport);
protected: protected:
virtual gl::Error drawArrays(GLenum mode, GLsizei count, GLsizei instances, bool transformFeedbackActive) = 0; virtual gl::Error drawArrays(GLenum mode, GLsizei count, GLsizei instances, bool transformFeedbackActive) = 0;
virtual gl::Error drawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, virtual gl::Error drawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices,
gl::Buffer *elementArrayBuffer, const TranslatedIndexData &indexInfo, GLsizei instances) = 0; gl::Buffer *elementArrayBuffer, const TranslatedIndexData &indexInfo, GLsizei instances) = 0;
virtual gl::Error clear(const gl::ClearParameters &clearParams, const gl::Framebuffer *frameBuffer) = 0;
egl::Display *mDisplay; egl::Display *mDisplay;
...@@ -162,6 +166,7 @@ class RendererD3D : public Renderer ...@@ -162,6 +166,7 @@ class RendererD3D : public Renderer
gl::Error generateSwizzles(const gl::Data &data, gl::SamplerType type); gl::Error generateSwizzles(const gl::Data &data, gl::SamplerType type);
gl::Error generateSwizzles(const gl::Data &data); gl::Error generateSwizzles(const gl::Data &data);
gl::Error applyRenderTarget(const gl::Data &data, GLenum drawMode, bool ignoreViewport);
gl::Error applyState(const gl::Data &data, GLenum drawMode); gl::Error applyState(const gl::Data &data, GLenum drawMode);
bool applyTransformFeedbackBuffers(const gl::Data &data); bool applyTransformFeedbackBuffers(const gl::Data &data);
gl::Error applyShaders(const gl::Data &data, bool transformFeedbackActive); gl::Error applyShaders(const gl::Data &data, bool transformFeedbackActive);
......
...@@ -148,7 +148,7 @@ Clear11::~Clear11() ...@@ -148,7 +148,7 @@ Clear11::~Clear11()
SafeRelease(mRasterizerState); SafeRelease(mRasterizerState);
} }
gl::Error Clear11::clearFramebuffer(const gl::ClearParameters &clearParams, gl::Framebuffer *frameBuffer) gl::Error Clear11::clearFramebuffer(const gl::ClearParameters &clearParams, const gl::Framebuffer *frameBuffer)
{ {
// First determine if a scissored clear is needed, this will always require drawing a quad. // First determine if a scissored clear is needed, this will always require drawing a quad.
// //
......
...@@ -32,7 +32,7 @@ class Clear11 ...@@ -32,7 +32,7 @@ class Clear11
~Clear11(); ~Clear11();
// Clears the framebuffer with the supplied clear parameters, assumes that the framebuffer is currently applied. // Clears the framebuffer with the supplied clear parameters, assumes that the framebuffer is currently applied.
gl::Error clearFramebuffer(const gl::ClearParameters &clearParams, gl::Framebuffer *frameBuffer); gl::Error clearFramebuffer(const gl::ClearParameters &clearParams, const gl::Framebuffer *frameBuffer);
private: private:
Renderer11 *mRenderer; Renderer11 *mRenderer;
......
...@@ -1643,7 +1643,7 @@ gl::Error Renderer11::applyUniforms(const ProgramImpl &program, const std::vecto ...@@ -1643,7 +1643,7 @@ gl::Error Renderer11::applyUniforms(const ProgramImpl &program, const std::vecto
return gl::Error(GL_NO_ERROR); return gl::Error(GL_NO_ERROR);
} }
gl::Error Renderer11::clear(const gl::ClearParameters &clearParams, gl::Framebuffer *frameBuffer) gl::Error Renderer11::clear(const gl::ClearParameters &clearParams, const gl::Framebuffer *frameBuffer)
{ {
gl::Error error = mClear->clearFramebuffer(clearParams, frameBuffer); gl::Error error = mClear->clearFramebuffer(clearParams, frameBuffer);
if (error.isError()) if (error.isError())
......
...@@ -92,7 +92,7 @@ class Renderer11 : public RendererD3D ...@@ -92,7 +92,7 @@ class Renderer11 : public RendererD3D
virtual gl::Error drawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, virtual gl::Error drawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices,
gl::Buffer *elementArrayBuffer, const TranslatedIndexData &indexInfo, GLsizei instances); gl::Buffer *elementArrayBuffer, const TranslatedIndexData &indexInfo, GLsizei instances);
virtual gl::Error clear(const gl::ClearParameters &clearParams, gl::Framebuffer *frameBuffer); gl::Error clear(const gl::ClearParameters &clearParams, const gl::Framebuffer *frameBuffer) override;
virtual void markAllStateDirty(); virtual void markAllStateDirty();
......
...@@ -1868,7 +1868,7 @@ void Renderer9::applyUniformnbv(gl::LinkedUniform *targetUniform, const GLint *v ...@@ -1868,7 +1868,7 @@ void Renderer9::applyUniformnbv(gl::LinkedUniform *targetUniform, const GLint *v
applyUniformnfv(targetUniform, (GLfloat*)vector); applyUniformnfv(targetUniform, (GLfloat*)vector);
} }
gl::Error Renderer9::clear(const gl::ClearParameters &clearParams, gl::Framebuffer *frameBuffer) gl::Error Renderer9::clear(const gl::ClearParameters &clearParams, const gl::Framebuffer *frameBuffer)
{ {
if (clearParams.colorClearType != GL_FLOAT) if (clearParams.colorClearType != GL_FLOAT)
{ {
......
...@@ -95,7 +95,7 @@ class Renderer9 : public RendererD3D ...@@ -95,7 +95,7 @@ class Renderer9 : public RendererD3D
virtual gl::Error drawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, virtual gl::Error drawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices,
gl::Buffer *elementArrayBuffer, const TranslatedIndexData &indexInfo, GLsizei instances); gl::Buffer *elementArrayBuffer, const TranslatedIndexData &indexInfo, GLsizei instances);
virtual gl::Error clear(const gl::ClearParameters &clearParams, gl::Framebuffer *frameBuffer); gl::Error clear(const gl::ClearParameters &clearParams, const gl::Framebuffer *frameBuffer) override;
virtual void markAllStateDirty(); 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