Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1e480e30 authored by Stan Iliev's avatar Stan Iliev Committed by Android (Google) Code Review
Browse files

Merge changes from topic "vkDequeueReleaseFence"

* changes:
  Block GPU on dequeue fence only if it has not signalled already
  Block GPU on release fence from dequeueBuffer earlier
parents f76cdad4 197843d0
Loading
Loading
Loading
Loading
+41 −28
Original line number Diff line number Diff line
@@ -439,9 +439,17 @@ Frame VulkanManager::dequeueNextBuffer(VulkanSurface* surface) {
    LOG_ALWAYS_FATAL_IF(!bufferInfo->dequeued);

    if (bufferInfo->dequeue_fence != -1) {
        struct sync_file_info* finfo = sync_file_info(bufferInfo->dequeue_fence);
        bool isSignalPending = false;
        if (finfo != NULL) {
            isSignalPending = finfo->status != 1;
            sync_file_info_free(finfo);
        }
        if (isSignalPending) {
            int fence_clone = dup(bufferInfo->dequeue_fence);
            if (fence_clone == -1) {
            ALOGE("dup(fence) failed, stalling until signalled: %s (%d)", strerror(errno), errno);
                ALOGE("dup(fence) failed, stalling until signalled: %s (%d)", strerror(errno),
                      errno);
                sync_wait(bufferInfo->dequeue_fence, -1 /* forever */);
            } else {
                VkSemaphoreCreateInfo semaphoreInfo;
@@ -467,6 +475,11 @@ Frame VulkanManager::dequeueNextBuffer(VulkanSurface* surface) {
                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->flush();
            }
        }
    }