Bug 1250117 - Fix b2g timeouts when gralloc is disabled. r=sotaro

This commit is contained in:
Nicolas Silva 2016-02-25 09:23:23 +01:00
Родитель c29791aa23
Коммит 18b7c7e2dc
6 изменённых файлов: 48 добавлений и 65 удалений

Просмотреть файл

@ -290,23 +290,10 @@ CompositableClient::DumpTextureClient(std::stringstream& aStream,
AutoRemoveTexture::~AutoRemoveTexture() AutoRemoveTexture::~AutoRemoveTexture()
{ {
#if defined(MOZ_WIDGET_GONK) && ANDROID_VERSION >= 17
if (mCompositable && mTexture && mCompositable->IsConnected()) { if (mCompositable && mTexture && mCompositable->IsConnected()) {
// remove old buffer from CompositableHost mTexture->RemoveFromCompositable(mCompositable);
RefPtr<AsyncTransactionWaiter> waiter = new AsyncTransactionWaiter();
RefPtr<AsyncTransactionTracker> tracker =
new RemoveTextureFromCompositableTracker(waiter);
// Hold TextureClient until transaction complete.
tracker->SetTextureClient(mTexture);
mTexture->SetRemoveFromCompositableWaiter(waiter);
// RemoveTextureFromCompositableAsync() expects CompositorChild's presence.
mCompositable->GetForwarder()->RemoveTextureFromCompositableAsync(tracker, mCompositable, mTexture);
}
#else
if (mCompositable && mTexture) {
mCompositable->RemoveTexture(mTexture); mCompositable->RemoveTexture(mTexture);
} }
#endif
} }
} // namespace layers } // namespace layers

Просмотреть файл

