зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1250117 - Fix b2g timeouts when gralloc is disabled. r=sotaro
This commit is contained in:
Родитель
c29791aa23
Коммит
18b7c7e2dc
|
@ -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,
|
||||
|
|
Загрузка…
Ссылка в новой задаче