summaryrefslogtreecommitdiff
path: root/libs/hwui/renderthread/VulkanManager.cpp
diff options
context:
space:
mode:
authorDaniel Norman <danielnorman@google.com>2021-06-18 15:33:36 -0700
committerScott Lobdell <slobdell@google.com>2021-06-21 23:21:54 +0000
commitb6d6690a3594cd78966e26508247d4ab1b66776f (patch)
tree43afd0520ff98b8729b5c8f73ef2ee1c7e77041a /libs/hwui/renderthread/VulkanManager.cpp
parent71c831703ae59baf47e0afe611fecd714c481cdf (diff)
parent233ce9ef453bc7b47f7ac5d0eb1d5fda0ce845ab (diff)
Merge SP1A.210616.001
Change-Id: I9acdc955f698dbebb8fad19cfd5cb71fcdd27b45
Diffstat (limited to 'libs/hwui/renderthread/VulkanManager.cpp')
-rw-r--r--libs/hwui/renderthread/VulkanManager.cpp58
1 files changed, 36 insertions, 22 deletions
diff --git a/libs/hwui/renderthread/VulkanManager.cpp b/libs/hwui/renderthread/VulkanManager.cpp
index 5a718330d68f..f70149111116 100644
--- a/libs/hwui/renderthread/VulkanManager.cpp
+++ b/libs/hwui/renderthread/VulkanManager.cpp
@@ -425,27 +425,38 @@ Frame VulkanManager::dequeueNextBuffer(VulkanSurface* surface) {
semaphoreInfo.flags = 0;
VkSemaphore semaphore;
VkResult err = mCreateSemaphore(mDevice, &semaphoreInfo, nullptr, &semaphore);
- LOG_ALWAYS_FATAL_IF(VK_SUCCESS != err, "Failed to create import semaphore, err: %d",
- err);
-
- VkImportSemaphoreFdInfoKHR importInfo;
- importInfo.sType = VK_STRUCTURE_TYPE_IMPORT_SEMAPHORE_FD_INFO_KHR;
- importInfo.pNext = nullptr;
- importInfo.semaphore = semaphore;
- importInfo.flags = VK_SEMAPHORE_IMPORT_TEMPORARY_BIT;
- importInfo.handleType = VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT;
- importInfo.fd = fence_clone;
-
- err = mImportSemaphoreFdKHR(mDevice, &importInfo);
- LOG_ALWAYS_FATAL_IF(VK_SUCCESS != err, "Failed to import semaphore, err: %d", err);
-
- GrBackendSemaphore backendSemaphore;
- backendSemaphore.initVulkan(semaphore);
- bufferInfo->skSurface->wait(1, &backendSemaphore);
- // The following flush blocks the GPU immediately instead of waiting for other
- // drawing ops. It seems dequeue_fence is not respected otherwise.
- // TODO: remove the flush after finding why backendSemaphore is not working.
- bufferInfo->skSurface->flushAndSubmit();
+ if (err != VK_SUCCESS) {
+ ALOGE("Failed to create import semaphore, err: %d", err);
+ close(fence_clone);
+ sync_wait(bufferInfo->dequeue_fence, -1 /* forever */);
+ } else {
+ VkImportSemaphoreFdInfoKHR importInfo;
+ importInfo.sType = VK_STRUCTURE_TYPE_IMPORT_SEMAPHORE_FD_INFO_KHR;
+ importInfo.pNext = nullptr;
+ importInfo.semaphore = semaphore;
+ importInfo.flags = VK_SEMAPHORE_IMPORT_TEMPORARY_BIT;
+ importInfo.handleType = VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT;
+ importInfo.fd = fence_clone;
+
+ err = mImportSemaphoreFdKHR(mDevice, &importInfo);
+ if (err != VK_SUCCESS) {
+ ALOGE("Failed to import semaphore, err: %d", err);
+ mDestroySemaphore(mDevice, semaphore, nullptr);
+ close(fence_clone);
+ sync_wait(bufferInfo->dequeue_fence, -1 /* forever */);
+ } else {
+ GrBackendSemaphore backendSemaphore;
+ backendSemaphore.initVulkan(semaphore);
+ // Skia will take ownership of the VkSemaphore and delete it once the wait
+ // has finished. The VkSemaphore also owns the imported fd, so it will
+ // close the fd when it is deleted.
+ bufferInfo->skSurface->wait(1, &backendSemaphore);
+ // The following flush blocks the GPU immediately instead of waiting for
+ // other drawing ops. It seems dequeue_fence is not respected otherwise.
+ // TODO: remove the flush after finding why backendSemaphore is not working.
+ bufferInfo->skSurface->flushAndSubmit();
+ }
+ }
}
}
}
@@ -621,6 +632,7 @@ status_t VulkanManager::fenceWait(int fence, GrDirectContext* grContext) {
VkSemaphore semaphore;
VkResult err = mCreateSemaphore(mDevice, &semaphoreInfo, nullptr, &semaphore);
if (VK_SUCCESS != err) {
+ close(fenceFd);
ALOGE("Failed to create import semaphore, err: %d", err);
return UNKNOWN_ERROR;
}
@@ -635,6 +647,7 @@ status_t VulkanManager::fenceWait(int fence, GrDirectContext* grContext) {
err = mImportSemaphoreFdKHR(mDevice, &importInfo);
if (VK_SUCCESS != err) {
mDestroySemaphore(mDevice, semaphore, nullptr);
+ close(fenceFd);
ALOGE("Failed to import semaphore, err: %d", err);
return UNKNOWN_ERROR;
}
@@ -642,7 +655,8 @@ status_t VulkanManager::fenceWait(int fence, GrDirectContext* grContext) {
GrBackendSemaphore beSemaphore;
beSemaphore.initVulkan(semaphore);
- // Skia takes ownership of the semaphore and will delete it once the wait has finished.
+ // Skia will take ownership of the VkSemaphore and delete it once the wait has finished. The
+ // VkSemaphore also owns the imported fd, so it will close the fd when it is deleted.
grContext->wait(1, &beSemaphore);
grContext->flushAndSubmit();