[Mesa-dev] [PATCH 21/28] vulkan/wsi: Move prime blitting into queue_present
Jason Ekstrand
jason at jlekstrand.net
Thu Nov 16 21:29:09 UTC 2017
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.
---
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 35e49be..3d4488e 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,
@@ -475,30 +476,6 @@ wsi_destroy_image(const struct wsi_swapchain *chain,
}
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,
VkImage *pSwapchainImages)
@@ -550,6 +527,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
@@ -573,6 +551,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)
@@ -583,9 +573,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 ffd79c7..430f210 100644
--- a/src/vulkan/wsi/wsi_common.h
+++ b/src/vulkan/wsi/wsi_common.h
@@ -51,6 +51,8 @@ struct wsi_swapchain {
VkPresentModeKHR present_mode;
uint32_t image_count;
+ bool use_prime_blit;
+
/* Command pools, one per queue family */
VkCommandPool *cmd_pools;
@@ -62,9 +64,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 ff8ca2a..28abf6c 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 bf60a9b..fed2e8f 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 8860d8e..04ce810 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.5.0.400.gff86faf
More information about the mesa-dev
mailing list