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 <bas@basnieuwenhuizen.nl>
Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
This commit is contained in:
Jason Ekstrand 2019-11-21 05:47:10 -06:00
parent d07ed0c9c9
commit 48e23a6406
2 changed files with 19 additions and 3 deletions

View file

@ -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]);

View file

@ -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;