Commit e8bc3193 by Geoff Lang

Optimize masked clearing of missing channels.

Instead of doing a masked clear when a texture has mismatched channel counts, set the clear color to the default for the missing channels and do a regular clear. This catches es3proto up to master in terms of clear performance. BUG=angle:557 Change-Id: I4f16976154af7735f5bb2b0b17adb3a264872ec0 Reviewed-on: https://chromium-review.googlesource.com/186611Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarShannon Woods <shannonwoods@chromium.org> Tested-by: 's avatarGeoff Lang <geofflang@chromium.org>
parent 0aa84f63
...@@ -231,34 +231,32 @@ void Clear11::clearFramebuffer(const gl::ClearParameters &clearParams, gl::Frame ...@@ -231,34 +231,32 @@ void Clear11::clearFramebuffer(const gl::ClearParameters &clearParams, gl::Frame
"point to floating point values (color attachment %u has internal format 0x%X).", colorAttachment, internalFormat); "point to floating point values (color attachment %u has internal format 0x%X).", colorAttachment, internalFormat);
} }
if ((gl::GetRedBits(internalFormat, clientVersion) == 0 || !clearParams.colorMaskRed ) && GLuint internalRedBits = gl::GetRedBits(internalFormat, clientVersion);
(gl::GetGreenBits(internalFormat, clientVersion) == 0 || !clearParams.colorMaskGreen) && GLuint internalGreenBits = gl::GetGreenBits(internalFormat, clientVersion);
(gl::GetBlueBits(internalFormat, clientVersion) == 0 || !clearParams.colorMaskBlue ) && GLuint internalBlueBits = gl::GetBlueBits(internalFormat, clientVersion);
(gl::GetAlphaBits(internalFormat, clientVersion) == 0 || !clearParams.colorMaskAlpha)) GLuint internalAlphaBits = gl::GetAlphaBits(internalFormat, clientVersion);
if ((internalRedBits == 0 || !clearParams.colorMaskRed) &&
(internalGreenBits == 0 || !clearParams.colorMaskGreen) &&
(internalBlueBits == 0 || !clearParams.colorMaskBlue) &&
(internalAlphaBits == 0 || !clearParams.colorMaskAlpha))
{ {
// Every channel either does not exist in the render target or is masked out // Every channel either does not exist in the render target or is masked out
continue; continue;
} }
else if (needScissoredClear || clearParams.colorClearType != GL_FLOAT || else if (needScissoredClear || clearParams.colorClearType != GL_FLOAT ||
(gl::GetRedBits(internalFormat, clientVersion) > 0 && !clearParams.colorMaskRed ) || (internalRedBits > 0 && !clearParams.colorMaskRed) ||
(gl::GetGreenBits(internalFormat, clientVersion) > 0 && !clearParams.colorMaskGreen) || (internalGreenBits > 0 && !clearParams.colorMaskGreen) ||
(gl::GetBlueBits(internalFormat, clientVersion) > 0 && !clearParams.colorMaskBlue ) || (internalBlueBits > 0 && !clearParams.colorMaskBlue) ||
(gl::GetAlphaBits(internalFormat, clientVersion) > 0 && !clearParams.colorMaskAlpha)) (internalAlphaBits > 0 && !clearParams.colorMaskAlpha))
{ {
// A scissored or masked clear is required // A scissored or masked clear is required
maskedClearRenderTargets.push_back(renderTarget); maskedClearRenderTargets.push_back(renderTarget);
} }
else if (((gl::GetRedBits(internalFormat, clientVersion) == 0) && (gl::GetRedBits(actualFormat, clientVersion) > 0)) ||
((gl::GetGreenBits(internalFormat, clientVersion) == 0) && (gl::GetGreenBits(actualFormat, clientVersion) > 0)) ||
((gl::GetBlueBits(internalFormat, clientVersion) == 0) && (gl::GetBlueBits(actualFormat, clientVersion) > 0)) ||
((gl::GetAlphaBits(internalFormat, clientVersion) == 0) && (gl::GetAlphaBits(actualFormat, clientVersion) > 0)))
{
// The actual format has a channel that the internal format does not
maskedClearRenderTargets.push_back(renderTarget);
}
else else
{ {
// ID3D11DeviceContext::ClearRenderTargetView is possible // ID3D11DeviceContext::ClearRenderTargetView is possible
ID3D11RenderTargetView *framebufferRTV = renderTarget->getRenderTargetView(); ID3D11RenderTargetView *framebufferRTV = renderTarget->getRenderTargetView();
if (!framebufferRTV) if (!framebufferRTV)
{ {
...@@ -266,10 +264,21 @@ void Clear11::clearFramebuffer(const gl::ClearParameters &clearParams, gl::Frame ...@@ -266,10 +264,21 @@ void Clear11::clearFramebuffer(const gl::ClearParameters &clearParams, gl::Frame
return; return;
} }
const float clearValues[4] = { clearParams.colorFClearValue.red, // Check if the actual format has a channel that the internal format does not and set them to the
clearParams.colorFClearValue.green, // default values
clearParams.colorFClearValue.blue, GLuint actualRedBits = gl::GetRedBits(actualFormat, clientVersion);
clearParams.colorFClearValue.alpha }; GLuint actualGreenBits = gl::GetGreenBits(actualFormat, clientVersion);
GLuint actualBlueBits = gl::GetBlueBits(actualFormat, clientVersion);
GLuint actualAlphaBits = gl::GetAlphaBits(actualFormat, clientVersion);
const float clearValues[4] =
{
((internalRedBits == 0 && actualRedBits > 0) ? 0.0f : clearParams.colorFClearValue.red),
((internalGreenBits == 0 && actualGreenBits > 0) ? 0.0f : clearParams.colorFClearValue.green),
((internalBlueBits == 0 && actualBlueBits > 0) ? 0.0f : clearParams.colorFClearValue.blue),
((internalAlphaBits == 0 && actualAlphaBits > 0) ? 1.0f : clearParams.colorFClearValue.alpha),
};
deviceContext->ClearRenderTargetView(framebufferRTV, clearValues); deviceContext->ClearRenderTargetView(framebufferRTV, clearValues);
} }
} }
......
...@@ -1873,12 +1873,8 @@ void Renderer9::clear(const gl::ClearParameters &clearParams, gl::Framebuffer *f ...@@ -1873,12 +1873,8 @@ void Renderer9::clear(const gl::ClearParameters &clearParams, gl::Framebuffer *f
} }
} }
D3DCOLOR color = D3DCOLOR_ARGB(gl::unorm<8>(clearParams.colorFClearValue.alpha),
gl::unorm<8>(clearParams.colorFClearValue.red),
gl::unorm<8>(clearParams.colorFClearValue.green),
gl::unorm<8>(clearParams.colorFClearValue.blue));
float depth = gl::clamp01(clearParams.depthClearValue); float depth = gl::clamp01(clearParams.depthClearValue);
int stencil = clearParams.stencilClearValue & 0x000000FF; DWORD stencil = clearParams.stencilClearValue & 0x000000FF;
unsigned int stencilUnmasked = 0x0; unsigned int stencilUnmasked = 0x0;
if (clearParams.clearStencil && frameBuffer->hasStencil()) if (clearParams.clearStencil && frameBuffer->hasStencil())
...@@ -1893,8 +1889,39 @@ void Renderer9::clear(const gl::ClearParameters &clearParams, gl::Framebuffer *f ...@@ -1893,8 +1889,39 @@ void Renderer9::clear(const gl::ClearParameters &clearParams, gl::Framebuffer *f
const bool needMaskedStencilClear = clearParams.clearStencil && const bool needMaskedStencilClear = clearParams.clearStencil &&
(clearParams.stencilWriteMask & stencilUnmasked) != stencilUnmasked; (clearParams.stencilWriteMask & stencilUnmasked) != stencilUnmasked;
const bool needMaskedColorClear = clearColor && !(clearParams.colorMaskRed && clearParams.colorMaskGreen &&
clearParams.colorMaskBlue && alphaUnmasked); bool needMaskedColorClear = false;
D3DCOLOR color = D3DCOLOR_ARGB(255, 0, 0, 0);
if (clearColor)
{
gl::Renderbuffer *renderbuffer = frameBuffer->getFirstColorbuffer();
GLenum internalFormat = renderbuffer->getInternalFormat();
GLenum actualFormat = renderbuffer->getActualFormat();
GLuint clientVersion = getCurrentClientVersion();
GLuint internalRedBits = gl::GetRedBits(internalFormat, clientVersion);
GLuint internalGreenBits = gl::GetGreenBits(internalFormat, clientVersion);
GLuint internalBlueBits = gl::GetBlueBits(internalFormat, clientVersion);
GLuint internalAlphaBits = gl::GetAlphaBits(internalFormat, clientVersion);
GLuint actualRedBits = gl::GetRedBits(actualFormat, clientVersion);
GLuint actualGreenBits = gl::GetGreenBits(actualFormat, clientVersion);
GLuint actualBlueBits = gl::GetBlueBits(actualFormat, clientVersion);
GLuint actualAlphaBits = gl::GetAlphaBits(actualFormat, clientVersion);
color = D3DCOLOR_ARGB(gl::unorm<8>((internalAlphaBits == 0 && actualAlphaBits > 0) ? 1.0f : clearParams.colorFClearValue.alpha),
gl::unorm<8>((internalRedBits == 0 && actualRedBits > 0) ? 0.0f : clearParams.colorFClearValue.red),
gl::unorm<8>((internalGreenBits == 0 && actualGreenBits > 0) ? 0.0f : clearParams.colorFClearValue.green),
gl::unorm<8>((internalBlueBits == 0 && actualBlueBits > 0) ? 0.0f : clearParams.colorFClearValue.blue));
if ((internalRedBits > 0 && !clearParams.colorMaskRed) ||
(internalGreenBits > 0 && !clearParams.colorMaskGreen) ||
(internalBlueBits > 0 && !clearParams.colorMaskBlue) ||
(internalAlphaBits > 0 && !clearParams.colorMaskAlpha))
{
needMaskedColorClear = true;
}
}
if (needMaskedColorClear || needMaskedStencilClear) if (needMaskedColorClear || needMaskedStencilClear)
{ {
......
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