Reordered the logic of Renderer11::clear to determine earlier if a masked clear is required.

TRAC #22343 Signed-off-by: Nicolas Capens Signed-off-by: Shannon Woods Author: Geoff Lang git-svn-id: https://angleproject.googlecode.com/svn/branches/dx11proto@1758 736b8ea6-26fd-11df-bfd4-992fa37f6226
parent 233fe954
...@@ -1200,99 +1200,78 @@ void Renderer11::applyUniforms(const gl::UniformArray *uniformArray) ...@@ -1200,99 +1200,78 @@ void Renderer11::applyUniforms(const gl::UniformArray *uniformArray)
void Renderer11::clear(const gl::ClearParameters &clearParams, gl::Framebuffer *frameBuffer) void Renderer11::clear(const gl::ClearParameters &clearParams, gl::Framebuffer *frameBuffer)
{ {
if (clearParams.mask & GL_COLOR_BUFFER_BIT) bool alphaUnmasked = (gl::GetAlphaSize(mRenderTargetDesc.format) == 0) || clearParams.colorMaskAlpha;
{ bool needMaskedColorClear = (clearParams.mask & GL_COLOR_BUFFER_BIT) &&
gl::Renderbuffer *renderbufferObject = frameBuffer->getColorbuffer(); !(clearParams.colorMaskRed && clearParams.colorMaskGreen &&
if (renderbufferObject) clearParams.colorMaskBlue && alphaUnmasked);
{
RenderTarget11 *renderTarget = RenderTarget11::makeRenderTarget11(renderbufferObject->getRenderTarget()); unsigned int stencilUnmasked = 0x0;
if (!renderTarget) if (frameBuffer->hasStencil())
{ {
ERR("render target pointer unexpectedly null."); unsigned int stencilSize = gl::GetStencilSize(frameBuffer->getStencilbuffer()->getActualFormat());
return; stencilUnmasked = (0x1 << stencilSize) - 1;
} }
bool needMaskedStencilClear = (clearParams.mask & GL_STENCIL_BUFFER_BIT) &&
ID3D11RenderTargetView *framebufferRTV = renderTarget->getRenderTargetView(); (clearParams.stencilWriteMask & stencilUnmasked) != stencilUnmasked;
if (!framebufferRTV)
{ bool needScissoredClear = mScissorEnabled && (mCurScissor.x > 0 || mCurScissor.y > 0 ||
ERR("render target view pointer unexpectedly null."); mCurScissor.x + mCurScissor.width < mRenderTargetDesc.width ||
return; mCurScissor.y + mCurScissor.height < mRenderTargetDesc.height);
}
if (needMaskedColorClear || needMaskedStencilClear || needScissoredClear)
if (mScissorEnabled && (mCurScissor.x > 0 || mCurScissor.y > 0 || {
mCurScissor.x + mCurScissor.width < renderTarget->getWidth() || // TODO
mCurScissor.y + mCurScissor.height < renderTarget->getHeight())) UNIMPLEMENTED();
{ }
// TODO: clearing of subregion of render target else
UNIMPLEMENTED(); {
} if (clearParams.mask & GL_COLOR_BUFFER_BIT)
{
gl::Renderbuffer *renderbufferObject = frameBuffer->getColorbuffer();
if (renderbufferObject)
{
RenderTarget11 *renderTarget = RenderTarget11::makeRenderTarget11(renderbufferObject->getRenderTarget());
if (!renderTarget)
{
ERR("render target pointer unexpectedly null.");
return;
}
bool alphaUnmasked = (gl::GetAlphaSize(mRenderTargetDesc.format) == 0) || clearParams.colorMaskAlpha; ID3D11RenderTargetView *framebufferRTV = renderTarget->getRenderTargetView();
const bool needMaskedColorClear = (clearParams.mask & GL_COLOR_BUFFER_BIT) && if (!framebufferRTV)
!(clearParams.colorMaskRed && clearParams.colorMaskGreen && {
clearParams.colorMaskBlue && alphaUnmasked); ERR("render target view pointer unexpectedly null.");
return;
}
if (needMaskedColorClear)
{
// TODO: masked color clearing
UNIMPLEMENTED();
}
else
{
const float clearValues[4] = { clearParams.colorClearValue.red, const float clearValues[4] = { clearParams.colorClearValue.red,
clearParams.colorClearValue.green, clearParams.colorClearValue.green,
clearParams.colorClearValue.blue, clearParams.colorClearValue.blue,
clearParams.colorClearValue.alpha }; clearParams.colorClearValue.alpha };
mDeviceContext->ClearRenderTargetView(framebufferRTV, clearValues); mDeviceContext->ClearRenderTargetView(framebufferRTV, clearValues);
}
framebufferRTV->Release(); framebufferRTV->Release();
}
} }
} if (clearParams.mask & GL_DEPTH_BUFFER_BIT || clearParams.mask & GL_STENCIL_BUFFER_BIT)
if (clearParams.mask & GL_DEPTH_BUFFER_BIT || clearParams.mask & GL_STENCIL_BUFFER_BIT)
{
gl::Renderbuffer *renderbufferObject = frameBuffer->getDepthOrStencilbuffer();
if (renderbufferObject)
{ {
RenderTarget11 *renderTarget = RenderTarget11::makeRenderTarget11(renderbufferObject->getDepthStencil()); gl::Renderbuffer *renderbufferObject = frameBuffer->getDepthOrStencilbuffer();
if (!renderTarget) if (renderbufferObject)
{
ERR("render target pointer unexpectedly null.");
return;
}
ID3D11DepthStencilView *framebufferDSV = renderTarget->getDepthStencilView();
if (!framebufferDSV)
{
ERR("depth stencil view pointer unexpectedly null.");
return;
}
if (mScissorEnabled && (mCurScissor.x > 0 || mCurScissor.y > 0 ||
mCurScissor.x + mCurScissor.width < renderTarget->getWidth() ||
mCurScissor.y + mCurScissor.height < renderTarget->getHeight()))
{
// TODO: clearing of subregion of depth stencil view
UNIMPLEMENTED();
}
unsigned int stencilUnmasked = 0x0;
if ((clearParams.mask & GL_STENCIL_BUFFER_BIT) && frameBuffer->hasStencil())
{ {
unsigned int stencilSize = gl::GetStencilSize(frameBuffer->getStencilbuffer()->getActualFormat()); RenderTarget11 *renderTarget = RenderTarget11::makeRenderTarget11(renderbufferObject->getDepthStencil());
stencilUnmasked = (0x1 << stencilSize) - 1; if (!renderTarget)
} {
ERR("render target pointer unexpectedly null.");
return;
}
const bool needMaskedStencilClear = (clearParams.mask & GL_STENCIL_BUFFER_BIT) && ID3D11DepthStencilView *framebufferDSV = renderTarget->getDepthStencilView();
(clearParams.stencilWriteMask & stencilUnmasked) != stencilUnmasked; if (!framebufferDSV)
{
ERR("depth stencil view pointer unexpectedly null.");
return;
}
if (needMaskedStencilClear)
{
// TODO: masked clearing of depth stencil
UNIMPLEMENTED();
}
else
{
UINT clearFlags = 0; UINT clearFlags = 0;
if (clearParams.mask & GL_DEPTH_BUFFER_BIT) if (clearParams.mask & GL_DEPTH_BUFFER_BIT)
{ {
...@@ -1307,9 +1286,9 @@ void Renderer11::clear(const gl::ClearParameters &clearParams, gl::Framebuffer * ...@@ -1307,9 +1286,9 @@ void Renderer11::clear(const gl::ClearParameters &clearParams, gl::Framebuffer *
UINT8 stencilClear = clearParams.stencilClearValue & 0x000000FF; UINT8 stencilClear = clearParams.stencilClearValue & 0x000000FF;
mDeviceContext->ClearDepthStencilView(framebufferDSV, clearFlags, depthClear, stencilClear); mDeviceContext->ClearDepthStencilView(framebufferDSV, clearFlags, depthClear, stencilClear);
}
framebufferDSV->Release(); framebufferDSV->Release();
}
} }
} }
} }
......
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