Back out 0736b014d4a5 (Bug 610155) for breaking canvas reftests on android
This commit is contained in:
@@ -56,9 +56,6 @@
|
||||
#include "ThebesLayerBuffer.h"
|
||||
#include "nsIWidget.h"
|
||||
#include "ReadbackProcessor.h"
|
||||
#ifdef MOZ_X11
|
||||
#include "gfxXlibSurface.h"
|
||||
#endif
|
||||
|
||||
#include "GLContext.h"
|
||||
|
||||
@@ -1627,6 +1624,12 @@ public:
|
||||
mShadow = aShadow;
|
||||
}
|
||||
|
||||
virtual void SetBackBufferImage(gfxSharedImageSurface* aBuffer)
|
||||
{
|
||||
NS_RUNTIMEABORT("if this default impl is called, |aBuffer| leaks");
|
||||
}
|
||||
|
||||
virtual PRBool SupportsSurfaceDescriptor() const { return PR_FALSE; }
|
||||
virtual void SetBackBuffer(const SurfaceDescriptor& aBuffer)
|
||||
{
|
||||
NS_RUNTIMEABORT("if this default impl is called, |aBuffer| leaks");
|
||||
@@ -1732,6 +1735,12 @@ BasicShadowableContainerLayer::RemoveChild(Layer* aChild)
|
||||
BasicContainerLayer::RemoveChild(aChild);
|
||||
}
|
||||
|
||||
static PRBool
|
||||
IsSurfaceDescriptorValid(const SurfaceDescriptor& aSurface)
|
||||
{
|
||||
return SurfaceDescriptor::T__None != aSurface.type();
|
||||
}
|
||||
|
||||
class BasicShadowableThebesLayer : public BasicThebesLayer,
|
||||
public BasicShadowableLayer
|
||||
{
|
||||
@@ -1761,6 +1770,8 @@ public:
|
||||
virtual ShadowableLayer* AsShadowableLayer() { return this; }
|
||||
virtual bool MustRetainContent() { return HasShadow(); }
|
||||
|
||||
virtual PRBool SupportsSurfaceDescriptor() const { return PR_TRUE; }
|
||||
|
||||
void SetBackBufferAndAttrs(const ThebesBuffer& aBuffer,
|
||||
const nsIntRegion& aValidRegion,
|
||||
float aXResolution, float aYResolution,
|
||||
@@ -1944,8 +1955,8 @@ public:
|
||||
}
|
||||
virtual ~BasicShadowableImageLayer()
|
||||
{
|
||||
if (IsSurfaceDescriptorValid(mBackBuffer)) {
|
||||
BasicManager()->ShadowLayerForwarder::DestroySharedSurface(&mBackBuffer);
|
||||
if (mBackSurface) {
|
||||
BasicManager()->ShadowLayerForwarder::DestroySharedSurface(mBackSurface);
|
||||
}
|
||||
MOZ_COUNT_DTOR(BasicShadowableImageLayer);
|
||||
}
|
||||
@@ -1960,14 +1971,14 @@ public:
|
||||
virtual Layer* AsLayer() { return this; }
|
||||
virtual ShadowableLayer* AsShadowableLayer() { return this; }
|
||||
|
||||
virtual void SetBackBuffer(const SurfaceDescriptor& aBuffer)
|
||||
virtual void SetBackBufferImage(gfxSharedImageSurface* aBuffer)
|
||||
{
|
||||
mBackBuffer = aBuffer;
|
||||
mBackSurface = aBuffer;
|
||||
}
|
||||
|
||||
virtual void Disconnect()
|
||||
{
|
||||
mBackBuffer = SurfaceDescriptor();
|
||||
mBackSurface = nsnull;
|
||||
BasicShadowableLayer::Disconnect();
|
||||
}
|
||||
|
||||
@@ -1977,7 +1988,7 @@ private:
|
||||
return static_cast<BasicShadowLayerManager*>(mManager);
|
||||
}
|
||||
|
||||
SurfaceDescriptor mBackBuffer;
|
||||
nsRefPtr<gfxSharedImageSurface> mBackSurface;
|
||||
};
|
||||
|
||||
void
|
||||
@@ -1989,18 +2000,20 @@ BasicShadowableImageLayer::Paint(gfxContext* aContext)
|
||||
return;
|
||||
|
||||
if (oldSize != mSize) {
|
||||
if (IsSurfaceDescriptorValid(mBackBuffer)) {
|
||||
if (mBackSurface) {
|
||||
BasicManager()->ShadowLayerForwarder::DestroySharedSurface(mBackSurface);
|
||||
mBackSurface = nsnull;
|
||||
|
||||
BasicManager()->DestroyedImageBuffer(BasicManager()->Hold(this));
|
||||
BasicManager()->ShadowLayerForwarder::DestroySharedSurface(&mBackBuffer);
|
||||
}
|
||||
|
||||
SurfaceDescriptor tmpFrontSurface;
|
||||
nsRefPtr<gfxSharedImageSurface> tmpFrontSurface;
|
||||
// XXX error handling?
|
||||
if (!BasicManager()->AllocDoubleBuffer(
|
||||
mSize,
|
||||
(GetContentFlags() & CONTENT_OPAQUE) ?
|
||||
gfxASurface::CONTENT_COLOR : gfxASurface::CONTENT_COLOR_ALPHA,
|
||||
&tmpFrontSurface, &mBackBuffer))
|
||||
getter_AddRefs(tmpFrontSurface), getter_AddRefs(mBackSurface)))
|
||||
NS_RUNTIMEABORT("creating ImageLayer 'front buffer' failed!");
|
||||
|
||||
BasicManager()->CreatedImageBuffer(BasicManager()->Hold(this),
|
||||
@@ -2008,15 +2021,13 @@ BasicShadowableImageLayer::Paint(gfxContext* aContext)
|
||||
tmpFrontSurface);
|
||||
}
|
||||
|
||||
nsRefPtr<gfxASurface> backSurface =
|
||||
BasicManager()->OpenDescriptor(mBackBuffer);
|
||||
nsRefPtr<gfxContext> tmpCtx = new gfxContext(backSurface);
|
||||
nsRefPtr<gfxContext> tmpCtx = new gfxContext(mBackSurface);
|
||||
PaintContext(pat,
|
||||
nsIntRegion(nsIntRect(0, 0, mSize.width, mSize.height)),
|
||||
nsnull, 1.0, tmpCtx);
|
||||
|
||||
BasicManager()->PaintedImage(BasicManager()->Hold(this),
|
||||
mBackBuffer);
|
||||
mBackSurface);
|
||||
}
|
||||
|
||||
|
||||
@@ -2059,8 +2070,8 @@ public:
|
||||
}
|
||||
virtual ~BasicShadowableCanvasLayer()
|
||||
{
|
||||
if (IsSurfaceDescriptorValid(mBackBuffer)) {
|
||||
BasicManager()->ShadowLayerForwarder::DestroySharedSurface(&mBackBuffer);
|
||||
if (mBackBuffer) {
|
||||
BasicManager()->ShadowLayerForwarder::DestroySharedSurface(mBackBuffer);
|
||||
}
|
||||
MOZ_COUNT_DTOR(BasicShadowableCanvasLayer);
|
||||
}
|
||||
@@ -2076,14 +2087,14 @@ public:
|
||||
virtual Layer* AsLayer() { return this; }
|
||||
virtual ShadowableLayer* AsShadowableLayer() { return this; }
|
||||
|
||||
virtual void SetBackBuffer(const SurfaceDescriptor& aBuffer)
|
||||
virtual void SetBackBufferImage(gfxSharedImageSurface* aBuffer)
|
||||
{
|
||||
mBackBuffer = aBuffer;
|
||||
}
|
||||
|
||||
|
||||
virtual void Disconnect()
|
||||
{
|
||||
mBackBuffer = SurfaceDescriptor();
|
||||
mBackBuffer = nsnull;
|
||||
BasicShadowableLayer::Disconnect();
|
||||
}
|
||||
|
||||
@@ -2093,7 +2104,7 @@ private:
|
||||
return static_cast<BasicShadowLayerManager*>(mManager);
|
||||
}
|
||||
|
||||
SurfaceDescriptor mBackBuffer;
|
||||
nsRefPtr<gfxSharedImageSurface> mBackBuffer;
|
||||
};
|
||||
|
||||
void
|
||||
@@ -2105,20 +2116,20 @@ BasicShadowableCanvasLayer::Initialize(const Data& aData)
|
||||
|
||||
// XXX won't get here currently; need to figure out what to do on
|
||||
// canvas resizes
|
||||
|
||||
if (IsSurfaceDescriptorValid(mBackBuffer)) {
|
||||
BasicManager()->ShadowLayerForwarder::DestroySharedSurface(&mBackBuffer);
|
||||
if (mBackBuffer) {
|
||||
BasicManager()->ShadowLayerForwarder::DestroySharedSurface(mBackBuffer);
|
||||
mBackBuffer = nsnull;
|
||||
|
||||
BasicManager()->DestroyedCanvasBuffer(BasicManager()->Hold(this));
|
||||
}
|
||||
|
||||
SurfaceDescriptor tmpFrontBuffer;
|
||||
nsRefPtr<gfxSharedImageSurface> tmpFrontBuffer;
|
||||
// XXX error handling?
|
||||
if (!BasicManager()->AllocDoubleBuffer(
|
||||
gfxIntSize(aData.mSize.width, aData.mSize.height),
|
||||
(GetContentFlags() & CONTENT_OPAQUE) ?
|
||||
gfxASurface::CONTENT_COLOR : gfxASurface::CONTENT_COLOR_ALPHA,
|
||||
&tmpFrontBuffer, &mBackBuffer))
|
||||
getter_AddRefs(tmpFrontBuffer), getter_AddRefs(mBackBuffer)))
|
||||
NS_RUNTIMEABORT("creating CanvasLayer back buffer failed!");
|
||||
|
||||
BasicManager()->CreatedCanvasBuffer(BasicManager()->Hold(this),
|
||||
@@ -2138,9 +2149,7 @@ BasicShadowableCanvasLayer::Paint(gfxContext* aContext)
|
||||
// changed areas, much like we do for Thebes layers, as well as
|
||||
// do all sorts of magic to swap out the surface underneath the
|
||||
// canvas' thebes/cairo context.
|
||||
nsRefPtr<gfxASurface> backSurface =
|
||||
BasicManager()->OpenDescriptor(mBackBuffer);
|
||||
nsRefPtr<gfxContext> tmpCtx = new gfxContext(backSurface);
|
||||
nsRefPtr<gfxContext> tmpCtx = new gfxContext(mBackBuffer);
|
||||
tmpCtx->SetOperator(gfxContext::OPERATOR_SOURCE);
|
||||
|
||||
// call BasicCanvasLayer::Paint to draw to our tmp context, because
|
||||
@@ -2433,15 +2442,17 @@ public:
|
||||
ShadowImageLayer::Disconnect();
|
||||
}
|
||||
|
||||
virtual PRBool Init(const SurfaceDescriptor& front, const nsIntSize& size);
|
||||
virtual PRBool Init(gfxSharedImageSurface* front, const nsIntSize& size);
|
||||
|
||||
virtual void Swap(const SurfaceDescriptor& aNewFront, SurfaceDescriptor* aNewBack);
|
||||
virtual already_AddRefed<gfxSharedImageSurface>
|
||||
Swap(gfxSharedImageSurface* newFront);
|
||||
|
||||
virtual void DestroyFrontBuffer()
|
||||
{
|
||||
if (IsSurfaceDescriptorValid(mFrontBuffer)) {
|
||||
BasicManager()->ShadowLayerManager::DestroySharedSurface(&mFrontBuffer, mAllocator);
|
||||
if (mFrontSurface) {
|
||||
BasicManager()->ShadowLayerManager::DestroySharedSurface(mFrontSurface, mAllocator);
|
||||
}
|
||||
mFrontSurface = nsnull;
|
||||
}
|
||||
|
||||
virtual void Paint(gfxContext* aContext);
|
||||
@@ -2452,36 +2463,36 @@ protected:
|
||||
return static_cast<BasicShadowLayerManager*>(mManager);
|
||||
}
|
||||
|
||||
SurfaceDescriptor mFrontBuffer;
|
||||
// XXX ShmemImage?
|
||||
nsRefPtr<gfxSharedImageSurface> mFrontSurface;
|
||||
gfxIntSize mSize;
|
||||
};
|
||||
|
||||
PRBool
|
||||
BasicShadowImageLayer::Init(const SurfaceDescriptor& front,
|
||||
BasicShadowImageLayer::Init(gfxSharedImageSurface* front,
|
||||
const nsIntSize& size)
|
||||
{
|
||||
mFrontBuffer = front;
|
||||
mFrontSurface = front;
|
||||
mSize = gfxIntSize(size.width, size.height);
|
||||
return PR_TRUE;
|
||||
}
|
||||
|
||||
void
|
||||
BasicShadowImageLayer::Swap(const SurfaceDescriptor& aNewFront, SurfaceDescriptor* aNewBack)
|
||||
already_AddRefed<gfxSharedImageSurface>
|
||||
BasicShadowImageLayer::Swap(gfxSharedImageSurface* newFront)
|
||||
{
|
||||
*aNewBack = mFrontBuffer;
|
||||
mFrontBuffer = aNewFront;
|
||||
already_AddRefed<gfxSharedImageSurface> tmp = mFrontSurface.forget();
|
||||
mFrontSurface = newFront;
|
||||
return tmp;
|
||||
}
|
||||
|
||||
void
|
||||
BasicShadowImageLayer::Paint(gfxContext* aContext)
|
||||
{
|
||||
if (!IsSurfaceDescriptorValid(mFrontBuffer)) {
|
||||
if (!mFrontSurface) {
|
||||
return;
|
||||
}
|
||||
|
||||
nsRefPtr<gfxASurface> surface =
|
||||
BasicManager()->OpenDescriptor(mFrontBuffer);
|
||||
nsRefPtr<gfxPattern> pat = new gfxPattern(surface);
|
||||
nsRefPtr<gfxPattern> pat = new gfxPattern(mFrontSurface);
|
||||
pat->SetFilter(mFilter);
|
||||
|
||||
// The visible region can extend outside the image. If we're not
|
||||
@@ -2535,15 +2546,16 @@ public:
|
||||
}
|
||||
|
||||
virtual void Initialize(const Data& aData);
|
||||
virtual void Init(const SurfaceDescriptor& aNewFront, const nsIntSize& aSize);
|
||||
|
||||
void Swap(const SurfaceDescriptor& aNewFront, SurfaceDescriptor* aNewBack);
|
||||
virtual already_AddRefed<gfxSharedImageSurface>
|
||||
Swap(gfxSharedImageSurface* newFront);
|
||||
|
||||
virtual void DestroyFrontBuffer()
|
||||
{
|
||||
if (IsSurfaceDescriptorValid(mFrontSurface)) {
|
||||
BasicManager()->ShadowLayerManager::DestroySharedSurface(&mFrontSurface, mAllocator);
|
||||
if (mFrontSurface) {
|
||||
BasicManager()->ShadowLayerManager::DestroySharedSurface(mFrontSurface, mAllocator);
|
||||
}
|
||||
mFrontSurface = nsnull;
|
||||
}
|
||||
|
||||
virtual void Paint(gfxContext* aContext);
|
||||
@@ -2554,28 +2566,27 @@ private:
|
||||
return static_cast<BasicShadowLayerManager*>(mManager);
|
||||
}
|
||||
|
||||
SurfaceDescriptor mFrontSurface;
|
||||
nsRefPtr<gfxSharedImageSurface> mFrontSurface;
|
||||
};
|
||||
|
||||
|
||||
void
|
||||
BasicShadowCanvasLayer::Initialize(const Data& aData)
|
||||
{
|
||||
NS_RUNTIMEABORT("Incompatibe surface type");
|
||||
NS_ASSERTION(mFrontSurface == nsnull,
|
||||
"BasicCanvasLayer::Initialize called twice!");
|
||||
NS_ASSERTION(aData.mSurface && !aData.mGLContext, "no comprende OpenGL!");
|
||||
|
||||
mFrontSurface = static_cast<gfxSharedImageSurface*>(aData.mSurface);
|
||||
mBounds.SetRect(0, 0, aData.mSize.width, aData.mSize.height);
|
||||
}
|
||||
|
||||
void
|
||||
BasicShadowCanvasLayer::Init(const SurfaceDescriptor& aNewFront, const nsIntSize& aSize)
|
||||
already_AddRefed<gfxSharedImageSurface>
|
||||
BasicShadowCanvasLayer::Swap(gfxSharedImageSurface* newFront)
|
||||
{
|
||||
mFrontSurface = aNewFront;
|
||||
mBounds.SetRect(0, 0, aSize.width, aSize.height);
|
||||
}
|
||||
|
||||
void
|
||||
BasicShadowCanvasLayer::Swap(const SurfaceDescriptor& aNewFront, SurfaceDescriptor* aNewBack)
|
||||
{
|
||||
*aNewBack = mFrontSurface;
|
||||
mFrontSurface = aNewFront;
|
||||
already_AddRefed<gfxSharedImageSurface> tmp = mFrontSurface.forget();
|
||||
mFrontSurface = newFront;
|
||||
return tmp;
|
||||
}
|
||||
|
||||
void
|
||||
@@ -2584,13 +2595,11 @@ BasicShadowCanvasLayer::Paint(gfxContext* aContext)
|
||||
NS_ASSERTION(BasicManager()->InDrawing(),
|
||||
"Can only draw in drawing phase");
|
||||
|
||||
if (IsSurfaceDescriptorValid(mFrontSurface)) {
|
||||
if (!mFrontSurface) {
|
||||
return;
|
||||
}
|
||||
|
||||
nsRefPtr<gfxASurface> surface =
|
||||
BasicManager()->OpenDescriptor(mFrontSurface);
|
||||
nsRefPtr<gfxPattern> pat = new gfxPattern(surface);
|
||||
nsRefPtr<gfxPattern> pat = new gfxPattern(mFrontSurface);
|
||||
|
||||
pat->SetFilter(mFilter);
|
||||
pat->SetExtend(gfxPattern::EXTEND_PAD);
|
||||
@@ -2821,7 +2830,17 @@ BasicShadowLayerManager::ForwardTransaction()
|
||||
|
||||
const OpBufferSwap& obs = reply.get_OpBufferSwap();
|
||||
const SurfaceDescriptor& descr = obs.newBackBuffer();
|
||||
GetBasicShadowable(obs)->SetBackBuffer(descr);
|
||||
BasicShadowableLayer* layer = GetBasicShadowable(obs);
|
||||
if (layer->SupportsSurfaceDescriptor()) {
|
||||
layer->SetBackBuffer(descr);
|
||||
} else {
|
||||
if (SurfaceDescriptor::TShmem != descr.type()) {
|
||||
NS_RUNTIMEABORT("non-Shmem surface sent to a layer that expected one!");
|
||||
}
|
||||
nsRefPtr<gfxASurface> imageSurf = OpenDescriptor(descr);
|
||||
layer->SetBackBufferImage(
|
||||
static_cast<gfxSharedImageSurface*>(imageSurf.get()));
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user