Bug 1262681 - Draw target also has to be valid for us to demand a snapshot. r=bas

This commit is contained in:
Milan Sreckovic
2016-04-13 09:56:00 +02:00
parent 6d8586f214
commit dcff01cc7f
2 changed files with 31 additions and 18 deletions

View File

@@ -99,6 +99,11 @@ RotatedBuffer::DrawBufferQuadrant(gfx::DrawTarget* aTarget,
MOZ_ASSERT(aSource != BUFFER_BOTH); MOZ_ASSERT(aSource != BUFFER_BOTH);
RefPtr<SourceSurface> snapshot = GetSourceSurface(aSource); RefPtr<SourceSurface> snapshot = GetSourceSurface(aSource);
if (!snapshot) {
gfxCriticalError() << "Invalid snapshot in RotatedBuffer::DrawBufferQuadrant";
return;
}
// direct2d is much slower when using OP_SOURCE so use OP_OVER and // direct2d is much slower when using OP_SOURCE so use OP_OVER and
// (maybe) a clear instead. Normally we need to draw in a single operation // (maybe) a clear instead. Normally we need to draw in a single operation
// (to avoid flickering) but direct2d is ok since it defers rendering. // (to avoid flickering) but direct2d is ok since it defers rendering.
@@ -275,7 +280,7 @@ RotatedContentBuffer::BorrowDrawTargetForQuadrantUpdate(const IntRect& aBounds,
if (!EnsureBufferOnWhite()) { if (!EnsureBufferOnWhite()) {
return nullptr; return nullptr;
} }
MOZ_ASSERT(mDTBuffer && mDTBufferOnWhite); MOZ_ASSERT(mDTBuffer && mDTBuffer->IsValid() && mDTBufferOnWhite && mDTBufferOnWhite->IsValid());
mLoanedDrawTarget = Factory::CreateDualDrawTarget(mDTBuffer, mDTBufferOnWhite); mLoanedDrawTarget = Factory::CreateDualDrawTarget(mDTBuffer, mDTBufferOnWhite);
} else if (aSource == BUFFER_WHITE) { } else if (aSource == BUFFER_WHITE) {
if (!EnsureBufferOnWhite()) { if (!EnsureBufferOnWhite()) {
@@ -318,12 +323,12 @@ BorrowDrawTarget::ReturnDrawTarget(gfx::DrawTarget*& aReturned)
gfxContentType gfxContentType
RotatedContentBuffer::BufferContentType() RotatedContentBuffer::BufferContentType()
{ {
if (mBufferProvider || mDTBuffer) { if (mBufferProvider || (mDTBuffer && mDTBuffer->IsValid())) {
SurfaceFormat format; SurfaceFormat format = SurfaceFormat::B8G8R8A8;
if (mBufferProvider) { if (mBufferProvider) {
format = mBufferProvider->GetFormat(); format = mBufferProvider->GetFormat();
} else if (mDTBuffer) { } else if (mDTBuffer && mDTBuffer->IsValid()) {
format = mDTBuffer->GetFormat(); format = mDTBuffer->GetFormat();
} }
@@ -344,13 +349,13 @@ bool
RotatedContentBuffer::EnsureBuffer() RotatedContentBuffer::EnsureBuffer()
{ {
NS_ASSERTION(!mLoanedDrawTarget, "Loaned draw target must be returned"); NS_ASSERTION(!mLoanedDrawTarget, "Loaned draw target must be returned");
if (!mDTBuffer) { if (!mDTBuffer || !mDTBuffer->IsValid()) {
if (mBufferProvider) { if (mBufferProvider) {
mDTBuffer = mBufferProvider->BorrowDrawTarget(); mDTBuffer = mBufferProvider->BorrowDrawTarget();
} }
} }
NS_WARN_IF_FALSE(mDTBuffer, "no buffer"); NS_WARN_IF_FALSE(mDTBuffer && mDTBuffer->IsValid(), "no buffer");
return !!mDTBuffer; return !!mDTBuffer;
} }
@@ -372,13 +377,13 @@ RotatedContentBuffer::EnsureBufferOnWhite()
bool bool
RotatedContentBuffer::HaveBuffer() const RotatedContentBuffer::HaveBuffer() const
{ {
return mDTBuffer || mBufferProvider; return mBufferProvider || (mDTBuffer && mDTBuffer->IsValid());
} }
bool bool
RotatedContentBuffer::HaveBufferOnWhite() const RotatedContentBuffer::HaveBufferOnWhite() const
{ {
return mDTBufferOnWhite || mBufferProviderOnWhite; return mBufferProviderOnWhite || (mDTBufferOnWhite && mDTBufferOnWhite->IsValid());
} }
static void static void
@@ -591,13 +596,13 @@ RotatedContentBuffer::BeginPaint(PaintedLayer* aLayer,
if (mBufferRotation == IntPoint(0,0)) { if (mBufferRotation == IntPoint(0,0)) {
IntRect srcRect(IntPoint(0, 0), mBufferRect.Size()); IntRect srcRect(IntPoint(0, 0), mBufferRect.Size());
IntPoint dest = mBufferRect.TopLeft() - destBufferRect.TopLeft(); IntPoint dest = mBufferRect.TopLeft() - destBufferRect.TopLeft();
MOZ_ASSERT(mDTBuffer); MOZ_ASSERT(mDTBuffer && mDTBuffer->IsValid());
mDTBuffer->CopyRect(srcRect, dest); mDTBuffer->CopyRect(srcRect, dest);
if (mode == SurfaceMode::SURFACE_COMPONENT_ALPHA) { if (mode == SurfaceMode::SURFACE_COMPONENT_ALPHA) {
if (!EnsureBufferOnWhite()) { if (!EnsureBufferOnWhite()) {
return result; return result;
} }
MOZ_ASSERT(mDTBufferOnWhite); MOZ_ASSERT(mDTBufferOnWhite && mDTBufferOnWhite->IsValid());
mDTBufferOnWhite->CopyRect(srcRect, dest); mDTBufferOnWhite->CopyRect(srcRect, dest);
} }
result.mDidSelfCopy = true; result.mDidSelfCopy = true;
@@ -625,7 +630,7 @@ RotatedContentBuffer::BeginPaint(PaintedLayer* aLayer,
if (!EnsureBufferOnWhite()) { if (!EnsureBufferOnWhite()) {
return result; return result;
} }
MOZ_ASSERT(mDTBufferOnWhite); MOZ_ASSERT(mDTBufferOnWhite && mDTBufferOnWhite->IsValid());
mDTBufferOnWhite->LockBits(&data, &size, &stride, &format); mDTBufferOnWhite->LockBits(&data, &size, &stride, &format);
uint8_t bytesPerPixel = BytesPerPixel(format); uint8_t bytesPerPixel = BytesPerPixel(format);
BufferUnrotate(data, BufferUnrotate(data,
@@ -692,7 +697,7 @@ RotatedContentBuffer::BeginPaint(PaintedLayer* aLayer,
if (!EnsureBuffer()) { if (!EnsureBuffer()) {
return result; return result;
} }
MOZ_ASSERT(mDTBuffer, "Have we got a Thebes buffer for some reason?"); MOZ_ASSERT(mDTBuffer && mDTBuffer->IsValid(), "Have we got a Thebes buffer for some reason?");
DrawBufferWithRotation(destDTBuffer, BUFFER_BLACK, 1.0, CompositionOp::OP_SOURCE); DrawBufferWithRotation(destDTBuffer, BUFFER_BLACK, 1.0, CompositionOp::OP_SOURCE);
destDTBuffer->SetTransform(Matrix()); destDTBuffer->SetTransform(Matrix());
@@ -700,7 +705,7 @@ RotatedContentBuffer::BeginPaint(PaintedLayer* aLayer,
if (!destDTBufferOnWhite || !EnsureBufferOnWhite()) { if (!destDTBufferOnWhite || !EnsureBufferOnWhite()) {
return result; return result;
} }
MOZ_ASSERT(mDTBufferOnWhite, "Have we got a Thebes buffer for some reason?"); MOZ_ASSERT(mDTBufferOnWhite && mDTBufferOnWhite->IsValid(), "Have we got a Thebes buffer for some reason?");
destDTBufferOnWhite->SetTransform(mat); destDTBufferOnWhite->SetTransform(mat);
DrawBufferWithRotation(destDTBufferOnWhite, BUFFER_WHITE, 1.0, CompositionOp::OP_SOURCE); DrawBufferWithRotation(destDTBufferOnWhite, BUFFER_WHITE, 1.0, CompositionOp::OP_SOURCE);
destDTBufferOnWhite->SetTransform(Matrix()); destDTBufferOnWhite->SetTransform(Matrix());
@@ -753,7 +758,8 @@ RotatedContentBuffer::BorrowDrawTargetForPainting(PaintState& aPaintState,
} }
if (aPaintState.mMode == SurfaceMode::SURFACE_COMPONENT_ALPHA) { if (aPaintState.mMode == SurfaceMode::SURFACE_COMPONENT_ALPHA) {
if (!mDTBuffer || !mDTBufferOnWhite) { if (!mDTBuffer || !mDTBuffer->IsValid() ||
!mDTBufferOnWhite || !mDTBufferOnWhite->IsValid()) {
// This can happen in release builds if allocating one of the two buffers // This can happen in release builds if allocating one of the two buffers
// failed. This in turn can happen if unreasonably large textures are // failed. This in turn can happen if unreasonably large textures are
// requested. // requested.
@@ -780,11 +786,18 @@ RotatedContentBuffer::BorrowDrawTargetForPainting(PaintState& aPaintState,
already_AddRefed<SourceSurface> already_AddRefed<SourceSurface>
RotatedContentBuffer::GetSourceSurface(ContextSource aSource) const RotatedContentBuffer::GetSourceSurface(ContextSource aSource) const
{ {
MOZ_ASSERT(mDTBuffer); if (!mDTBuffer || !mDTBuffer->IsValid()) {
gfxCriticalNote << "Invalid buffer in RotatedContentBuffer::GetSourceSurface " << gfx::hexa(mDTBuffer);
return nullptr;
}
if (aSource == BUFFER_BLACK) { if (aSource == BUFFER_BLACK) {
return mDTBuffer->Snapshot(); return mDTBuffer->Snapshot();
} else { } else {
MOZ_ASSERT(mDTBufferOnWhite); if (!mDTBufferOnWhite || !mDTBufferOnWhite->IsValid()) {
gfxCriticalNote << "Invalid buffer on white in RotatedContentBuffer::GetSourceSurface " << gfx::hexa(mDTBufferOnWhite);
return nullptr;
}
MOZ_ASSERT(aSource == BUFFER_WHITE); MOZ_ASSERT(aSource == BUFFER_WHITE);
return mDTBufferOnWhite->Snapshot(); return mDTBufferOnWhite->Snapshot();
} }

View File

@@ -339,7 +339,7 @@ protected:
{ {
// Only this buffer provider can give us a buffer. If we // Only this buffer provider can give us a buffer. If we
// already have one, something has gone wrong. // already have one, something has gone wrong.
MOZ_ASSERT(!aClient || !mDTBuffer); MOZ_ASSERT(!aClient || !mDTBuffer || !mDTBuffer->IsValid());
mBufferProvider = aClient; mBufferProvider = aClient;
if (!mBufferProvider) { if (!mBufferProvider) {
@@ -351,7 +351,7 @@ protected:
{ {
// Only this buffer provider can give us a buffer. If we // Only this buffer provider can give us a buffer. If we
// already have one, something has gone wrong. // already have one, something has gone wrong.
MOZ_ASSERT(!aClient || !mDTBufferOnWhite); MOZ_ASSERT(!aClient || !mDTBufferOnWhite || !mDTBufferOnWhite->IsValid());
mBufferProviderOnWhite = aClient; mBufferProviderOnWhite = aClient;
if (!mBufferProviderOnWhite) { if (!mBufferProviderOnWhite) {