diff --git a/content/media/omx/OmxDecoder.cpp b/content/media/omx/OmxDecoder.cpp index 964e78209ba..acca6e2a856 100644 --- a/content/media/omx/OmxDecoder.cpp +++ b/content/media/omx/OmxDecoder.cpp @@ -15,9 +15,6 @@ #include #include #include -#if MOZ_WIDGET_GONK && ANDROID_VERSION >= 18 -#include -#endif #include "mozilla/Preferences.h" #include "mozilla/Types.h" @@ -216,7 +213,7 @@ VideoGraphicBuffer::Unlock() // The message is delivered to OmxDecoder on ALooper thread. // MediaBuffer::release() could take a very long time. // PostReleaseVideoBuffer() prevents long time locking. - omxDecoder->PostReleaseVideoBuffer(mMediaBuffer, mReleaseFenceHandle); + omxDecoder->PostReleaseVideoBuffer(mMediaBuffer); } else { NS_WARNING("OmxDecoder is not present"); if (mMediaBuffer) { @@ -797,7 +794,7 @@ bool OmxDecoder::ReadVideo(VideoFrame *aFrame, int64_t aTimeUs, { Mutex::Autolock autoLock(mSeekLock); mIsVideoSeeking = false; - PostReleaseVideoBuffer(nullptr, FenceHandle()); + ReleaseAllPendingVideoBuffersLocked(); } aDoSeek = false; @@ -844,9 +841,6 @@ bool OmxDecoder::ReadVideo(VideoFrame *aFrame, int64_t aTimeUs, aFrame->mKeyFrame = keyFrame; aFrame->Y.mWidth = mVideoWidth; aFrame->Y.mHeight = mVideoHeight; - // Release to hold video buffer in OmxDecoder more. - // MediaBuffer's ref count is changed from 2 to 1. - ReleaseVideoBuffer(); } else if (mVideoBuffer->range_length() > 0) { char *data = static_cast(mVideoBuffer->data()) + mVideoBuffer->range_offset(); size_t length = mVideoBuffer->range_length(); @@ -1028,13 +1022,11 @@ void OmxDecoder::onMessageReceived(const sp &msg) } } -void OmxDecoder::PostReleaseVideoBuffer(MediaBuffer *aBuffer, const FenceHandle& aReleaseFenceHandle) +void OmxDecoder::PostReleaseVideoBuffer(MediaBuffer *aBuffer) { { Mutex::Autolock autoLock(mPendingVideoBuffersLock); - if (aBuffer) { - mPendingVideoBuffers.push(BufferItem(aBuffer, aReleaseFenceHandle)); - } + mPendingVideoBuffers.push(aBuffer); } sp notify = @@ -1045,13 +1037,14 @@ void OmxDecoder::PostReleaseVideoBuffer(MediaBuffer *aBuffer, const FenceHandle& void OmxDecoder::ReleaseAllPendingVideoBuffersLocked() { - Vector releasingVideoBuffers; + Vector releasingVideoBuffers; { Mutex::Autolock autoLock(mPendingVideoBuffersLock); int size = mPendingVideoBuffers.size(); for (int i = 0; i < size; i++) { - releasingVideoBuffers.push(mPendingVideoBuffers[i]); + MediaBuffer *buffer = mPendingVideoBuffers[i]; + releasingVideoBuffers.push(buffer); } mPendingVideoBuffers.clear(); } @@ -1059,28 +1052,7 @@ void OmxDecoder::ReleaseAllPendingVideoBuffersLocked() int size = releasingVideoBuffers.size(); for (int i = 0; i < size; i++) { MediaBuffer *buffer; - buffer = releasingVideoBuffers[i].mMediaBuffer; -#if defined(MOZ_WIDGET_GONK) && ANDROID_VERSION >= 18 - android::sp fence; - int fenceFd = -1; - fence = releasingVideoBuffers[i].mReleaseFenceHandle.mFence; - if (fence.get() && fence->isValid()) { - fenceFd = fence->dup(); - } - MOZ_ASSERT(buffer->refcount() == 1); - // This code expect MediaBuffer's ref count is 1. - // Return gralloc buffer to ANativeWindow - ANativeWindow* window = static_cast(mNativeWindowClient.get()); - window->cancelBuffer(window, - buffer->graphicBuffer().get(), - fenceFd); - // Mark MediaBuffer as rendered. - // When gralloc buffer is directly returned to ANativeWindow, - // this mark is necesary. - sp metaData = buffer->meta_data(); - metaData->setInt32(kKeyRendered, 1); -#endif - // Return MediaBuffer to OMXCodec. + buffer = releasingVideoBuffers[i]; buffer->release(); } releasingVideoBuffers.clear(); diff --git a/content/media/omx/OmxDecoder.h b/content/media/omx/OmxDecoder.h index a79d0d5e030..844e5d22302 100644 --- a/content/media/omx/OmxDecoder.h +++ b/content/media/omx/OmxDecoder.h @@ -10,7 +10,6 @@ #include "GonkNativeWindow.h" #include "GonkNativeWindowClient.h" #include "GrallocImages.h" -#include "mozilla/layers/FenceUtils.h" #include "MP3FrameParser.h" #include "MPAPI.h" #include "MediaResource.h" @@ -84,7 +83,6 @@ class OmxDecoder : public OMXCodecProxy::EventListener { typedef mozilla::MP3FrameParser MP3FrameParser; typedef mozilla::MediaResource MediaResource; typedef mozilla::AbstractMediaDecoder AbstractMediaDecoder; - typedef mozilla::layers::FenceHandle FenceHandle; enum { kPreferSoftwareCodecs = 1, @@ -124,26 +122,11 @@ class OmxDecoder : public OMXCodecProxy::EventListener { MediaBuffer *mVideoBuffer; MediaBuffer *mAudioBuffer; - struct BufferItem { - BufferItem() - : mMediaBuffer(nullptr) - { - } - BufferItem(MediaBuffer* aMediaBuffer, const FenceHandle& aReleaseFenceHandle) - : mMediaBuffer(aMediaBuffer) - , mReleaseFenceHandle(aReleaseFenceHandle) { - } - - MediaBuffer* mMediaBuffer; - // a fence will signal when the current buffer is no longer being read. - FenceHandle mReleaseFenceHandle; - }; - // Hold video's MediaBuffers that are released during video seeking. // The holded MediaBuffers are released soon after seek completion. // OMXCodec does not accept MediaBuffer during seeking. If MediaBuffer is // returned to OMXCodec during seeking, OMXCodec calls assert. - Vector mPendingVideoBuffers; + Vector mPendingVideoBuffers; // The lock protects mPendingVideoBuffers. Mutex mPendingVideoBuffersLock; @@ -252,7 +235,7 @@ public: void Pause(); // Post kNotifyPostReleaseVideoBuffer message to OmxDecoder via ALooper. - void PostReleaseVideoBuffer(MediaBuffer *aBuffer, const FenceHandle& aReleaseFenceHandle); + void PostReleaseVideoBuffer(MediaBuffer *aBuffer); // Receive a message from AHandlerReflector. // Called on ALooper thread. void onMessageReceived(const sp &msg); diff --git a/gfx/layers/GrallocImages.h b/gfx/layers/GrallocImages.h index f5129a42670..e277668d48c 100644 --- a/gfx/layers/GrallocImages.h +++ b/gfx/layers/GrallocImages.h @@ -8,12 +8,11 @@ #ifdef MOZ_WIDGET_GONK +#include "mozilla/layers/AtomicRefCountedWithFinalize.h" +#include "mozilla/layers/LayersSurfaces.h" +#include "mozilla/gfx/Point.h" #include "ImageLayers.h" #include "ImageContainer.h" -#include "mozilla/gfx/Point.h" -#include "mozilla/layers/AtomicRefCountedWithFinalize.h" -#include "mozilla/layers/FenceUtils.h" -#include "mozilla/layers/LayersSurfaces.h" #include @@ -47,16 +46,6 @@ public: return mSurfaceDescriptor; } - void SetReleaseFenceHandle(const FenceHandle& aReleaseFenceHandle) - { - mReleaseFenceHandle = aReleaseFenceHandle; - } - - const FenceHandle& GetReleaseFenceHandle() const - { - return mReleaseFenceHandle; - } - protected: virtual void Unlock() {} @@ -76,7 +65,6 @@ private: protected: SurfaceDescriptor mSurfaceDescriptor; - FenceHandle mReleaseFenceHandle; }; /** diff --git a/gfx/layers/LayersTypes.h b/gfx/layers/LayersTypes.h index 3b6630b7923..66367bc8798 100644 --- a/gfx/layers/LayersTypes.h +++ b/gfx/layers/LayersTypes.h @@ -38,7 +38,6 @@ class GraphicBuffer; namespace mozilla { namespace layers { -class TextureHost; typedef uint32_t TextureFlags; @@ -89,20 +88,18 @@ enum LayerRenderStateFlags { struct LayerRenderState { LayerRenderState() #ifdef MOZ_WIDGET_GONK - : mSurface(nullptr), mFlags(0), mHasOwnOffset(false), mTexture(nullptr) + : mSurface(nullptr), mFlags(0), mHasOwnOffset(false) #endif {} #ifdef MOZ_WIDGET_GONK LayerRenderState(android::GraphicBuffer* aSurface, const nsIntSize& aSize, - uint32_t aFlags, - TextureHost* aTexture) + uint32_t aFlags) : mSurface(aSurface) , mSize(aSize) , mFlags(aFlags) , mHasOwnOffset(false) - , mTexture(aTexture) {} bool YFlipped() const @@ -126,7 +123,6 @@ struct LayerRenderState { android::sp mSurface; // size of mSurface nsIntSize mSize; - TextureHost* mTexture; #endif // see LayerRenderStateFlags uint32_t mFlags; diff --git a/gfx/layers/client/ClientLayerManager.cpp b/gfx/layers/client/ClientLayerManager.cpp index e4c750d161e..04ea54a8837 100644 --- a/gfx/layers/client/ClientLayerManager.cpp +++ b/gfx/layers/client/ClientLayerManager.cpp @@ -378,20 +378,6 @@ ClientLayerManager::ForwardTransaction(bool aScheduleComposite) ->SetDescriptorFromReply(ots.textureId(), ots.image()); break; } - case EditReply::TReturnReleaseFence: { - const ReturnReleaseFence& rep = reply.get_ReturnReleaseFence(); - FenceHandle fence = rep.fence(); - PTextureChild* child = rep.textureChild(); - - if (!fence.IsValid() || !child) { - break; - } - RefPtr texture = TextureClient::AsTextureClient(child); - if (texture) { - texture->SetReleaseFenceHandle(fence); - } - break; - } default: NS_RUNTIMEABORT("not reached"); diff --git a/gfx/layers/client/TextureClient.cpp b/gfx/layers/client/TextureClient.cpp index 77f433221c1..b136185ac27 100644 --- a/gfx/layers/client/TextureClient.cpp +++ b/gfx/layers/client/TextureClient.cpp @@ -20,6 +20,7 @@ #include "mozilla/layers/ShadowLayers.h" // for ShadowLayerForwarder #include "mozilla/layers/SharedPlanarYCbCrImage.h" #include "mozilla/layers/YCbCrImageDataSerializer.h" +#include "mozilla/layers/PTextureChild.h" #include "nsDebug.h" // for NS_ASSERTION, NS_WARNING, etc #include "nsTraceRefcnt.h" // for MOZ_COUNT_CTOR, etc #include "ImageContainer.h" // for PlanarYCbCrImage, etc @@ -158,13 +159,6 @@ TextureClient::DestroyIPDLActor(PTextureChild* actor) return true; } -// static -TextureClient* -TextureClient::AsTextureClient(PTextureChild* actor) -{ - return actor? static_cast(actor)->mTextureClient : nullptr; -} - bool TextureClient::InitIPDLActor(CompositableForwarder* aForwarder) { diff --git a/gfx/layers/client/TextureClient.h b/gfx/layers/client/TextureClient.h index a9999f53d33..bcb87464fbf 100644 --- a/gfx/layers/client/TextureClient.h +++ b/gfx/layers/client/TextureClient.h @@ -17,12 +17,10 @@ #include "mozilla/gfx/2D.h" // for DrawTarget #include "mozilla/gfx/Point.h" // for IntSize #include "mozilla/gfx/Types.h" // for SurfaceFormat -#include "mozilla/layers/FenceUtils.h" // for FenceHandle #include "mozilla/ipc/Shmem.h" // for Shmem #include "mozilla/layers/AtomicRefCountedWithFinalize.h" #include "mozilla/layers/CompositorTypes.h" // for TextureFlags, etc #include "mozilla/layers/LayersSurfaces.h" // for SurfaceDescriptor -#include "mozilla/layers/PTextureChild.h" // for PTextureChild #include "mozilla/mozalloc.h" // for operator delete #include "nsAutoPtr.h" // for nsRefPtr #include "nsCOMPtr.h" // for already_AddRefed @@ -232,11 +230,6 @@ public: static PTextureChild* CreateIPDLActor(); static bool DestroyIPDLActor(PTextureChild* actor); - /** - * Get the TextureClient corresponding to the actor passed in parameter. - */ - static TextureClient* AsTextureClient(PTextureChild* actor); - virtual bool IsAllocated() const = 0; virtual bool ToSurfaceDescriptor(SurfaceDescriptor& aDescriptor) = 0; @@ -294,13 +287,6 @@ public: */ void ForceRemove(); - virtual void SetReleaseFenceHandle(FenceHandle aReleaseFenceHandle) {} - - const FenceHandle& GetReleaseFenceHandle() const - { - return FenceHandle(); - } - private: /** * Called once, just before the destructor. diff --git a/gfx/layers/composite/CompositableHost.cpp b/gfx/layers/composite/CompositableHost.cpp index 910fb815307..4ed3b22084a 100644 --- a/gfx/layers/composite/CompositableHost.cpp +++ b/gfx/layers/composite/CompositableHost.cpp @@ -36,9 +36,6 @@ CompositableHost::CompositableHost(const TextureInfo& aTextureInfo) CompositableHost::~CompositableHost() { MOZ_COUNT_DTOR(CompositableHost); - if (mBackendData) { - mBackendData->ClearData(); - } } void @@ -65,8 +62,6 @@ CompositableHost::UseComponentAlphaTextures(TextureHost* aTextureOnBlack, void CompositableHost::RemoveTextureHost(TextureHost* aTexture) { - // Clear strong refrence to CompositableBackendSpecificData - aTexture->SetCompositableBackendSpecificData(nullptr); } void diff --git a/gfx/layers/composite/CompositableHost.h b/gfx/layers/composite/CompositableHost.h index 441c379aab8..a019bfd57a9 100644 --- a/gfx/layers/composite/CompositableHost.h +++ b/gfx/layers/composite/CompositableHost.h @@ -19,7 +19,6 @@ #include "mozilla/layers/CompositorTypes.h" // for TextureInfo, etc #include "mozilla/layers/LayersTypes.h" // for LayerRenderState, etc #include "mozilla/layers/PCompositableParent.h" -#include "mozilla/layers/TextureHost.h" // for TextureHost #include "mozilla/mozalloc.h" // for operator delete #include "nsCOMPtr.h" // for already_AddRefed #include "nsRegion.h" // for nsIntRegion @@ -47,6 +46,7 @@ struct TiledLayerProperties class Layer; class DeprecatedTextureHost; +class TextureHost; class SurfaceDescriptor; class Compositor; class ISurfaceAllocator; @@ -70,45 +70,7 @@ public: MOZ_COUNT_DTOR(CompositableBackendSpecificData); } virtual void SetCompositor(Compositor* aCompositor) {} - virtual void ClearData() - { - mCurrentReleaseFenceTexture = nullptr; - ClearPendingReleaseFenceTextureList(); - } - - /** - * Store a texture currently used for Composition. - * This function is called when the texutre might receive ReleaseFence - * as a result of Composition. - */ - void SetCurrentReleaseFenceTexture(TextureHost* aTexture) - { - if (mCurrentReleaseFenceTexture) { - mPendingReleaseFenceTextures.push_back(mCurrentReleaseFenceTexture); - } - mCurrentReleaseFenceTexture = aTexture; - } - - virtual std::vector< RefPtr >& GetPendingReleaseFenceTextureList() - { - return mPendingReleaseFenceTextures; - } - - virtual void ClearPendingReleaseFenceTextureList() - { - return mPendingReleaseFenceTextures.clear(); - } -protected: - /** - * Store a TextureHost currently used for Composition - * and it might receive ReleaseFence for the texutre. - */ - RefPtr mCurrentReleaseFenceTexture; - /** - * Store TextureHosts that might have ReleaseFence to be delivered - * to TextureClient by CompositableHost. - */ - std::vector< RefPtr > mPendingReleaseFenceTextures; + virtual void ClearData() {} }; /** diff --git a/gfx/layers/composite/TextureHost.cpp b/gfx/layers/composite/TextureHost.cpp index 16c4e8743b7..82a8c84bfac 100644 --- a/gfx/layers/composite/TextureHost.cpp +++ b/gfx/layers/composite/TextureHost.cpp @@ -89,12 +89,6 @@ TextureHost::AsTextureHost(PTextureParent* actor) return actor? static_cast(actor)->mTextureHost : nullptr; } -PTextureParent* -TextureHost::GetIPDLActor() -{ - return mActor; -} - // implemented in TextureOGL.cpp TemporaryRef CreateDeprecatedTextureHostOGL(SurfaceDescriptorType aDescriptorType, uint32_t aDeprecatedTextureHostFlags, @@ -248,8 +242,7 @@ TextureHost::SetCompositableBackendSpecificData(CompositableBackendSpecificData* TextureHost::TextureHost(TextureFlags aFlags) - : mActor(nullptr) - , mFlags(aFlags) + : mFlags(aFlags) {} TextureHost::~TextureHost() @@ -730,7 +723,6 @@ TextureParent::Init(const SurfaceDescriptor& aSharedData, mTextureHost = TextureHost::Create(aSharedData, mAllocator, aFlags); - mTextureHost->mActor = this; return !!mTextureHost; } @@ -768,8 +760,6 @@ TextureParent::ActorDestroy(ActorDestroyReason why) if (mTextureHost->GetFlags() & TEXTURE_DEALLOCATE_CLIENT) { mTextureHost->ForgetSharedData(); } - - mTextureHost->mActor = nullptr; mTextureHost = nullptr; } diff --git a/gfx/layers/composite/TextureHost.h b/gfx/layers/composite/TextureHost.h index e12beaef023..ccd7c9cbfd4 100644 --- a/gfx/layers/composite/TextureHost.h +++ b/gfx/layers/composite/TextureHost.h @@ -43,7 +43,6 @@ class CompositableHost; class CompositableBackendSpecificData; class SurfaceDescriptor; class ISurfaceAllocator; -class TextureHostOGL; class TextureSourceOGL; class TextureSourceD3D9; class TextureSourceD3D11; @@ -274,6 +273,7 @@ class TextureHost void Finalize(); friend class AtomicRefCountedWithFinalize; + public: TextureHost(TextureFlags aFlags); @@ -395,14 +395,6 @@ public: */ static TextureHost* AsTextureHost(PTextureParent* actor); - /** - * Return a pointer to the IPDLActor. - * - * This is to be used with IPDL messages only. Do not store the returned - * pointer. - */ - PTextureParent* GetIPDLActor(); - /** * Specific to B2G's Composer2D * XXX - more doc here @@ -426,17 +418,9 @@ public: virtual const char *Name() { return "TextureHost"; } virtual void PrintInfo(nsACString& aTo, const char* aPrefix); - /** - * Cast to a TextureHost for each backend. - */ - virtual TextureHostOGL* AsHostOGL() { return nullptr; } - protected: - PTextureParent* mActor; TextureFlags mFlags; RefPtr mCompositableBackendData; - - friend class TextureParent; }; /** diff --git a/gfx/layers/ipc/CompositableTransactionParent.cpp b/gfx/layers/ipc/CompositableTransactionParent.cpp index a6a222e3e2a..7dbfa292a33 100644 --- a/gfx/layers/ipc/CompositableTransactionParent.cpp +++ b/gfx/layers/ipc/CompositableTransactionParent.cpp @@ -8,7 +8,6 @@ #include "CompositableTransactionParent.h" #include "CompositableHost.h" // for CompositableParent, etc #include "CompositorParent.h" // for CompositorParent -#include "GLContext.h" // for GLContext #include "Layers.h" // for Layer #include "RenderTrace.h" // for RenderTraceInvalidateEnd, etc #include "TiledLayerBuffer.h" // for TiledLayerComposer @@ -20,7 +19,6 @@ #include "mozilla/layers/LayersSurfaces.h" // for SurfaceDescriptor #include "mozilla/layers/LayersTypes.h" // for MOZ_LAYERS_LOG #include "mozilla/layers/TextureHost.h" // for TextureHost -#include "mozilla/layers/TextureHostOGL.h" // for TextureHostOGL #include "mozilla/layers/ThebesLayerComposite.h" #include "mozilla/mozalloc.h" // for operator delete #include "nsDebug.h" // for NS_WARNING, NS_ASSERTION @@ -161,8 +159,6 @@ CompositableParentManager::ReceiveCompositableUpdate(const CompositableOperation RenderTraceInvalidateEnd(layer, "FF00FF"); } - // return texure data to client if necessary - ReturnTextureDataIfNecessary(compositable, replyv, op.compositableParent()); break; } case CompositableOperation::TOpPaintTextureRegion: { @@ -194,8 +190,6 @@ CompositableParentManager::ReceiveCompositableUpdate(const CompositableOperation OpContentBufferSwap(compositableParent, nullptr, frontUpdatedRegion)); RenderTraceInvalidateEnd(thebes, "FF00FF"); - // return texure data to client if necessary - ReturnTextureDataIfNecessary(compositable, replyv, op.compositableParent()); break; } case CompositableOperation::TOpPaintTextureIncremental: { @@ -245,8 +239,6 @@ CompositableParentManager::ReceiveCompositableUpdate(const CompositableOperation MOZ_ASSERT(tex.get()); compositable->RemoveTextureHost(tex); - // return texure data to client if necessary - ReturnTextureDataIfNecessary(compositable, replyv, op.compositableParent()); break; } case CompositableOperation::TOpUseTexture: { @@ -265,8 +257,6 @@ CompositableParentManager::ReceiveCompositableUpdate(const CompositableOperation compositable->GetLayer()->SetInvalidRectToVisibleRegion(); } } - // return texure data to client if necessary - ReturnTextureDataIfNecessary(compositable, replyv, op.compositableParent()); break; } case CompositableOperation::TOpUseComponentAlphaTextures: { @@ -281,8 +271,6 @@ CompositableParentManager::ReceiveCompositableUpdate(const CompositableOperation if (IsAsync()) { ScheduleComposition(op); } - // return texure data to client if necessary - ReturnTextureDataIfNecessary(compositable, replyv, op.compositableParent()); break; } case CompositableOperation::TOpUpdateTexture: { @@ -293,6 +281,7 @@ CompositableParentManager::ReceiveCompositableUpdate(const CompositableOperation texture->Updated(op.region().type() == MaybeRegion::TnsIntRegion ? &op.region().get_nsIntRegion() : nullptr); // no region means invalidate the entire surface + break; } @@ -304,54 +293,6 @@ CompositableParentManager::ReceiveCompositableUpdate(const CompositableOperation return true; } -#if MOZ_WIDGET_GONK && ANDROID_VERSION >= 18 -void -CompositableParentManager::ReturnTextureDataIfNecessary(CompositableHost* aCompositable, - EditReplyVector& replyv, - PCompositableParent* aParent) -{ - if (!aCompositable || !aCompositable->GetCompositableBackendSpecificData()) { - return; - } - - const std::vector< RefPtr > textureList = - aCompositable->GetCompositableBackendSpecificData()->GetPendingReleaseFenceTextureList(); - // Return pending Texture data - for (size_t i = 0; i < textureList.size(); i++) { - TextureHostOGL* hostOGL = textureList[i]->AsHostOGL(); - PTextureParent* actor = textureList[i]->GetIPDLActor(); - if (!hostOGL || !actor) { - continue; - } - android::sp fence = hostOGL->GetAndResetReleaseFence(); - if (fence.get() && fence->isValid()) { - FenceHandle handle = FenceHandle(fence); - replyv.push_back(ReturnReleaseFence(aParent, nullptr, actor, nullptr, handle)); - // Hold fence handle to prevent fence's file descriptor is closed before IPC happens. - mPrevFenceHandles.push_back(handle); - } - } - aCompositable->GetCompositableBackendSpecificData()->ClearPendingReleaseFenceTextureList(); -} -#else -void -CompositableParentManager::ReturnTextureDataIfNecessary(CompositableHost* aCompositable, - EditReplyVector& replyv, - PCompositableParent* aParent) -{ - if (!aCompositable || !aCompositable->GetCompositableBackendSpecificData()) { - return; - } - aCompositable->GetCompositableBackendSpecificData()->ClearPendingReleaseFenceTextureList(); -} -#endif - -void -CompositableParentManager::ClearPrevFenceHandles() -{ - mPrevFenceHandles.clear(); -} - } // namespace } // namespace diff --git a/gfx/layers/ipc/CompositableTransactionParent.h b/gfx/layers/ipc/CompositableTransactionParent.h index 151e8713bd7..6a80836ab6e 100644 --- a/gfx/layers/ipc/CompositableTransactionParent.h +++ b/gfx/layers/ipc/CompositableTransactionParent.h @@ -16,8 +16,6 @@ namespace mozilla { namespace layers { -class CompositableHost; - typedef std::vector EditReplyVector; // Since PCompositble has two potential manager protocols, we can't just call @@ -39,14 +37,6 @@ protected: * thread (ImageBridge for instance). */ virtual bool IsAsync() const { return false; } - - void ReturnTextureDataIfNecessary(CompositableHost* aCompositable, - EditReplyVector& replyv, - PCompositableParent* aParent); - void ClearPrevFenceHandles(); - -protected: - std::vector mPrevFenceHandles; }; } // namespace diff --git a/gfx/layers/ipc/FenceUtils.h b/gfx/layers/ipc/FenceUtils.h deleted file mode 100644 index ca5c48453ef..00000000000 --- a/gfx/layers/ipc/FenceUtils.h +++ /dev/null @@ -1,43 +0,0 @@ -/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * vim: sw=2 ts=8 et : - */ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#ifndef IPC_FencerUtils_h -#define IPC_FencerUtils_h - -#include "ipc/IPCMessageUtils.h" - -/** - * FenceHandle is used for delivering Fence object via ipc. - */ -#if MOZ_WIDGET_GONK && ANDROID_VERSION >= 18 -# include "mozilla/layers/FenceUtilsGonk.h" -#else -namespace mozilla { -namespace layers { -struct FenceHandle { - bool operator==(const FenceHandle&) const { return false; } - bool IsValid() const { return false; } -}; -} // namespace layers -} // namespace mozilla -#endif // MOZ_WIDGET_GONK && ANDROID_VERSION >= 18 - -namespace IPC { - -#if MOZ_WIDGET_GONK && ANDROID_VERSION >= 18 -#else -template <> -struct ParamTraits { - typedef mozilla::layers::FenceHandle paramType; - static void Write(Message*, const paramType&) {} - static bool Read(const Message*, void**, paramType*) { return false; } -}; -#endif // MOZ_WIDGET_GONK && ANDROID_VERSION >= 18 - -} // namespace IPC - -#endif // IPC_FencerUtils_h diff --git a/gfx/layers/ipc/FenceUtilsGonk.cpp b/gfx/layers/ipc/FenceUtilsGonk.cpp deleted file mode 100644 index cd874655891..00000000000 --- a/gfx/layers/ipc/FenceUtilsGonk.cpp +++ /dev/null @@ -1,96 +0,0 @@ -/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * vim: sw=2 ts=8 et : - */ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#include "GLContext.h" -#include "mozilla/unused.h" -#include "nsXULAppAPI.h" - -#include "FenceUtilsGonk.h" - -using namespace android; -using namespace base; -using namespace mozilla::layers; - -namespace IPC { - -void -ParamTraits::Write(Message* aMsg, - const paramType& aParam) -{ - Flattenable *flattenable = aParam.mFence.get(); - size_t nbytes = flattenable->getFlattenedSize(); - size_t nfds = flattenable->getFdCount(); - - char data[nbytes]; - int fds[nfds]; - flattenable->flatten(data, nbytes, fds, nfds); - - aMsg->WriteSize(nbytes); - aMsg->WriteSize(nfds); - - aMsg->WriteBytes(data, nbytes); - for (size_t n = 0; n < nfds; ++n) { - // These buffers can't die in transit because they're created - // synchonously and the parent-side buffer can only be dropped if - // there's a crash. - aMsg->WriteFileDescriptor(FileDescriptor(fds[n], false)); - } -} - -bool -ParamTraits::Read(const Message* aMsg, - void** aIter, paramType* aResult) -{ - size_t nbytes; - size_t nfds; - const char* data; - - if (!aMsg->ReadSize(aIter, &nbytes) || - !aMsg->ReadSize(aIter, &nfds) || - !aMsg->ReadBytes(aIter, &data, nbytes)) { - return false; - } - - int fds[nfds]; - - for (size_t n = 0; n < nfds; ++n) { - FileDescriptor fd; - if (!aMsg->ReadFileDescriptor(aIter, &fd)) { - return false; - } - // If the GraphicBuffer was shared cross-process, SCM_RIGHTS does - // the right thing and dup's the fd. If it's shared cross-thread, - // SCM_RIGHTS doesn't dup the fd. That's surprising, but we just - // deal with it here. NB: only the "default" (master) process can - // alloc gralloc buffers. - bool sameProcess = (XRE_GetProcessType() == GeckoProcessType_Default); - int dupFd = sameProcess ? dup(fd.fd) : fd.fd; - fds[n] = dupFd; - } - - sp buffer(new Fence()); - Flattenable *flattenable = buffer.get(); - - if (NO_ERROR == flattenable->unflatten(data, nbytes, fds, nfds)) { - aResult->mFence = buffer; - return true; - } - return false; -} - -} // namespace IPC - -namespace mozilla { -namespace layers { - -FenceHandle::FenceHandle(const sp& aFence) - : mFence(aFence) -{ -} - -} // namespace layers -} // namespace mozilla diff --git a/gfx/layers/ipc/FenceUtilsGonk.h b/gfx/layers/ipc/FenceUtilsGonk.h deleted file mode 100644 index 3cd300f1b84..00000000000 --- a/gfx/layers/ipc/FenceUtilsGonk.h +++ /dev/null @@ -1,53 +0,0 @@ -/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * vim: sw=2 ts=8 et : - */ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#ifndef mozilla_layers_FenceUtilsGonk_h -#define mozilla_layers_FenceUtilsGonk_h - -#include -#include - -#include "ipc/IPCMessageUtils.h" - -namespace mozilla { -namespace layers { - -struct FenceHandle { - typedef android::Fence Fence; - - FenceHandle() - { } - FenceHandle(const android::sp& aFence); - - bool operator==(const FenceHandle& aOther) const { - return mFence.get() == aOther.mFence.get(); - } - - bool IsValid() const - { - return mFence.get() && mFence->isValid(); - } - - android::sp mFence; -}; - -} // namespace layers -} // namespace mozilla - -namespace IPC { - -template <> -struct ParamTraits { - typedef mozilla::layers::FenceHandle paramType; - - static void Write(Message* aMsg, const paramType& aParam); - static bool Read(const Message* aMsg, void** aIter, paramType* aResult); -}; - -} // namespace IPC - -#endif // mozilla_layers_FenceUtilsGonk_h diff --git a/gfx/layers/ipc/ImageBridgeChild.cpp b/gfx/layers/ipc/ImageBridgeChild.cpp index c47c4a04f5e..6ba88746944 100644 --- a/gfx/layers/ipc/ImageBridgeChild.cpp +++ b/gfx/layers/ipc/ImageBridgeChild.cpp @@ -516,20 +516,6 @@ ImageBridgeChild::EndTransaction() ->SetDescriptorFromReply(ots.textureId(), ots.image()); break; } - case EditReply::TReturnReleaseFence: { - const ReturnReleaseFence& rep = reply.get_ReturnReleaseFence(); - FenceHandle fence = rep.fence(); - PTextureChild* child = rep.textureChild(); - - if (!fence.IsValid() || !child) { - break; - } - RefPtr texture = TextureClient::AsTextureClient(child); - if (texture) { - texture->SetReleaseFenceHandle(fence); - } - break; - } default: NS_RUNTIMEABORT("not reached"); } diff --git a/gfx/layers/ipc/ImageBridgeParent.cpp b/gfx/layers/ipc/ImageBridgeParent.cpp index a2e889155ee..45fca882cb2 100644 --- a/gfx/layers/ipc/ImageBridgeParent.cpp +++ b/gfx/layers/ipc/ImageBridgeParent.cpp @@ -75,9 +75,6 @@ ImageBridgeParent::RecvUpdate(const EditArray& aEdits, EditReplyArray* aReply) return true; } - // Clear fence handles used in previsou transaction. - ClearPrevFenceHandles(); - EditReplyVector replyv; for (EditArray::index_type i = 0; i < aEdits.Length(); ++i) { ReceiveCompositableUpdate(aEdits[i], replyv); diff --git a/gfx/layers/ipc/LayerTransactionParent.cpp b/gfx/layers/ipc/LayerTransactionParent.cpp index 2aaf47395d0..e4fdc4b0caf 100644 --- a/gfx/layers/ipc/LayerTransactionParent.cpp +++ b/gfx/layers/ipc/LayerTransactionParent.cpp @@ -204,9 +204,6 @@ LayerTransactionParent::RecvUpdate(const InfallibleTArray& cset, return true; } - // Clear fence handles used in previsou transaction. - ClearPrevFenceHandles(); - EditReplyVector replyv; { diff --git a/gfx/layers/ipc/LayersMessages.ipdlh b/gfx/layers/ipc/LayersMessages.ipdlh index 58b3bddbead..69ad0f86074 100644 --- a/gfx/layers/ipc/LayersMessages.ipdlh +++ b/gfx/layers/ipc/LayersMessages.ipdlh @@ -39,7 +39,6 @@ using mozilla::layers::ScaleMode from "mozilla/layers/LayersTypes.h"; using mozilla::layers::EventRegions from "mozilla/layers/LayersTypes.h"; using mozilla::layers::DiagnosticTypes from "mozilla/layers/CompositorTypes.h"; using struct mozilla::layers::FrameMetrics from "FrameMetrics.h"; -using struct mozilla::layers::FenceHandle from "mozilla/layers/FenceUtils.h"; namespace mozilla { namespace layers { @@ -397,19 +396,11 @@ struct OpTextureSwap { SurfaceDescriptor image; }; -struct ReturnReleaseFence { - PCompositable compositable; - PTexture texture; - FenceHandle fence; -}; - // Unit of a "changeset reply". This is a weird abstraction, probably // only to be used for buffer swapping. union EditReply { OpContentBufferSwap; OpTextureSwap; - - ReturnReleaseFence; }; } // namespace diff --git a/gfx/layers/moz.build b/gfx/layers/moz.build index 6af87fd2e48..13a397cb9db 100644 --- a/gfx/layers/moz.build +++ b/gfx/layers/moz.build @@ -129,7 +129,6 @@ EXPORTS.mozilla.layers += [ 'ipc/CompositableTransactionParent.h', 'ipc/CompositorChild.h', 'ipc/CompositorParent.h', - 'ipc/FenceUtils.h', 'ipc/GeckoContentController.h', 'ipc/GestureEventListener.h', 'ipc/ImageBridgeChild.h', @@ -203,14 +202,6 @@ if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'gonk': 'ipc/ShadowLayerUtilsGralloc.cpp', ] - if CONFIG['ANDROID_VERSION'] in ('18'): - EXPORTS.mozilla.layers += [ - 'ipc/FenceUtilsGonk.h', - ] - SOURCES += [ - 'ipc/FenceUtilsGonk.cpp', - ] - UNIFIED_SOURCES += [ 'basic/BasicCanvasLayer.cpp', 'basic/BasicColorLayer.cpp', diff --git a/gfx/layers/opengl/GrallocTextureClient.cpp b/gfx/layers/opengl/GrallocTextureClient.cpp index 5ce45af872a..9fc35a133c7 100644 --- a/gfx/layers/opengl/GrallocTextureClient.cpp +++ b/gfx/layers/opengl/GrallocTextureClient.cpp @@ -196,16 +196,6 @@ GrallocTextureClientOGL::UpdateSurface(gfxASurface* aSurface) return true; } -void -GrallocTextureClientOGL::SetReleaseFenceHandle(FenceHandle aReleaseFenceHandle) -{ - if (mBufferLocked) { - mBufferLocked->SetReleaseFenceHandle(aReleaseFenceHandle); - } else { - mReleaseFenceHandle = aReleaseFenceHandle; - } -} - bool GrallocTextureClientOGL::Lock(OpenMode aMode) { @@ -217,13 +207,6 @@ GrallocTextureClientOGL::Lock(OpenMode aMode) if (mMappedBuffer) { return true; } - - if (mReleaseFenceHandle.IsValid()) { - android::sp fence = mReleaseFenceHandle.mFence; - fence->waitForever("GrallocTextureClientOGL::Lock"); - mReleaseFenceHandle = FenceHandle(); - } - uint32_t usage = 0; if (aMode & OPEN_READ) { usage |= GRALLOC_USAGE_SW_READ_OFTEN; diff --git a/gfx/layers/opengl/GrallocTextureClient.h b/gfx/layers/opengl/GrallocTextureClient.h index 2824f360c92..40638790446 100644 --- a/gfx/layers/opengl/GrallocTextureClient.h +++ b/gfx/layers/opengl/GrallocTextureClient.h @@ -9,7 +9,6 @@ #include "mozilla/layers/TextureClient.h" #include "ISurfaceAllocator.h" // For IsSurfaceDescriptorValid -#include "mozilla/layers/FenceUtils.h" // for FenceHandle #include "mozilla/layers/ShadowLayerUtilsGralloc.h" #include @@ -60,13 +59,6 @@ public: virtual TextureClientData* DropTextureData() MOZ_OVERRIDE; - virtual void SetReleaseFenceHandle(FenceHandle aReleaseFenceHandle) MOZ_OVERRIDE; - - const FenceHandle& GetReleaseFenceHandle() const - { - return mReleaseFenceHandle; - } - void InitWith(GrallocBufferActor* aActor, gfx::IntSize aSize); void SetTextureFlags(TextureFlags aFlags) { AddFlags(aFlags); } @@ -118,8 +110,6 @@ protected: android::sp mGraphicBuffer; - FenceHandle mReleaseFenceHandle; - RefPtr mAllocator; /** diff --git a/gfx/layers/opengl/GrallocTextureHost.cpp b/gfx/layers/opengl/GrallocTextureHost.cpp index 42d3d46ec5f..bcc30faabaa 100644 --- a/gfx/layers/opengl/GrallocTextureHost.cpp +++ b/gfx/layers/opengl/GrallocTextureHost.cpp @@ -332,8 +332,7 @@ GrallocTextureHostOGL::GetRenderState() } return LayerRenderState(mTextureSource->mGraphicBuffer.get(), gfx::ThebesIntSize(mSize), - flags, - this); + flags); } return LayerRenderState(); @@ -380,11 +379,6 @@ GrallocTextureHostOGL::SetCompositableBackendSpecificData(CompositableBackendSpe if (mTextureSource) { mTextureSource->SetCompositableBackendSpecificData(aBackendData); } - // Register this object to CompositableBackendSpecificData - // as current TextureHost. - if (aBackendData) { - aBackendData->SetCurrentReleaseFenceTexture(this); - } } } // namepsace layers diff --git a/gfx/layers/opengl/GrallocTextureHost.h b/gfx/layers/opengl/GrallocTextureHost.h index 2d1b9da6077..f9e38e98ed9 100644 --- a/gfx/layers/opengl/GrallocTextureHost.h +++ b/gfx/layers/opengl/GrallocTextureHost.h @@ -71,9 +71,6 @@ protected: }; class GrallocTextureHostOGL : public TextureHost -#if MOZ_WIDGET_GONK && ANDROID_VERSION >= 18 - , public TextureHostOGL -#endif { friend class GrallocBufferActor; public: @@ -107,13 +104,6 @@ public: return mTextureSource; } -#if MOZ_WIDGET_GONK && ANDROID_VERSION >= 18 - virtual TextureHostOGL* AsHostOGL() MOZ_OVERRIDE - { - return this; - } -#endif - virtual TemporaryRef GetAsSurface() MOZ_OVERRIDE; virtual void SetCompositableBackendSpecificData(CompositableBackendSpecificData* aBackendData) MOZ_OVERRIDE; diff --git a/gfx/layers/opengl/TextureHostOGL.cpp b/gfx/layers/opengl/TextureHostOGL.cpp index a227405921a..41366374473 100644 --- a/gfx/layers/opengl/TextureHostOGL.cpp +++ b/gfx/layers/opengl/TextureHostOGL.cpp @@ -176,7 +176,6 @@ void CompositableDataGonkOGL::SetCompositor(Compositor* aCompositor) void CompositableDataGonkOGL::ClearData() { - CompositableBackendSpecificData::ClearData(); DeleteTextureIfPresent(); } @@ -201,41 +200,6 @@ CompositableDataGonkOGL::DeleteTextureIfPresent() } } -#if MOZ_WIDGET_GONK && ANDROID_VERSION >= 18 -bool -TextureHostOGL::SetReleaseFence(const android::sp& aReleaseFence) -{ - if (!aReleaseFence.get() || !aReleaseFence->isValid()) { - return false; - } - - if (!mReleaseFence.get()) { - mReleaseFence = aReleaseFence; - } else { - android::sp mergedFence = android::Fence::merge( - android::String8::format("TextureHostOGL"), - mReleaseFence, aReleaseFence); - if (!mergedFence.get()) { - // synchronization is broken, the best we can do is hope fences - // signal in order so the new fence will act like a union. - // This error handling is same as android::ConsumerBase does. - mReleaseFence = aReleaseFence; - return false; - } - mReleaseFence = mergedFence; - } - return true; -} - -android::sp -TextureHostOGL::GetAndResetReleaseFence() -{ - android::sp fence = mReleaseFence; - mReleaseFence = android::Fence::NO_FENCE; - return fence; -} -#endif - bool TextureImageTextureSourceOGL::Update(gfx::DataSourceSurface* aSurface, nsIntRegion* aDestRegion, @@ -1191,8 +1155,7 @@ GrallocDeprecatedTextureHostOGL::GetRenderState() return LayerRenderState(mGraphicBuffer.get(), bufferSize, - flags, - nullptr); + flags); } return LayerRenderState(); diff --git a/gfx/layers/opengl/TextureHostOGL.h b/gfx/layers/opengl/TextureHostOGL.h index 5b82bab259a..713ea5ea47e 100644 --- a/gfx/layers/opengl/TextureHostOGL.h +++ b/gfx/layers/opengl/TextureHostOGL.h @@ -32,9 +32,6 @@ #include "OGLShaderProgram.h" // for ShaderProgramType, etc #ifdef MOZ_WIDGET_GONK #include -#if ANDROID_VERSION >= 18 -#include -#endif #endif class gfxImageSurface; @@ -120,29 +117,6 @@ public: virtual TextureImageDeprecatedTextureHostOGL* AsTextureImageDeprecatedTextureHost() { return nullptr; } }; -/** - * TextureHostOGL provides the necessary API for platform specific composition. - */ -class TextureHostOGL -{ -public: -#if MOZ_WIDGET_GONK && ANDROID_VERSION >= 18 - - /** - * Store a fence that will signal when the current buffer is no longer being read. - * Similar to android's GLConsumer::setReleaseFence() - */ - virtual bool SetReleaseFence(const android::sp& aReleaseFence); - - /** - * Return a releaseFence's Fence and clear a reference to the Fence. - */ - virtual android::sp GetAndResetReleaseFence(); -protected: - android::sp mReleaseFence; -#endif -}; - /** * A TextureSource backed by a TextureImage. * diff --git a/widget/gonk/HwcComposer2D.cpp b/widget/gonk/HwcComposer2D.cpp index 62a98ee4a27..f1ee00a5c27 100644 --- a/widget/gonk/HwcComposer2D.cpp +++ b/widget/gonk/HwcComposer2D.cpp @@ -19,13 +19,11 @@ #include "libdisplay/GonkDisplay.h" #include "Framebuffer.h" -#include "GLContext.h" // for GLContext #include "HwcUtils.h" #include "HwcComposer2D.h" #include "mozilla/layers/LayerManagerComposite.h" #include "mozilla/layers/PLayerTransaction.h" #include "mozilla/layers/ShadowLayerUtilsGralloc.h" -#include "mozilla/layers/TextureHostOGL.h" // for TextureHostOGL #include "mozilla/StaticPtr.h" #include "cutils/properties.h" #include "gfx2DGlue.h" @@ -69,10 +67,7 @@ HwcComposer2D::HwcComposer2D() , mHwc(nullptr) , mColorFill(false) , mRBSwapSupport(false) -#if ANDROID_VERSION >= 18 - , mPrevRetireFence(Fence::NO_FENCE) - , mPrevDisplayFence(Fence::NO_FENCE) -#endif + , mPrevRetireFence(-1) , mPrepared(false) { } @@ -654,29 +649,36 @@ HwcComposer2D::Commit() int err = mHwc->set(mHwc, HWC_NUM_DISPLAY_TYPES, displays); - mPrevDisplayFence = mPrevRetireFence; - mPrevRetireFence = Fence::NO_FENCE; + // To avoid tearing, workaround for missing releaseFenceFd + // waits in Gecko layers, see Bug 925444. + if (!mPrevReleaseFds.IsEmpty()) { + // Wait for previous retire Fence to signal. + // Denotes contents on display have been replaced. + // For buffer-sync, framework should not over-write + // prev buffers until we close prev releaseFenceFds + sp fence = new Fence(mPrevRetireFence); + if (fence->wait(1000) == -ETIME) { + LOGE("Wait timed-out for retireFenceFd %d", mPrevRetireFence); + } + for (int i = 0; i < mPrevReleaseFds.Length(); i++) { + close(mPrevReleaseFds[i]); + } + close(mPrevRetireFence); + mPrevReleaseFds.Clear(); + } for (uint32_t j=0; j < (mList->numHwLayers - 1); j++) { if (mList->hwLayers[j].releaseFenceFd >= 0) { - int fd = mList->hwLayers[j].releaseFenceFd; - mList->hwLayers[j].releaseFenceFd = -1; - sp fence = new Fence(fd); - - LayerRenderState state = mHwcLayerMap[j]->GetLayer()->GetRenderState(); - if (!state.mTexture) { - continue; - } - TextureHostOGL* texture = state.mTexture->AsHostOGL(); - if (!texture) { - continue; - } - texture->SetReleaseFence(fence); - } - } + mPrevReleaseFds.AppendElement(mList->hwLayers[j].releaseFenceFd); + } + } if (mList->retireFenceFd >= 0) { - mPrevRetireFence = new Fence(mList->retireFenceFd); + if (!mPrevReleaseFds.IsEmpty()) { + mPrevRetireFence = mList->retireFenceFd; + } else { // GPU Composition + close(mList->retireFenceFd); + } } mPrepared = false; diff --git a/widget/gonk/HwcComposer2D.h b/widget/gonk/HwcComposer2D.h index 1e7c4a4e4cd..ff411d71f22 100644 --- a/widget/gonk/HwcComposer2D.h +++ b/widget/gonk/HwcComposer2D.h @@ -23,9 +23,6 @@ #include #include -#if ANDROID_VERSION >= 18 -#include -#endif namespace mozilla { @@ -86,10 +83,8 @@ private: //Holds all the dynamically allocated RectVectors needed //to render the current frame std::list mVisibleRegions; -#if ANDROID_VERSION >= 18 - android::sp mPrevRetireFence; - android::sp mPrevDisplayFence; -#endif + nsTArray mPrevReleaseFds; + int mPrevRetireFence; nsTArray mHwcLayerMap; bool mPrepared; }; diff --git a/widget/gonk/nativewindow/GonkNativeWindowJB.cpp b/widget/gonk/nativewindow/GonkNativeWindowJB.cpp index a7bd4b1aa44..f61e61acda5 100755 --- a/widget/gonk/nativewindow/GonkNativeWindowJB.cpp +++ b/widget/gonk/nativewindow/GonkNativeWindowJB.cpp @@ -105,7 +105,8 @@ status_t GonkNativeWindow::setDefaultBufferFormat(uint32_t defaultFormat) { } already_AddRefed -GonkNativeWindow::getCurrentBuffer() { +GonkNativeWindow::getCurrentBuffer() +{ Mutex::Autolock _l(mMutex); GonkBufferQueue::BufferItem item; @@ -122,20 +123,17 @@ GonkNativeWindow::getCurrentBuffer() { } bool -GonkNativeWindow::returnBuffer(uint32_t index, uint32_t generation, const sp& fence) { - BI_LOGD("GonkNativeWindow::returnBuffer: slot=%d (generation=%d)", index, generation); +GonkNativeWindow::returnBuffer(uint32_t aIndex, uint32_t aGeneration) { + BI_LOGD("GonkNativeWindow::returnBuffer: slot=%d (generation=%d)", aIndex, aGeneration); Mutex::Autolock lock(mMutex); - if (generation != mBufferQueue->getGeneration()) { + if (aGeneration != mBufferQueue->getGeneration()) { BI_LOGD("returnBuffer: buffer is from generation %d (current is %d)", - generation, mBufferQueue->getGeneration()); + aGeneration, mBufferQueue->getGeneration()); return false; } - status_t err; - err = addReleaseFenceLocked(index, fence); - - err = releaseBufferLocked(index); + status_t err = releaseBufferLocked(aIndex); if (err != NO_ERROR) { return false; } @@ -143,7 +141,8 @@ GonkNativeWindow::returnBuffer(uint32_t index, uint32_t generation, const spgetSurfaceDescriptorFromBuffer(buffer); } @@ -162,22 +161,4 @@ void GonkNativeWindow::onFrameAvailable() { } } -void CameraGraphicBuffer::Unlock() { - if (mLocked) { - android::sp fence; - fence = mReleaseFenceHandle.IsValid() ? mReleaseFenceHandle.mFence : Fence::NO_FENCE; - // The window might have been destroyed. The buffer is no longer - // valid at that point. - sp window = mNativeWindow.promote(); - if (window.get() && window->returnBuffer(mIndex, mGeneration, fence)) { - mLocked = false; - } else { - // If the window doesn't exist any more, release the buffer - // directly. - ImageBridgeChild *ibc = ImageBridgeChild::GetSingleton(); - ibc->DeallocSurfaceDescriptorGralloc(mSurfaceDescriptor); - } - } -} - } // namespace android diff --git a/widget/gonk/nativewindow/GonkNativeWindowJB.h b/widget/gonk/nativewindow/GonkNativeWindowJB.h index a3ec57b33f5..925c684c645 100755 --- a/widget/gonk/nativewindow/GonkNativeWindowJB.h +++ b/widget/gonk/nativewindow/GonkNativeWindowJB.h @@ -116,7 +116,7 @@ class GonkNativeWindow: public GonkConsumerBase // Return the buffer to the queue and mark it as FREE. After that // the buffer is useable again for the decoder. - bool returnBuffer(uint32_t index, uint32_t generation, const sp& fence); + bool returnBuffer(uint32_t index, uint32_t generation); SurfaceDescriptor* getSurfaceDescriptorFromBuffer(ANativeWindowBuffer* buffer); @@ -157,7 +157,22 @@ public: protected: // Unlock either returns the buffer to the native window or // destroys the buffer if the window is already released. - virtual void Unlock() MOZ_OVERRIDE; + virtual void Unlock() MOZ_OVERRIDE + { + if (mLocked) { + // The window might have been destroyed. The buffer is no longer + // valid at that point. + sp window = mNativeWindow.promote(); + if (window.get() && window->returnBuffer(mIndex, mGeneration)) { + mLocked = false; + } else { + // If the window doesn't exist any more, release the buffer + // directly. + ImageBridgeChild *ibc = ImageBridgeChild::GetSingleton(); + ibc->DeallocSurfaceDescriptorGralloc(mSurfaceDescriptor); + } + } + } protected: wp mNativeWindow;