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

Commit 148a1b45 authored by Jesse Hall's avatar Jesse Hall Committed by Android (Google) Code Review
Browse files

Merge "libvulkan: Un-revert and fix VK_PRESENT_MODE_MAILBOX_KHR" into nyc-dev

parents 45ba96e4 0ae0dcec
Loading
Loading
Loading
Loading
+22 −2
Original line number Diff line number Diff line
@@ -350,8 +350,10 @@ VkResult CreateSwapchainKHR_Bottom(VkDevice device,
             "swapchain re-creation not yet implemented");
    ALOGE_IF(create_info->preTransform != VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR,
             "swapchain preTransform not yet implemented");
    ALOGE_IF(create_info->presentMode != VK_PRESENT_MODE_FIFO_KHR,
             "present modes other than FIFO are not yet implemented");
    ALOGW_IF(!(create_info->presentMode == VK_PRESENT_MODE_FIFO_KHR ||
               create_info->presentMode == VK_PRESENT_MODE_MAILBOX_KHR),
             "swapchain present mode %d not supported",
             create_info->presentMode);

    // -- Configure the native window --

@@ -390,6 +392,13 @@ VkResult CreateSwapchainKHR_Bottom(VkDevice device,
        ALOGE("window->query failed: %s (%d)", strerror(-err), err);
        return VK_ERROR_INITIALIZATION_FAILED;
    }
    // The MIN_UNDEQUEUED_BUFFERS query doesn't know whether we'll be using
    // async mode or not, and assumes not. But in async mode, the BufferQueue
    // requires an extra undequeued buffer.
    // See BufferQueueCore::getMinUndequeuedBufferCountLocked().
    if (create_info->presentMode == VK_PRESENT_MODE_MAILBOX_KHR)
        min_undequeued_buffers += 1;

    uint32_t num_images =
        (create_info->minImageCount - 1) + min_undequeued_buffers;
    err = native_window_set_buffer_count(surface.window.get(), num_images);
@@ -422,6 +431,17 @@ VkResult CreateSwapchainKHR_Bottom(VkDevice device,
        return VK_ERROR_INITIALIZATION_FAILED;
    }

    err = surface.window->setSwapInterval(
        surface.window.get(),
        create_info->presentMode == VK_PRESENT_MODE_MAILBOX_KHR ? 0 : 1);
    if (err != 0) {
        // TODO(jessehall): Improve error reporting. Can we enumerate possible
        // errors and translate them to valid Vulkan result codes?
        ALOGE("native_window->setSwapInterval failed: %s (%d)", strerror(-err),
              err);
        return VK_ERROR_INITIALIZATION_FAILED;
    }

    // -- Allocate our Swapchain object --
    // After this point, we must deallocate the swapchain on error.