Vulkan Overlay: Don't try to change the image layout to present twice
The render pass already does the transition.
The pipeline barrier is still needed to transfer the queue family ownership.
Tested-by: Marge Bot <https://gitlab.freedesktop.org/mesa/mesa/merge_requests/3740>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/merge_requests/3740>
@@ -1706,12 +1706,16 @@ static struct overlay_draw *render_swapchain_display(struct swapchain_data *data
device_data->vtable.CmdEndRenderPass(draw->command_buffer);
- /* Bounce the image to display back to present layout. */
+ if (device_data->graphic_queue->family_index != present_queue->family_index)
+ {
+ /* Transfer the image back to the present queue family
+ * image layout was already changed to present by the render pass
+ */
imb.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
imb.pNext = nullptr;
imb.srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
imb.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
- imb.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
+ imb.oldLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
imb.newLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
imb.image = data->images[image_index];
imb.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
@@ -1728,6 +1732,7 @@ static struct overlay_draw *render_swapchain_display(struct swapchain_data *data
0, nullptr, /* memory barriers */
0, nullptr, /* buffer memory barriers */
1, &imb); /* image memory barriers */
+ }
device_data->vtable.EndCommandBuffer(draw->command_buffer);
