Loading vulkan/libvulkan/swapchain.cpp +33 −16 Original line number Original line Diff line number Diff line Loading @@ -537,6 +537,30 @@ android_dataspace GetNativeDataspace(VkColorSpaceKHR colorspace) { } } } } int get_min_buffer_count(ANativeWindow* window, uint32_t* out_min_buffer_count) { constexpr int kExtraBuffers = 2; int err; int min_undequeued_buffers; err = window->query(window, NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS, &min_undequeued_buffers); if (err != android::OK || min_undequeued_buffers < 0) { ALOGE( "NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS query failed: %s (%d) " "value=%d", strerror(-err), err, min_undequeued_buffers); if (err == android::OK) { err = android::UNKNOWN_ERROR; } return err; } *out_min_buffer_count = static_cast<uint32_t>(min_undequeued_buffers + kExtraBuffers); return android::OK; } } // anonymous namespace } // anonymous namespace VKAPI_ATTR VKAPI_ATTR Loading Loading @@ -848,15 +872,13 @@ VkResult GetPhysicalDeviceSurfacePresentModesKHR(VkPhysicalDevice pdev, int err; int err; int query_value; int query_value; uint32_t min_buffer_count; ANativeWindow* window = SurfaceFromHandle(surface)->window.get(); ANativeWindow* window = SurfaceFromHandle(surface)->window.get(); err = window->query(window, NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS, &query_value); err = get_min_buffer_count(window, &min_buffer_count); if (err != android::OK || query_value < 0) { if (err != android::OK) { ALOGE("NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS query failed: %s (%d) value=%d", strerror(-err), err, query_value); return VK_ERROR_SURFACE_LOST_KHR; return VK_ERROR_SURFACE_LOST_KHR; } } uint32_t min_undequeued_buffers = static_cast<uint32_t>(query_value); err = window->query(window, NATIVE_WINDOW_MAX_BUFFER_COUNT, &query_value); err = window->query(window, NATIVE_WINDOW_MAX_BUFFER_COUNT, &query_value); if (err != android::OK || query_value < 0) { if (err != android::OK || query_value < 0) { Loading @@ -867,7 +889,7 @@ VkResult GetPhysicalDeviceSurfacePresentModesKHR(VkPhysicalDevice pdev, uint32_t max_buffer_count = static_cast<uint32_t>(query_value); uint32_t max_buffer_count = static_cast<uint32_t>(query_value); std::vector<VkPresentModeKHR> present_modes; std::vector<VkPresentModeKHR> present_modes; if (min_undequeued_buffers + 1 < max_buffer_count) if (min_buffer_count < max_buffer_count) present_modes.push_back(VK_PRESENT_MODE_MAILBOX_KHR); present_modes.push_back(VK_PRESENT_MODE_MAILBOX_KHR); present_modes.push_back(VK_PRESENT_MODE_FIFO_KHR); present_modes.push_back(VK_PRESENT_MODE_FIFO_KHR); Loading Loading @@ -1188,19 +1210,14 @@ VkResult CreateSwapchainKHR(VkDevice device, } } } } int query_value; uint32_t min_buffer_count; err = window->query(window, NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS, err = get_min_buffer_count(window, &min_buffer_count); &query_value); if (err != android::OK) { if (err != android::OK || query_value < 0) { ALOGE("window->query failed: %s (%d) value=%d", strerror(-err), err, query_value); return VK_ERROR_SURFACE_LOST_KHR; return VK_ERROR_SURFACE_LOST_KHR; } } uint32_t min_undequeued_buffers = static_cast<uint32_t>(query_value); uint32_t num_images = uint32_t num_images = (swap_interval ? create_info->minImageCount std::max(min_buffer_count, create_info->minImageCount); : std::max(3u, create_info->minImageCount)) - 1 + min_undequeued_buffers; // Lower layer insists that we have at least two buffers. This is wasteful // Lower layer insists that we have at least two buffers. This is wasteful // and we'd like to relax it in the shared case, but not all the pieces are // and we'd like to relax it in the shared case, but not all the pieces are Loading Loading
vulkan/libvulkan/swapchain.cpp +33 −16 Original line number Original line Diff line number Diff line Loading @@ -537,6 +537,30 @@ android_dataspace GetNativeDataspace(VkColorSpaceKHR colorspace) { } } } } int get_min_buffer_count(ANativeWindow* window, uint32_t* out_min_buffer_count) { constexpr int kExtraBuffers = 2; int err; int min_undequeued_buffers; err = window->query(window, NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS, &min_undequeued_buffers); if (err != android::OK || min_undequeued_buffers < 0) { ALOGE( "NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS query failed: %s (%d) " "value=%d", strerror(-err), err, min_undequeued_buffers); if (err == android::OK) { err = android::UNKNOWN_ERROR; } return err; } *out_min_buffer_count = static_cast<uint32_t>(min_undequeued_buffers + kExtraBuffers); return android::OK; } } // anonymous namespace } // anonymous namespace VKAPI_ATTR VKAPI_ATTR Loading Loading @@ -848,15 +872,13 @@ VkResult GetPhysicalDeviceSurfacePresentModesKHR(VkPhysicalDevice pdev, int err; int err; int query_value; int query_value; uint32_t min_buffer_count; ANativeWindow* window = SurfaceFromHandle(surface)->window.get(); ANativeWindow* window = SurfaceFromHandle(surface)->window.get(); err = window->query(window, NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS, &query_value); err = get_min_buffer_count(window, &min_buffer_count); if (err != android::OK || query_value < 0) { if (err != android::OK) { ALOGE("NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS query failed: %s (%d) value=%d", strerror(-err), err, query_value); return VK_ERROR_SURFACE_LOST_KHR; return VK_ERROR_SURFACE_LOST_KHR; } } uint32_t min_undequeued_buffers = static_cast<uint32_t>(query_value); err = window->query(window, NATIVE_WINDOW_MAX_BUFFER_COUNT, &query_value); err = window->query(window, NATIVE_WINDOW_MAX_BUFFER_COUNT, &query_value); if (err != android::OK || query_value < 0) { if (err != android::OK || query_value < 0) { Loading @@ -867,7 +889,7 @@ VkResult GetPhysicalDeviceSurfacePresentModesKHR(VkPhysicalDevice pdev, uint32_t max_buffer_count = static_cast<uint32_t>(query_value); uint32_t max_buffer_count = static_cast<uint32_t>(query_value); std::vector<VkPresentModeKHR> present_modes; std::vector<VkPresentModeKHR> present_modes; if (min_undequeued_buffers + 1 < max_buffer_count) if (min_buffer_count < max_buffer_count) present_modes.push_back(VK_PRESENT_MODE_MAILBOX_KHR); present_modes.push_back(VK_PRESENT_MODE_MAILBOX_KHR); present_modes.push_back(VK_PRESENT_MODE_FIFO_KHR); present_modes.push_back(VK_PRESENT_MODE_FIFO_KHR); Loading Loading @@ -1188,19 +1210,14 @@ VkResult CreateSwapchainKHR(VkDevice device, } } } } int query_value; uint32_t min_buffer_count; err = window->query(window, NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS, err = get_min_buffer_count(window, &min_buffer_count); &query_value); if (err != android::OK) { if (err != android::OK || query_value < 0) { ALOGE("window->query failed: %s (%d) value=%d", strerror(-err), err, query_value); return VK_ERROR_SURFACE_LOST_KHR; return VK_ERROR_SURFACE_LOST_KHR; } } uint32_t min_undequeued_buffers = static_cast<uint32_t>(query_value); uint32_t num_images = uint32_t num_images = (swap_interval ? create_info->minImageCount std::max(min_buffer_count, create_info->minImageCount); : std::max(3u, create_info->minImageCount)) - 1 + min_undequeued_buffers; // Lower layer insists that we have at least two buffers. This is wasteful // Lower layer insists that we have at least two buffers. This is wasteful // and we'd like to relax it in the shared case, but not all the pieces are // and we'd like to relax it in the shared case, but not all the pieces are Loading