From ad4c60d6b87eb92191c638bf52ad38e7dd59f627 Mon Sep 17 00:00:00 2001 From: Jason Ekstrand Date: Thu, 16 Nov 2017 09:30:16 -0800 Subject: [PATCH] vulkan/wsi: Move prime blitting into queue_present This lets us save a QueueSubmit and it also makes prime a lot less X11-specific. Also, it means we can only wait on the semaphores once instead of on every blit. Reviewed-by: Dave Airlie --- src/vulkan/wsi/wsi_common.c | 41 ++++++++++------------------- src/vulkan/wsi/wsi_common.h | 5 ++-- src/vulkan/wsi/wsi_common_private.h | 7 ----- src/vulkan/wsi/wsi_common_wayland.c | 3 --- src/vulkan/wsi/wsi_common_x11.c | 25 +++--------------- 5 files changed, 19 insertions(+), 62 deletions(-) diff --git a/src/vulkan/wsi/wsi_common.c b/src/vulkan/wsi/wsi_common.c index ea4920c6fe3..d420e48a007 100644 --- a/src/vulkan/wsi/wsi_common.c +++ b/src/vulkan/wsi/wsi_common.c @@ -84,6 +84,7 @@ wsi_swapchain_init(const struct wsi_device *wsi, chain->wsi = wsi; chain->device = device; chain->alloc = *pAllocator; + chain->use_prime_blit = false; chain->cmd_pools = vk_zalloc(pAllocator, sizeof(VkCommandPool) * wsi->queue_family_count, 8, @@ -483,30 +484,6 @@ wsi_destroy_image(const struct wsi_swapchain *chain, wsi->DestroyBuffer(chain->device, image->prime.buffer, &chain->alloc); } -VkResult -wsi_prime_image_blit_to_linear(const struct wsi_swapchain *chain, - struct wsi_image *image, - VkQueue queue, - uint32_t waitSemaphoreCount, - const VkSemaphore *pWaitSemaphores) -{ - uint32_t queue_family = chain->wsi->queue_get_family_index(queue); - - VkPipelineStageFlags stage_flags = VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT; - const VkSubmitInfo submit_info = { - .sType = VK_STRUCTURE_TYPE_SUBMIT_INFO, - .pNext = NULL, - .waitSemaphoreCount = waitSemaphoreCount, - .pWaitSemaphores = pWaitSemaphores, - .pWaitDstStageMask = &stage_flags, - .commandBufferCount = 1, - .pCommandBuffers = &image->prime.blit_cmd_buffers[queue_family], - .signalSemaphoreCount = 0, - .pSignalSemaphores = NULL, - }; - return chain->wsi->QueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE); -} - VkResult wsi_common_get_images(VkSwapchainKHR _swapchain, uint32_t *pSwapchainImageCount, @@ -559,6 +536,7 @@ wsi_common_queue_present(const struct wsi_device *wsi, .sType = VK_STRUCTURE_TYPE_SUBMIT_INFO, .pNext = NULL, }; + VkPipelineStageFlags *stage_flags = NULL; if (i == 0) { /* We only need/want to wait on semaphores once. After that, we're @@ -582,6 +560,18 @@ wsi_common_queue_present(const struct wsi_device *wsi, submit_info.pWaitDstStageMask = stage_flags; } + + if (swapchain->use_prime_blit) { + /* If we are using prime blits, we need to perform the blit now. The + * command buffer is attached to the image. + */ + struct wsi_image *image = + swapchain->get_wsi_image(swapchain, pPresentInfo->pImageIndices[i]); + submit_info.commandBufferCount = 1; + submit_info.pCommandBuffers = + &image->prime.blit_cmd_buffers[queue_family_index]; + } + result = wsi->QueueSubmit(queue, 1, &submit_info, swapchain->fences[0]); vk_free(&swapchain->alloc, stage_flags); if (result != VK_SUCCESS) @@ -592,9 +582,6 @@ wsi_common_queue_present(const struct wsi_device *wsi, region = ®ions->pRegions[i]; result = swapchain->queue_present(swapchain, - queue, - pPresentInfo->waitSemaphoreCount, - pPresentInfo->pWaitSemaphores, pPresentInfo->pImageIndices[i], region); if (result != VK_SUCCESS) diff --git a/src/vulkan/wsi/wsi_common.h b/src/vulkan/wsi/wsi_common.h index 892e708671b..9ff28e76f33 100644 --- a/src/vulkan/wsi/wsi_common.h +++ b/src/vulkan/wsi/wsi_common.h @@ -59,6 +59,8 @@ struct wsi_swapchain { VkPresentModeKHR present_mode; uint32_t image_count; + bool use_prime_blit; + /* Command pools, one per queue family */ VkCommandPool *cmd_pools; @@ -70,9 +72,6 @@ struct wsi_swapchain { uint64_t timeout, VkSemaphore semaphore, uint32_t *image_index); VkResult (*queue_present)(struct wsi_swapchain *swap_chain, - VkQueue queue, - uint32_t waitSemaphoreCount, - const VkSemaphore *pWaitSemaphores, uint32_t image_index, const VkPresentRegionKHR *damage); }; diff --git a/src/vulkan/wsi/wsi_common_private.h b/src/vulkan/wsi/wsi_common_private.h index ff8ca2a4b20..28abf6c232e 100644 --- a/src/vulkan/wsi/wsi_common_private.h +++ b/src/vulkan/wsi/wsi_common_private.h @@ -64,11 +64,4 @@ void wsi_destroy_image(const struct wsi_swapchain *chain, struct wsi_image *image); -VkResult -wsi_prime_image_blit_to_linear(const struct wsi_swapchain *chain, - struct wsi_image *image, - VkQueue queue, - uint32_t waitSemaphoreCount, - const VkSemaphore *pWaitSemaphores); - #endif /* WSI_COMMON_PRIVATE_H */ diff --git a/src/vulkan/wsi/wsi_common_wayland.c b/src/vulkan/wsi/wsi_common_wayland.c index bf60a9be826..fed2e8f912e 100644 --- a/src/vulkan/wsi/wsi_common_wayland.c +++ b/src/vulkan/wsi/wsi_common_wayland.c @@ -644,9 +644,6 @@ static const struct wl_callback_listener frame_listener = { static VkResult wsi_wl_swapchain_queue_present(struct wsi_swapchain *wsi_chain, - VkQueue queue, - uint32_t waitSemaphoreCount, - const VkSemaphore *pWaitSemaphores, uint32_t image_index, const VkPresentRegionKHR *damage) { diff --git a/src/vulkan/wsi/wsi_common_x11.c b/src/vulkan/wsi/wsi_common_x11.c index 8860d8edb6e..04ce810e561 100644 --- a/src/vulkan/wsi/wsi_common_x11.c +++ b/src/vulkan/wsi/wsi_common_x11.c @@ -625,8 +625,6 @@ struct x11_image { struct x11_swapchain { struct wsi_swapchain base; - bool use_prime_blit; - xcb_connection_t * conn; xcb_window_t window; xcb_gc_t gc; @@ -862,24 +860,10 @@ x11_acquire_next_image(struct wsi_swapchain *anv_chain, static VkResult x11_queue_present(struct wsi_swapchain *anv_chain, - VkQueue queue, - uint32_t waitSemaphoreCount, - const VkSemaphore *pWaitSemaphores, uint32_t image_index, const VkPresentRegionKHR *damage) { struct x11_swapchain *chain = (struct x11_swapchain *)anv_chain; - VkResult result; - - if (chain->use_prime_blit) { - result = wsi_prime_image_blit_to_linear(&chain->base, - &chain->images[image_index].base, - queue, - waitSemaphoreCount, - pWaitSemaphores); - if (result != VK_SUCCESS) - return result; - } if (chain->threaded) { wsi_queue_push(&chain->present_queue, image_index); @@ -947,7 +931,7 @@ x11_image_init(VkDevice device_h, struct x11_swapchain *chain, VkResult result; uint32_t bpp = 32; - if (chain->use_prime_blit) { + if (chain->base.use_prime_blit) { result = wsi_create_prime_image(&chain->base, pCreateInfo, &image->base); } else { result = wsi_create_native_image(&chain->base, pCreateInfo, &image->base); @@ -1104,11 +1088,8 @@ x11_surface_create_swapchain(VkIcdSurfaceBase *icd_surface, chain->threaded = false; chain->status = VK_SUCCESS; - - chain->use_prime_blit = false; - if (!wsi_x11_check_dri3_compatible(conn, local_fd)) { - chain->use_prime_blit = true; - } + if (!wsi_x11_check_dri3_compatible(conn, local_fd)) + chain->base.use_prime_blit = true; chain->event_id = xcb_generate_id(chain->conn); xcb_present_select_input(chain->conn, chain->event_id, chain->window, -- 2.30.2