diff options
author | Brian Orr <brianorr@google.com> | 2021-06-15 12:47:53 -0700 |
---|---|---|
committer | Daniel Norman <danielnorman@google.com> | 2021-06-17 13:37:54 -0700 |
commit | 71c831703ae59baf47e0afe611fecd714c481cdf (patch) | |
tree | 06731a987032723085b9e1a65951cf96abbc19cf /libs/hwui/renderthread/VulkanSurface.cpp | |
parent | 065c9e9a6e9d61d4383a91721eb56a3de253bdbe (diff) | |
parent | 81833820d54b9a6b27894f9f8dfd72222d416992 (diff) |
Merge SP1A.210604.001
Change-Id: I5200ee05285ae422d5e9c1c00f45709a5d6188be
Diffstat (limited to 'libs/hwui/renderthread/VulkanSurface.cpp')
-rw-r--r-- | libs/hwui/renderthread/VulkanSurface.cpp | 42 |
1 files changed, 20 insertions, 22 deletions
diff --git a/libs/hwui/renderthread/VulkanSurface.cpp b/libs/hwui/renderthread/VulkanSurface.cpp index 474d2ccf8600..01a2ec5116df 100644 --- a/libs/hwui/renderthread/VulkanSurface.cpp +++ b/libs/hwui/renderthread/VulkanSurface.cpp @@ -20,9 +20,9 @@ #include <SkSurface.h> #include <algorithm> +#include <gui/TraceUtils.h> #include "VulkanManager.h" #include "utils/Color.h" -#include "utils/TraceUtils.h" namespace android { namespace uirenderer { @@ -329,20 +329,16 @@ void VulkanSurface::releaseBuffers() { if (bufferInfo.buffer.get() != nullptr && bufferInfo.dequeued) { int err = mNativeWindow->cancelBuffer(mNativeWindow.get(), bufferInfo.buffer.get(), - bufferInfo.dequeue_fence); + bufferInfo.dequeue_fence.release()); if (err != 0) { ALOGE("cancelBuffer[%u] failed during destroy: %s (%d)", i, strerror(-err), err); } bufferInfo.dequeued = false; - - if (bufferInfo.dequeue_fence >= 0) { - close(bufferInfo.dequeue_fence); - bufferInfo.dequeue_fence = -1; - } + bufferInfo.dequeue_fence.reset(); } LOG_ALWAYS_FATAL_IF(bufferInfo.dequeued); - LOG_ALWAYS_FATAL_IF(bufferInfo.dequeue_fence != -1); + LOG_ALWAYS_FATAL_IF(bufferInfo.dequeue_fence.ok()); bufferInfo.skSurface.reset(); bufferInfo.buffer.clear(); @@ -365,8 +361,12 @@ VulkanSurface::NativeBufferInfo* VulkanSurface::dequeueNativeBuffer() { // Since auto pre-rotation is enabled, dequeueBuffer to get the consumer driven buffer size // from ANativeWindowBuffer. ANativeWindowBuffer* buffer; - int fence_fd; - err = mNativeWindow->dequeueBuffer(mNativeWindow.get(), &buffer, &fence_fd); + base::unique_fd fence_fd; + { + int rawFd = -1; + err = mNativeWindow->dequeueBuffer(mNativeWindow.get(), &buffer, &rawFd); + fence_fd.reset(rawFd); + } if (err != 0) { ALOGE("dequeueBuffer failed: %s (%d)", strerror(-err), err); return nullptr; @@ -387,7 +387,7 @@ VulkanSurface::NativeBufferInfo* VulkanSurface::dequeueNativeBuffer() { if (err != 0) { ALOGE("native_window_set_buffers_transform(%d) failed: %s (%d)", transformHint, strerror(-err), err); - mNativeWindow->cancelBuffer(mNativeWindow.get(), buffer, fence_fd); + mNativeWindow->cancelBuffer(mNativeWindow.get(), buffer, fence_fd.release()); return nullptr; } mWindowInfo.transform = transformHint; @@ -405,19 +405,19 @@ VulkanSurface::NativeBufferInfo* VulkanSurface::dequeueNativeBuffer() { for (idx = 0; idx < mWindowInfo.bufferCount; idx++) { if (mNativeBuffers[idx].buffer.get() == buffer) { mNativeBuffers[idx].dequeued = true; - mNativeBuffers[idx].dequeue_fence = fence_fd; + mNativeBuffers[idx].dequeue_fence = std::move(fence_fd); break; } else if (mNativeBuffers[idx].buffer.get() == nullptr) { // increasing the number of buffers we have allocated mNativeBuffers[idx].buffer = buffer; mNativeBuffers[idx].dequeued = true; - mNativeBuffers[idx].dequeue_fence = fence_fd; + mNativeBuffers[idx].dequeue_fence = std::move(fence_fd); break; } } if (idx == mWindowInfo.bufferCount) { ALOGE("dequeueBuffer returned unrecognized buffer"); - mNativeWindow->cancelBuffer(mNativeWindow.get(), buffer, fence_fd); + mNativeWindow->cancelBuffer(mNativeWindow.get(), buffer, fence_fd.release()); return nullptr; } @@ -429,7 +429,7 @@ VulkanSurface::NativeBufferInfo* VulkanSurface::dequeueNativeBuffer() { kTopLeft_GrSurfaceOrigin, mWindowInfo.colorspace, nullptr); if (bufferInfo->skSurface.get() == nullptr) { ALOGE("SkSurface::MakeFromAHardwareBuffer failed"); - mNativeWindow->cancelBuffer(mNativeWindow.get(), buffer, fence_fd); + mNativeWindow->cancelBuffer(mNativeWindow.get(), buffer, fence_fd.release()); return nullptr; } } @@ -460,25 +460,23 @@ bool VulkanSurface::presentCurrentBuffer(const SkRect& dirtyRect, int semaphoreF LOG_ALWAYS_FATAL_IF(!mCurrentBufferInfo); VulkanSurface::NativeBufferInfo& currentBuffer = *mCurrentBufferInfo; - int queuedFd = (semaphoreFd != -1) ? semaphoreFd : currentBuffer.dequeue_fence; + // queueBuffer always closes fence, even on error + int queuedFd = (semaphoreFd != -1) ? semaphoreFd : currentBuffer.dequeue_fence.release(); int err = mNativeWindow->queueBuffer(mNativeWindow.get(), currentBuffer.buffer.get(), queuedFd); currentBuffer.dequeued = false; - // queueBuffer always closes fence, even on error if (err != 0) { ALOGE("queueBuffer failed: %s (%d)", strerror(-err), err); + // cancelBuffer takes ownership of the fence mNativeWindow->cancelBuffer(mNativeWindow.get(), currentBuffer.buffer.get(), - currentBuffer.dequeue_fence); + currentBuffer.dequeue_fence.release()); } else { currentBuffer.hasValidContents = true; currentBuffer.lastPresentedCount = mPresentCount; mPresentCount++; } - if (currentBuffer.dequeue_fence >= 0) { - close(currentBuffer.dequeue_fence); - currentBuffer.dequeue_fence = -1; - } + currentBuffer.dequeue_fence.reset(); return err == 0; } |