Loading vulkan/libvulkan/swapchain.cpp +18 −6 Original line number Diff line number Diff line Loading @@ -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) { Loading Loading @@ -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) { Loading Loading @@ -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}); Loading Loading @@ -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; Loading Loading
vulkan/libvulkan/swapchain.cpp +18 −6 Original line number Diff line number Diff line Loading @@ -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) { Loading Loading @@ -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) { Loading Loading @@ -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}); Loading Loading @@ -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; Loading