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;