Bug 901404. Support Azure with single buffered thebes layers. r=mattwoodrow

This commit is contained in:
Nicholas Cameron 2013-08-09 11:30:18 +12:00
parent 05b78d0697
commit af23265853
2 changed files with 58 additions and 15 deletions

View File

@ -245,6 +245,8 @@ public:
*/
gfxASurface* GetBuffer() { return mBuffer; }
gfxASurface* GetBufferOnWhite() { return mBufferOnWhite; }
gfx::DrawTarget* GetDTBuffer() { return mDTBuffer; }
gfx::DrawTarget* GetDTBufferOnWhite() { return mDTBufferOnWhite; }
/**
* Complete the drawing operation. The region to draw must have been
@ -271,11 +273,33 @@ protected:
already_AddRefed<gfxASurface>
SetBufferOnWhite(gfxASurface* aBuffer)
{
MOZ_ASSERT(!SupportsAzureContent());
nsRefPtr<gfxASurface> tmp = mBufferOnWhite.forget();
mBufferOnWhite = aBuffer;
return tmp.forget();
}
TemporaryRef<gfx::DrawTarget>
SetDTBuffer(gfx::DrawTarget* aBuffer,
const nsIntRect& aBufferRect, const nsIntPoint& aBufferRotation)
{
MOZ_ASSERT(SupportsAzureContent());
RefPtr<gfx::DrawTarget> tmp = mDTBuffer.forget();
mDTBuffer = aBuffer;
mBufferRect = aBufferRect;
mBufferRotation = aBufferRotation;
return tmp.forget();
}
TemporaryRef<gfx::DrawTarget>
SetDTBufferOnWhite(gfx::DrawTarget* aBuffer)
{
MOZ_ASSERT(SupportsAzureContent());
RefPtr<gfx::DrawTarget> tmp = mDTBufferOnWhite.forget();
mDTBufferOnWhite = aBuffer;
return tmp.forget();
}
/**
* Set the texture client only. This is used with surfaces that
* require explicit lock/unlock, which |aClient| is used to do on

View File

@ -545,23 +545,42 @@ ContentClientSingleBuffered::SyncFrontBufferToBackBuffer()
return;
}
gfxASurface* backBuffer = GetBuffer();
if (!backBuffer && mDeprecatedTextureClient) {
backBuffer = mDeprecatedTextureClient->LockSurface();
if (SupportsAzureContent()) {
DrawTarget* backBuffer = GetDTBuffer();
if (!backBuffer && mDeprecatedTextureClient) {
backBuffer = mDeprecatedTextureClient->LockDrawTarget();
}
RefPtr<DrawTarget> oldBuffer;
oldBuffer = SetDTBuffer(backBuffer,
mBufferRect,
mBufferRotation);
backBuffer = GetDTBufferOnWhite();
if (!backBuffer && mDeprecatedTextureClientOnWhite) {
backBuffer = mDeprecatedTextureClientOnWhite->LockDrawTarget();
}
oldBuffer = SetDTBufferOnWhite(backBuffer);
} else {
gfxASurface* backBuffer = GetBuffer();
if (!backBuffer && mDeprecatedTextureClient) {
backBuffer = mDeprecatedTextureClient->LockSurface();
}
nsRefPtr<gfxASurface> oldBuffer;
oldBuffer = SetBuffer(backBuffer,
mBufferRect,
mBufferRotation);
backBuffer = GetBufferOnWhite();
if (!backBuffer && mDeprecatedTextureClientOnWhite) {
backBuffer = mDeprecatedTextureClientOnWhite->LockSurface();
}
oldBuffer = SetBufferOnWhite(backBuffer);
}
nsRefPtr<gfxASurface> oldBuffer;
oldBuffer = SetBuffer(backBuffer,
mBufferRect,
mBufferRotation);
backBuffer = GetBufferOnWhite();
if (!backBuffer && mDeprecatedTextureClientOnWhite) {
backBuffer = mDeprecatedTextureClientOnWhite->LockSurface();
}
oldBuffer = SetBufferOnWhite(backBuffer);
mIsNewBuffer = false;
mFrontAndBackBufferDiffer = false;
}