зеркало из 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()
|
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,
|
||||||
|
|
Загрузка…
Ссылка в новой задаче