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,6 +1200,31 @@ void Renderer11::applyUniforms(const gl::UniformArray *uniformArray) ...@@ -1200,6 +1200,31 @@ 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)
{ {
bool alphaUnmasked = (gl::GetAlphaSize(mRenderTargetDesc.format) == 0) || clearParams.colorMaskAlpha;
bool needMaskedColorClear = (clearParams.mask & GL_COLOR_BUFFER_BIT) &&
!(clearParams.colorMaskRed && clearParams.colorMaskGreen &&
clearParams.colorMaskBlue && alphaUnmasked);
unsigned int stencilUnmasked = 0x0;
if (frameBuffer->hasStencil())
{
unsigned int stencilSize = gl::GetStencilSize(frameBuffer->getStencilbuffer()->getActualFormat());
stencilUnmasked = (0x1 << stencilSize) - 1;
}
bool needMaskedStencilClear = (clearParams.mask & GL_STENCIL_BUFFER_BIT) &&
(clearParams.stencilWriteMask & stencilUnmasked) != stencilUnmasked;
bool needScissoredClear = mScissorEnabled && (mCurScissor.x > 0 || mCurScissor.y > 0 ||
mCurScissor.x + mCurScissor.width < mRenderTargetDesc.width ||
mCurScissor.y + mCurScissor.height < mRenderTargetDesc.height);
if (needMaskedColorClear || needMaskedStencilClear || needScissoredClear)
{
// TODO
UNIMPLEMENTED();
}
else
{
if (clearParams.mask & GL_COLOR_BUFFER_BIT) if (clearParams.mask & GL_COLOR_BUFFER_BIT)
{ {
gl::Renderbuffer *renderbufferObject = frameBuffer->getColorbuffer(); gl::Renderbuffer *renderbufferObject = frameBuffer->getColorbuffer();
...@@ -1219,32 +1244,11 @@ void Renderer11::clear(const gl::ClearParameters &clearParams, gl::Framebuffer * ...@@ -1219,32 +1244,11 @@ void Renderer11::clear(const gl::ClearParameters &clearParams, gl::Framebuffer *
return; 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 render target
UNIMPLEMENTED();
}
bool alphaUnmasked = (gl::GetAlphaSize(mRenderTargetDesc.format) == 0) || clearParams.colorMaskAlpha;
const bool needMaskedColorClear = (clearParams.mask & GL_COLOR_BUFFER_BIT) &&
!(clearParams.colorMaskRed && clearParams.colorMaskGreen &&
clearParams.colorMaskBlue && alphaUnmasked);
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();
} }
...@@ -1268,31 +1272,6 @@ void Renderer11::clear(const gl::ClearParameters &clearParams, gl::Framebuffer * ...@@ -1268,31 +1272,6 @@ void Renderer11::clear(const gl::ClearParameters &clearParams, gl::Framebuffer *
return; 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());
stencilUnmasked = (0x1 << stencilSize) - 1;
}
const bool needMaskedStencilClear = (clearParams.mask & GL_STENCIL_BUFFER_BIT) &&
(clearParams.stencilWriteMask & stencilUnmasked) != stencilUnmasked;
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,11 +1286,11 @@ void Renderer11::clear(const gl::ClearParameters &clearParams, gl::Framebuffer * ...@@ -1307,11 +1286,11 @@ 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();
} }
} }
}
} }
void Renderer11::markAllStateDirty() void Renderer11::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