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

Commit 2d37ea9a authored by Yiwei Zhang's avatar Yiwei Zhang Committed by Automerger Merge Worker
Browse files

Merge "swapchain: avoid redundant disconnect/connect for new surface" into udc-dev am: 77acb94b

parents 9cc919b5 77acb94b
Loading
Loading
Loading
Loading
+18 −6
Original line number Diff line number Diff line
@@ -227,6 +227,10 @@ struct Surface {
    android::sp<ANativeWindow> window;
    VkSwapchainKHR swapchain_handle;
    uint64_t consumer_usage;

    // Indicate whether this surface has been used by a swapchain, no matter the
    // swapchain is still current or has been destroyed.
    bool used_by_swapchain;
};

VkSurfaceKHR HandleFromSurface(Surface* surface) {
@@ -601,6 +605,7 @@ VkResult CreateAndroidSurfaceKHR(

    surface->window = pCreateInfo->window;
    surface->swapchain_handle = VK_NULL_HANDLE;
    surface->used_by_swapchain = false;
    int err = native_window_get_consumer_usage(surface->window.get(),
                                               &surface->consumer_usage);
    if (err != android::OK) {
@@ -1394,14 +1399,20 @@ VkResult CreateSwapchainKHR(VkDevice device,
    // orphans the previous buffers, getting us back to the state where we can
    // dequeue all buffers.
    //
    // This is not necessary if the surface was never used previously.
    //
    // TODO(http://b/134186185) recycle swapchain images more efficiently
    ANativeWindow* window = surface.window.get();
    if (surface.used_by_swapchain) {
        err = native_window_api_disconnect(window, NATIVE_WINDOW_API_EGL);
    ALOGW_IF(err != android::OK, "native_window_api_disconnect failed: %s (%d)",
             strerror(-err), err);
        ALOGW_IF(err != android::OK,
                 "native_window_api_disconnect failed: %s (%d)", strerror(-err),
                 err);
        err = native_window_api_connect(window, NATIVE_WINDOW_API_EGL);
    ALOGW_IF(err != android::OK, "native_window_api_connect failed: %s (%d)",
             strerror(-err), err);
        ALOGW_IF(err != android::OK,
                 "native_window_api_connect failed: %s (%d)", strerror(-err),
                 err);
    }

    err =
        window->perform(window, NATIVE_WINDOW_SET_DEQUEUE_TIMEOUT, nsecs_t{-1});
@@ -1787,6 +1798,7 @@ VkResult CreateSwapchainKHR(VkDevice device,
    android::GraphicsEnv::getInstance().setTargetStats(
        android::GpuStatsInfo::Stats::CREATED_VULKAN_SWAPCHAIN);

    surface.used_by_swapchain = true;
    surface.swapchain_handle = HandleFromSwapchain(swapchain);
    *swapchain_handle = surface.swapchain_handle;
    return VK_SUCCESS;