vulkan-renderer: Take queue indices in layout transitions

The only differences between this helper and
transfer_image_queue_family() is that this took all the flags apart from
queue indices, and QFOT took none of the flags apart from queue indices.

To make the QFOT case correct, we have to pass almost all the stages and
flags in, so we might as well just use a single helper. Add queue
indices to this helper, which is a no-op for now.

Signed-off-by: Daniel Stone <daniels@collabora.com>
This commit is contained in:
Daniel Stone 2026-05-06 16:02:40 +01:00
parent 89bd7bd595
commit 8253900353

View file

@ -433,7 +433,8 @@ static void
transition_image_layout(VkCommandBuffer cmd_buffer, VkImage image,
VkImageLayout old_layout, VkImageLayout new_layout,
VkPipelineStageFlags srcs, VkPipelineStageFlags dsts,
VkAccessFlags src_access, VkAccessFlags dst_access)
VkAccessFlags src_access, VkAccessFlags dst_access,
uint32_t src_index, uint32_t dst_index)
{
const VkImageMemoryBarrier barrier = {
.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
@ -445,8 +446,8 @@ transition_image_layout(VkCommandBuffer cmd_buffer, VkImage image,
.subresourceRange.levelCount = 1,
.srcAccessMask = src_access,
.dstAccessMask = dst_access,
.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
.srcQueueFamilyIndex = src_index,
.dstQueueFamilyIndex = dst_index,
};
vkCmdPipelineBarrier(cmd_buffer, srcs, dsts, 0, 0, NULL, 0, NULL, 1, &barrier);
@ -1350,7 +1351,8 @@ vulkan_renderer_do_read_pixels(struct vulkan_renderer *vr,
transition_image_layout(cmd_buffer, color_attachment,
VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT,
VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, VK_ACCESS_TRANSFER_READ_BIT);
VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, VK_ACCESS_TRANSFER_READ_BIT,
VK_QUEUE_FAMILY_IGNORED, VK_QUEUE_FAMILY_IGNORED);
copy_sub_image_to_buffer(cmd_buffer,
dst_buffer, color_attachment,
@ -1363,7 +1365,8 @@ vulkan_renderer_do_read_pixels(struct vulkan_renderer *vr,
transition_image_layout(cmd_buffer, color_attachment,
VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
VK_ACCESS_TRANSFER_READ_BIT, VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT);
VK_ACCESS_TRANSFER_READ_BIT, VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
VK_QUEUE_FAMILY_IGNORED, VK_QUEUE_FAMILY_IGNORED);
// TODO: async implementation of this, remove wait
vulkan_renderer_cmd_end_wait(vr, &cmd_buffer);
@ -2375,7 +2378,8 @@ vulkan_renderer_create_swapchain(struct weston_output *output,
transition_image_layout(cmd_buffer, swapchain_images[i],
VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_PRESENT_SRC_KHR,
VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
0, VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT);
0, VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
VK_QUEUE_FAMILY_IGNORED, VK_QUEUE_FAMILY_IGNORED);
create_image_semaphores(vr, vo, im);
@ -2750,7 +2754,8 @@ update_texture_image(struct vulkan_renderer *vr,
transition_image_layout(cmd_buffer, texture->image,
expected_layout, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT,
VK_ACCESS_SHADER_READ_BIT, VK_ACCESS_TRANSFER_WRITE_BIT);
VK_ACCESS_SHADER_READ_BIT, VK_ACCESS_TRANSFER_WRITE_BIT,
VK_QUEUE_FAMILY_IGNORED, VK_QUEUE_FAMILY_IGNORED);
copy_buffer_to_sub_image(cmd_buffer, texture->staging_buffer, texture->image,
buffer_width, buffer_height, pitch, pixel_format->bpp,
@ -2759,7 +2764,8 @@ update_texture_image(struct vulkan_renderer *vr,
transition_image_layout(cmd_buffer, texture->image,
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,
VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_SHADER_READ_BIT);
VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_SHADER_READ_BIT,
VK_QUEUE_FAMILY_IGNORED, VK_QUEUE_FAMILY_IGNORED);
result = vkEndCommandBuffer(cmd_buffer);
check_vk_success(result, "vkEndCommandBuffer");
@ -3887,7 +3893,8 @@ vulkan_renderer_create_renderbuffer(struct weston_output *output,
transition_image_layout(cmd_buffer, im->image,
VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT,
0, VK_ACCESS_TRANSFER_WRITE_BIT);
0, VK_ACCESS_TRANSFER_WRITE_BIT,
VK_QUEUE_FAMILY_IGNORED, VK_QUEUE_FAMILY_IGNORED);
// Wait here is bad, but this is only on renderbuffer creation
vulkan_renderer_cmd_end_wait(vr, &cmd_buffer);