Bug 1352442: Only clear transparent regions of the back buffer on BeginFrame. r=mattwoodrow
MozReview-Commit-ID: LDti2gljD7q
--- a/gfx/layers/d3d11/CompositorD3D11.cpp
+++ b/gfx/layers/d3d11/CompositorD3D11.cpp
@@ -818,16 +818,20 @@ CompositorD3D11::GetPSForEffect(Effect*
NS_WARNING("No shader to load");
return nullptr;
}
}
void
CompositorD3D11::ClearRect(const gfx::Rect& aRect)
{
+ if (aRect.IsEmpty()) {
+ return;
+ }
+
mContext->OMSetBlendState(mAttachments->mDisabledBlendState, sBlendFactor, 0xFFFFFFFF);
Matrix4x4 identity;
memcpy(&mVSConstants.layerTransform, &identity._11, 64);
mVSConstants.layerQuad = aRect;
mVSConstants.renderTargetOffset[0] = 0;
mVSConstants.renderTargetOffset[1] = 0;
@@ -849,18 +853,16 @@ CompositorD3D11::ClearRect(const gfx::Re
mPSConstants.layerColor[3] = 0;
if (!UpdateConstantBuffers()) {
NS_WARNING("Failed to update shader constant buffers");
return;
}
mContext->Draw(4, 0);
-
- mContext->OMSetBlendState(mAttachments->mPremulBlendState, sBlendFactor, 0xFFFFFFFF);
}
static inline bool
EffectHasPremultipliedAlpha(Effect* aEffect)
{
if (aEffect->mType == EffectTypes::RGB) {
return static_cast<TexturedEffect*>(aEffect)->mPremultiplied;
}
@@ -1353,18 +1355,22 @@ CompositorD3D11::BeginFrame(const nsIntR
}
mCurrentClip = mBackBufferInvalid.GetBounds();
mContext->RSSetState(mAttachments->mRasterizerState);
SetRenderTarget(mDefaultRT);
- // ClearRect will set the correct blend state for us.
- ClearRect(Rect(mCurrentClip.x, mCurrentClip.y, mCurrentClip.width, mCurrentClip.height));
+ IntRegion regionToClear(mCurrentClip);
+ regionToClear.Sub(regionToClear, aOpaqueRegion);
+
+ ClearRect(Rect(regionToClear.GetBounds()));
+
+ mContext->OMSetBlendState(mAttachments->mPremulBlendState, sBlendFactor, 0xFFFFFFFF);
if (mAttachments->mSyncTexture) {
RefPtr<IDXGIKeyedMutex> mutex;
mAttachments->mSyncTexture->QueryInterface((IDXGIKeyedMutex**)getter_AddRefs(mutex));
MOZ_ASSERT(mutex);
{
HRESULT hr;