diff --git a/src/refresh/vkpt/main.c b/src/refresh/vkpt/main.c index 8d57ec5c0..8493ca611 100644 --- a/src/refresh/vkpt/main.c +++ b/src/refresh/vkpt/main.c @@ -4016,7 +4016,9 @@ IMG_ReadPixels_RTX(screenshot_t *s) .newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL ); - IMAGE_BARRIER(cmd_buf, + IMAGE_BARRIER_STAGES(cmd_buf, + VK_PIPELINE_STAGE_HOST_BIT, + VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, .image = qvk.screenshot_image, .subresourceRange = subresource_range, .srcAccessMask = VK_ACCESS_HOST_READ_BIT, @@ -4045,7 +4047,9 @@ IMG_ReadPixels_RTX(screenshot_t *s) .newLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR ); - IMAGE_BARRIER(cmd_buf, + IMAGE_BARRIER_STAGES(cmd_buf, + VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, + VK_PIPELINE_STAGE_HOST_BIT, .image = qvk.screenshot_image, .subresourceRange = subresource_range, .srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT, diff --git a/src/refresh/vkpt/textures.c b/src/refresh/vkpt/textures.c index 4a84cb87a..b81aade49 100644 --- a/src/refresh/vkpt/textures.c +++ b/src/refresh/vkpt/textures.c @@ -2364,7 +2364,9 @@ LIST_IMAGES_A_B } - IMAGE_BARRIER(cmd_buf, + IMAGE_BARRIER_STAGES(cmd_buf, + VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, + VK_PIPELINE_STAGE_HOST_BIT, .image = qvk.screenshot_image, .subresourceRange = subresource_range, .srcAccessMask = 0, @@ -2374,7 +2376,9 @@ LIST_IMAGES_A_B ); #ifdef VKPT_IMAGE_DUMPS - IMAGE_BARRIER(cmd_buf, + IMAGE_BARRIER_STAGES(cmd_buf, + VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, + VK_PIPELINE_STAGE_HOST_BIT, .image = qvk.dump_image, .subresourceRange = subresource_range, .srcAccessMask = 0, diff --git a/src/refresh/vkpt/vk_util.h b/src/refresh/vkpt/vk_util.h index dafec0b1c..0630c8ff4 100644 --- a/src/refresh/vkpt/vk_util.h +++ b/src/refresh/vkpt/vk_util.h @@ -55,7 +55,7 @@ void buffer_attach_name(const BufferResource_t *buf, const char *name); uint32_t get_memory_type(uint32_t mem_req_type_bits, VkMemoryPropertyFlags mem_prop); -#define IMAGE_BARRIER(cmd_buf, ...) \ +#define IMAGE_BARRIER_STAGES(cmd_buf, src_stage, dst_stage, ...) \ do { \ VkImageMemoryBarrier img_mem_barrier = { \ .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, \ @@ -63,11 +63,14 @@ uint32_t get_memory_type(uint32_t mem_req_type_bits, VkMemoryPropertyFlags mem_p .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, \ __VA_ARGS__ \ }; \ - vkCmdPipelineBarrier(cmd_buf, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, \ - VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, NULL, 0, NULL, \ + vkCmdPipelineBarrier(cmd_buf, (src_stage), \ + (dst_stage), 0, 0, NULL, 0, NULL, \ 1, &img_mem_barrier); \ } while(0) +#define IMAGE_BARRIER(cmd_buf, ...) \ + IMAGE_BARRIER_STAGES((cmd_buf), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, __VA_ARGS__) + #define BUFFER_BARRIER(cmd_buf, ...) \ do { \ VkBufferMemoryBarrier buf_mem_barrier = { \