diff options
author | Jason Ekstrand <[email protected]> | 2019-11-21 05:47:10 -0600 |
---|---|---|
committer | Jason Ekstrand <[email protected]> | 2019-12-06 19:58:06 +0000 |
commit | 48e23a64067ab7f775b1c4e2966041fbbf9d42e3 (patch) | |
tree | fc61ab2529e67c8358bd25ddae246c515cff6cd8 /src/vulkan | |
parent | d07ed0c9c9a90c8a2936d12f9a83696f24e0aaac (diff) |
vulkan/wsi: Provide the implicitly synchronized BO to vkQueueSubmit
This lets us treat the implicit synchronization that we need for X11 and
Wayland like a semaphore. Instead of trusting the driver to somehow
figure out when that memory object needs to be signaled, we provide an
explicit point where the driver can set EXEC_OBJECT_WRITE and signal the
dma_fence on the BO. Without this, we have to somehow track inside the
driver when WSI buffers are actually used to avoid extra synchronization
dependencies.
Reviewed-by: Bas Nieuwenhuizen <[email protected]>
Reviewed-by: Lionel Landwerlin <[email protected]>
Diffstat (limited to 'src/vulkan')
-rw-r--r-- | src/vulkan/wsi/wsi_common.c | 14 | ||||
-rw-r--r-- | src/vulkan/wsi/wsi_common.h | 8 |
2 files changed, 19 insertions, 3 deletions
diff --git a/src/vulkan/wsi/wsi_common.c b/src/vulkan/wsi/wsi_common.c index b8f6c6d70de..3abffe3dee7 100644 --- a/src/vulkan/wsi/wsi_common.c +++ b/src/vulkan/wsi/wsi_common.c @@ -1042,9 +1042,18 @@ wsi_common_queue_present(const struct wsi_device *wsi, wsi->ResetFences(device, 1, &swapchain->fences[image_index]); } + struct wsi_image *image = + swapchain->get_wsi_image(swapchain, image_index); + + struct wsi_memory_signal_submit_info mem_signal = { + .sType = VK_STRUCTURE_TYPE_WSI_MEMORY_SIGNAL_SUBMIT_INFO_MESA, + .pNext = NULL, + .memory = image->memory, + }; + VkSubmitInfo submit_info = { .sType = VK_STRUCTURE_TYPE_SUBMIT_INFO, - .pNext = NULL, + .pNext = &mem_signal, }; VkPipelineStageFlags *stage_flags = NULL; @@ -1075,11 +1084,10 @@ wsi_common_queue_present(const struct wsi_device *wsi, /* 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, image_index); submit_info.commandBufferCount = 1; submit_info.pCommandBuffers = &image->prime.blit_cmd_buffers[queue_family_index]; + mem_signal.memory = image->prime.memory; } result = wsi->QueueSubmit(queue, 1, &submit_info, swapchain->fences[image_index]); diff --git a/src/vulkan/wsi/wsi_common.h b/src/vulkan/wsi/wsi_common.h index 064b16a5e7a..d15dea7b0eb 100644 --- a/src/vulkan/wsi/wsi_common.h +++ b/src/vulkan/wsi/wsi_common.h @@ -37,6 +37,7 @@ #define VK_STRUCTURE_TYPE_WSI_MEMORY_ALLOCATE_INFO_MESA (VkStructureType)1000001003 #define VK_STRUCTURE_TYPE_WSI_FORMAT_MODIFIER_PROPERTIES_LIST_MESA (VkStructureType)1000001004 #define VK_STRUCTURE_TYPE_WSI_SURFACE_SUPPORTED_COUNTERS_MESA (VkStructureType)1000001005 +#define VK_STRUCTURE_TYPE_WSI_MEMORY_SIGNAL_SUBMIT_INFO_MESA (VkStructureType)1000001006 struct wsi_image_create_info { VkStructureType sType; @@ -76,6 +77,13 @@ struct wsi_surface_supported_counters { }; +/* To be chained into VkSubmitInfo */ +struct wsi_memory_signal_submit_info { + VkStructureType sType; + const void *pNext; + VkDeviceMemory memory; +}; + struct wsi_fence { VkDevice device; const struct wsi_device *wsi_device; |