@ -448,31 +448,13 @@ ContentClientDoubleBuffered::Updated(const nsIntRegion& aRegionToDraw,
{ {
ContentClientRemoteBuffer::Updated(aRegionToDraw, aVisibleRegion, aDidSelfCopy); ContentClientRemoteBuffer::Updated(aRegionToDraw, aVisibleRegion, aDidSelfCopy);
#if defined(MOZ_WIDGET_GONK) && ANDROID_VERSION >= 17
if (mFrontClient) { if (mFrontClient) {
// remove old buffer from CompositableHost mFrontClient->RemoveFromCompositable(this);
RefPtr<AsyncTransactionWaiter> waiter = new AsyncTransactionWaiter();
RefPtr<AsyncTransactionTracker> tracker =
new RemoveTextureFromCompositableTracker(waiter);
// Hold TextureClient until transaction complete.
tracker->SetTextureClient(mFrontClient);
mFrontClient->SetRemoveFromCompositableWaiter(waiter);
// RemoveTextureFromCompositableAsync() expects CompositorChild's presence.
GetForwarder()->RemoveTextureFromCompositableAsync(tracker, this, mFrontClient);
} }
if (mFrontClientOnWhite) { if (mFrontClientOnWhite) {
// remove old buffer from CompositableHost mFrontClientOnWhite->RemoveFromCompositable(this);
RefPtr<AsyncTransactionWaiter> waiter = new AsyncTransactionWaiter();
RefPtr<AsyncTransactionTracker> tracker =
new RemoveTextureFromCompositableTracker(waiter);
// Hold TextureClient until transaction complete.
tracker->SetTextureClient(mFrontClientOnWhite);
mFrontClientOnWhite->SetRemoveFromCompositableWaiter(waiter);
// RemoveTextureFromCompositableAsync() expects CompositorChild's presence.
GetForwarder()->RemoveTextureFromCompositableAsync(tracker, this, mFrontClientOnWhite);
} }
#endif
} }
void void

Просмотреть файл

@ -951,6 +951,30 @@ bool TextureClient::CopyToTextureClient(TextureClient* aTarget,
return true; return true;
} }
void
TextureClient::RemoveFromCompositable(CompositableClient* aCompositable,
AsyncTransactionWaiter* aWaiter)
{
MOZ_ASSERT(aCompositable);
#if defined(MOZ_WIDGET_GONK) && ANDROID_VERSION >= 17
if (GetIPDLActor() && aCompositable->GetIPDLActor()
&& mData->AsGrallocTextureData()) {
// remove old buffer from CompositableHost
RefPtr<AsyncTransactionWaiter> waiter = waiter ? waiter
: new AsyncTransactionWaiter();
RefPtr<AsyncTransactionTracker> tracker =
new RemoveTextureFromCompositableTracker(waiter);
// Hold TextureClient until transaction complete.
tracker->SetTextureClient(this);
mRemoveFromCompositableWaiter = waiter;
// RemoveTextureFromCompositableAsync() expects CompositorChild's presence.
GetForwarder()->RemoveTextureFromCompositableAsync(tracker, aCompositable, this);
}
#endif
}
void void
TextureClient::SetRemoveFromCompositableWaiter(AsyncTransactionWaiter* aWaiter) { TextureClient::SetRemoveFromCompositableWaiter(AsyncTransactionWaiter* aWaiter) {
mRemoveFromCompositableWaiter = aWaiter; mRemoveFromCompositableWaiter = aWaiter;

Просмотреть файл

@ -47,6 +47,7 @@ namespace layers {
class AsyncTransactionWaiter; class AsyncTransactionWaiter;
class CompositableForwarder; class CompositableForwarder;
class GrallocTextureData;
class ISurfaceAllocator; class ISurfaceAllocator;
class CompositableClient; class CompositableClient;
struct PlanarYCbCrData; struct PlanarYCbCrData;
@ -231,6 +232,8 @@ public:
return nullptr; return nullptr;
} }
#endif #endif
virtual GrallocTextureData* AsGrallocTextureData() { return nullptr; }
}; };
/** /**
@ -577,6 +580,9 @@ public:
TextureData* GetInternalData() { return mData; } TextureData* GetInternalData() { return mData; }
const TextureData* GetInternalData() const { return mData; } const TextureData* GetInternalData() const { return mData; }
virtual void RemoveFromCompositable(CompositableClient* aCompositable,
AsyncTransactionWaiter* aWaiter = nullptr);
private: private:
static void TextureClientRecycleCallback(TextureClient* aClient, void* aClosure); static void TextureClientRecycleCallback(TextureClient* aClient, void* aClosure);

Просмотреть файл

@ -569,22 +569,15 @@ TileClient::Dump(std::stringstream& aStream)
void void
TileClient::Flip() TileClient::Flip()
{ {
#if defined(MOZ_WIDGET_GONK) && ANDROID_VERSION >= 17 if (mCompositableClient) {
if (mFrontBuffer && mFrontBuffer->GetIPDLActor() && if (mFrontBuffer) {
mCompositableClient && mCompositableClient->GetIPDLActor()) { mFrontBuffer->RemoveFromCompositable(mCompositableClient);
// remove old buffer from CompositableHost }
RefPtr<AsyncTransactionWaiter> waiter = new AsyncTransactionWaiter(); if (mFrontBufferOnWhite) {
RefPtr<AsyncTransactionTracker> tracker = mFrontBufferOnWhite->RemoveFromCompositable(mCompositableClient);
new RemoveTextureFromCompositableTracker(waiter); }
// Hold TextureClient until transaction complete.
tracker->SetTextureClient(mFrontBuffer);
mFrontBuffer->SetRemoveFromCompositableWaiter(waiter);
// RemoveTextureFromCompositableAsync() expects CompositorChild's presence.
mManager->AsShadowForwarder()->RemoveTextureFromCompositableAsync(tracker,
mCompositableClient,
mFrontBuffer);
} }
#endif
RefPtr<TextureClient> frontBuffer = mFrontBuffer; RefPtr<TextureClient> frontBuffer = mFrontBuffer;
RefPtr<TextureClient> frontBufferOnWhite = mFrontBufferOnWhite; RefPtr<TextureClient> frontBufferOnWhite = mFrontBufferOnWhite;
mFrontBuffer = mBackBuffer; mFrontBuffer = mBackBuffer;
@ -667,25 +660,14 @@ TileClient::DiscardFrontBuffer()
{ {
if (mFrontBuffer) { if (mFrontBuffer) {
MOZ_ASSERT(mFrontLock); MOZ_ASSERT(mFrontLock);
#if defined(MOZ_WIDGET_GONK) && ANDROID_VERSION >= 17
MOZ_ASSERT(!mFrontBufferOnWhite); if (mCompositableClient) {
if (mFrontBuffer->GetIPDLActor() && mFrontBuffer->RemoveFromCompositable(mCompositableClient);
mCompositableClient && mCompositableClient->GetIPDLActor()) {
// remove old buffer from CompositableHost
RefPtr<AsyncTransactionWaiter> waiter = new AsyncTransactionWaiter();
RefPtr<AsyncTransactionTracker> tracker =
new RemoveTextureFromCompositableTracker(waiter);
// Hold TextureClient until transaction complete.
tracker->SetTextureClient(mFrontBuffer);
mFrontBuffer->SetRemoveFromCompositableWaiter(waiter);
// RemoveTextureFromCompositableAsync() expects CompositorChild's presence.
mManager->AsShadowForwarder()->RemoveTextureFromCompositableAsync(tracker,
mCompositableClient,
mFrontBuffer);
} }
#endif
mAllocator->ReturnTextureClientDeferred(mFrontBuffer); mAllocator->ReturnTextureClientDeferred(mFrontBuffer);
if (mFrontBufferOnWhite) { if (mFrontBufferOnWhite) {
mFrontBufferOnWhite->RemoveFromCompositable(mCompositableClient);
mAllocator->ReturnTextureClientDeferred(mFrontBufferOnWhite); mAllocator->ReturnTextureClientDeferred(mFrontBufferOnWhite);
} }
mFrontLock->ReadUnlock(); mFrontLock->ReadUnlock();

Просмотреть файл

@ -109,6 +109,8 @@ public:
virtual TextureFlags GetTextureFlags() const override; virtual TextureFlags GetTextureFlags() const override;
virtual GrallocTextureData* AsGrallocTextureData() { return this; }
protected: protected:
GrallocTextureData(MaybeMagicGrallocBufferHandle aGrallocHandle, GrallocTextureData(MaybeMagicGrallocBufferHandle aGrallocHandle,
gfx::IntSize aSize, gfx::SurfaceFormat aFormat, gfx::IntSize aSize, gfx::SurfaceFormat aFormat,