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()
{
#if defined(MOZ_WIDGET_GONK) && ANDROID_VERSION >= 17
if (mCompositable && mTexture && mCompositable->IsConnected()) {
// remove old buffer from CompositableHost
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) {
mTexture->RemoveFromCompositable(mCompositable);
mCompositable->RemoveTexture(mTexture);
}
#endif
}
} // namespace layers

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

@ -448,31 +448,13 @@ ContentClientDoubleBuffered::Updated(const nsIntRegion& aRegionToDraw,
{
ContentClientRemoteBuffer::Updated(aRegionToDraw, aVisibleRegion, aDidSelfCopy);
#if defined(MOZ_WIDGET_GONK) && ANDROID_VERSION >= 17
if (mFrontClient) {
// remove old buffer from CompositableHost
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);
mFrontClient->RemoveFromCompositable(this);
}
if (mFrontClientOnWhite) {
// remove old buffer from CompositableHost
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);
mFrontClientOnWhite->RemoveFromCompositable(this);
}
#endif
}
void

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

@ -951,6 +951,30 @@ bool TextureClient::CopyToTextureClient(TextureClient* aTarget,
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
TextureClient::SetRemoveFromCompositableWaiter(AsyncTransactionWaiter* aWaiter) {
mRemoveFromCompositableWaiter = aWaiter;

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

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

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

@ -569,22 +569,15 @@ TileClient::Dump(std::stringstream& aStream)
void
TileClient::Flip()
{
#if defined(MOZ_WIDGET_GONK) && ANDROID_VERSION >= 17
if (mFrontBuffer && mFrontBuffer->GetIPDLActor() &&
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);
if (mCompositableClient) {
if (mFrontBuffer) {
mFrontBuffer->RemoveFromCompositable(mCompositableClient);
}
if (mFrontBufferOnWhite) {
mFrontBufferOnWhite->RemoveFromCompositable(mCompositableClient);
}
}
#endif
RefPtr<TextureClient> frontBuffer = mFrontBuffer;
RefPtr<TextureClient> frontBufferOnWhite = mFrontBufferOnWhite;
mFrontBuffer = mBackBuffer;
@ -667,25 +660,14 @@ TileClient::DiscardFrontBuffer()
{
if (mFrontBuffer) {
MOZ_ASSERT(mFrontLock);
#if defined(MOZ_WIDGET_GONK) && ANDROID_VERSION >= 17
MOZ_ASSERT(!mFrontBufferOnWhite);
if (mFrontBuffer->GetIPDLActor() &&
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);
if (mCompositableClient) {
mFrontBuffer->RemoveFromCompositable(mCompositableClient);
}
#endif
mAllocator->ReturnTextureClientDeferred(mFrontBuffer);
if (mFrontBufferOnWhite) {
mFrontBufferOnWhite->RemoveFromCompositable(mCompositableClient);
mAllocator->ReturnTextureClientDeferred(mFrontBufferOnWhite);
}
mFrontLock->ReadUnlock();

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

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