diff --git a/gfx/gl/SharedSurfaceGralloc.cpp b/gfx/gl/SharedSurfaceGralloc.cpp index 329e0a0fd8ad..8d4353fb375c 100644 --- a/gfx/gl/SharedSurfaceGralloc.cpp +++ b/gfx/gl/SharedSurfaceGralloc.cpp @@ -194,9 +194,7 @@ SharedSurface_Gralloc::Fence() int fenceFd = mEGL->fDupNativeFenceFDANDROID(mEGL->Display(), sync); if (fenceFd != -1) { mEGL->fDestroySync(mEGL->Display(), sync); - android::sp fence(new android::Fence(fenceFd)); - FenceHandle handle = FenceHandle(fence); - mTextureClient->SetAcquireFenceHandle(handle); + mTextureClient->SetAcquireFenceHandle(FenceHandle(new FenceHandle::FdObj(fenceFd))); } else { mSync = sync; } diff --git a/gfx/layers/client/TextureClient.h b/gfx/layers/client/TextureClient.h index ae6095666824..4f27ec6b9da1 100644 --- a/gfx/layers/client/TextureClient.h +++ b/gfx/layers/client/TextureClient.h @@ -428,17 +428,19 @@ public: */ void ForceRemove(bool sync = false); - virtual void SetReleaseFenceHandle(FenceHandle aReleaseFenceHandle) + virtual void SetReleaseFenceHandle(const FenceHandle& aReleaseFenceHandle) { mReleaseFenceHandle.Merge(aReleaseFenceHandle); } - const FenceHandle& GetReleaseFenceHandle() const + FenceHandle GetAndResetReleaseFenceHandle() { - return mReleaseFenceHandle; + FenceHandle fence; + mReleaseFenceHandle.TransferToAnotherFenceHandle(fence); + return fence; } - virtual void SetAcquireFenceHandle(FenceHandle aAcquireFenceHandle) + virtual void SetAcquireFenceHandle(const FenceHandle& aAcquireFenceHandle) { mAcquireFenceHandle = aAcquireFenceHandle; } diff --git a/gfx/layers/opengl/GrallocTextureClient.cpp b/gfx/layers/opengl/GrallocTextureClient.cpp index 8d3cae28f567..ccfb225016fd 100644 --- a/gfx/layers/opengl/GrallocTextureClient.cpp +++ b/gfx/layers/opengl/GrallocTextureClient.cpp @@ -91,7 +91,8 @@ GrallocTextureClientOGL::WaitForBufferOwnership(bool aWaitReleaseFence) #if defined(MOZ_WIDGET_GONK) && ANDROID_VERSION >= 17 if (mReleaseFenceHandle.IsValid()) { - android::sp fence = mReleaseFenceHandle.mFence; + nsRefPtr fdObj = mReleaseFenceHandle.GetAndResetFdObj(); + android::sp fence = new Fence(fdObj->GetAndResetFd()); #if ANDROID_VERSION == 17 fence->waitForever(1000, "GrallocTextureClientOGL::Lock"); // 1000 is what Android uses. It is a warning timeout in ms. @@ -130,14 +131,10 @@ GrallocTextureClientOGL::Lock(OpenMode aMode) usage |= GRALLOC_USAGE_SW_WRITE_OFTEN; } #if defined(MOZ_WIDGET_GONK) && ANDROID_VERSION >= 21 - android::sp fence = android::Fence::NO_FENCE; - if (mReleaseFenceHandle.IsValid()) { - fence = mReleaseFenceHandle.mFence; - } - mReleaseFenceHandle = FenceHandle(); + nsRefPtr fdObj = mReleaseFenceHandle.GetAndResetFdObj(); int32_t rv = mGraphicBuffer->lockAsync(usage, reinterpret_cast(&mMappedBuffer), - fence->dup()); + fdObj->GetAndResetFd()); #else int32_t rv = mGraphicBuffer->lock(usage, reinterpret_cast(&mMappedBuffer)); diff --git a/widget/gonk/nativewindow/GonkNativeWindowJB.cpp b/widget/gonk/nativewindow/GonkNativeWindowJB.cpp index ee6f2669f8e4..33b6861a9260 100644 --- a/widget/gonk/nativewindow/GonkNativeWindowJB.cpp +++ b/widget/gonk/nativewindow/GonkNativeWindowJB.cpp @@ -146,10 +146,9 @@ void GonkNativeWindow::returnBuffer(TextureClient* client) { if (index < 0) { } - sp fence = client->GetReleaseFenceHandle().mFence; - if (!fence.get()) { - fence = Fence::NO_FENCE; - } + FenceHandle handle = client->GetAndResetReleaseFenceHandle(); + nsRefPtr fdObj = handle.GetAndResetFdObj(); + sp fence = new Fence(fdObj->GetAndResetFd()); addReleaseFenceLocked(index, fence); diff --git a/widget/gonk/nativewindow/GonkNativeWindowKK.cpp b/widget/gonk/nativewindow/GonkNativeWindowKK.cpp index dce3cf664bd7..38635672d0e2 100644 --- a/widget/gonk/nativewindow/GonkNativeWindowKK.cpp +++ b/widget/gonk/nativewindow/GonkNativeWindowKK.cpp @@ -146,10 +146,9 @@ void GonkNativeWindow::returnBuffer(TextureClient* client) { if (index < 0) { } - sp fence = client->GetReleaseFenceHandle().mFence; - if (!fence.get()) { - fence = Fence::NO_FENCE; - } + FenceHandle handle = client->GetAndResetReleaseFenceHandle(); + nsRefPtr fdObj = handle.GetAndResetFdObj(); + sp fence = new Fence(fdObj->GetAndResetFd()); addReleaseFenceLocked(index, mSlots[index].mGraphicBuffer, diff --git a/widget/gonk/nativewindow/GonkNativeWindowLL.cpp b/widget/gonk/nativewindow/GonkNativeWindowLL.cpp index 0cccc9d76b94..2dd817e6ee64 100644 --- a/widget/gonk/nativewindow/GonkNativeWindowLL.cpp +++ b/widget/gonk/nativewindow/GonkNativeWindowLL.cpp @@ -158,10 +158,9 @@ void GonkNativeWindow::returnBuffer(TextureClient* client) { return; } - sp fence = client->GetReleaseFenceHandle().mFence; - if (!fence.get()) { - fence = Fence::NO_FENCE; - } + FenceHandle handle = client->GetAndResetReleaseFenceHandle(); + nsRefPtr fdObj = handle.GetAndResetFdObj(); + sp fence = new Fence(fdObj->GetAndResetFd()); status_t err; err = addReleaseFenceLocked(index,