diff --git a/gfx/common/vulkan_common.c b/gfx/common/vulkan_common.c index 563acbb419..a9b4db7a6b 100644 --- a/gfx/common/vulkan_common.c +++ b/gfx/common/vulkan_common.c @@ -318,19 +318,15 @@ uint32_t vulkan_find_memory_type_fallback( device_reqs, host_reqs_second, 0); } +/* Dynamic texture type should be set to : VULKAN_TEXTURE_DYNAMIC + * Staging texture type should be set to : VULKAN_TEXTURE_STAGING + */ void vulkan_copy_staging_to_dynamic(vk_t *vk, VkCommandBuffer cmd, struct vk_texture *dynamic, struct vk_texture *staging) { VkBufferImageCopy region; - retro_assert(dynamic->type == VULKAN_TEXTURE_DYNAMIC); - retro_assert(staging->type == VULKAN_TEXTURE_STAGING); - - if ( staging->need_manual_cache_management && - staging->memory != VK_NULL_HANDLE) - VULKAN_SYNC_TEXTURE_TO_GPU(vk->context->device, staging->memory); - /* We don't have to sync against previous TRANSFER, * since we observed the completion by fences. * @@ -340,9 +336,13 @@ void vulkan_copy_staging_to_dynamic(vk_t *vk, VkCommandBuffer cmd, * We would also need to optionally maintain extra textures due to * changes in resolution, so this seems like the sanest and * simplest solution. */ - VULKAN_IMAGE_LAYOUT_TRANSITION(cmd, dynamic->image, - VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, - 0, VK_ACCESS_TRANSFER_WRITE_BIT, + VULKAN_IMAGE_LAYOUT_TRANSITION( + cmd, + dynamic->image, + VK_IMAGE_LAYOUT_UNDEFINED, + VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, + 0, + VK_ACCESS_TRANSFER_WRITE_BIT, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT); @@ -360,12 +360,16 @@ void vulkan_copy_staging_to_dynamic(vk_t *vk, VkCommandBuffer cmd, region.imageExtent.height = dynamic->height; region.imageExtent.depth = 1; - vkCmdCopyBufferToImage(cmd, + vkCmdCopyBufferToImage( + cmd, staging->buffer, - dynamic->image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, - 1, ®ion); + dynamic->image, + VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, + 1, + ®ion); - VULKAN_IMAGE_LAYOUT_TRANSITION(cmd, + VULKAN_IMAGE_LAYOUT_TRANSITION( + cmd, dynamic->image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, diff --git a/gfx/common/vulkan_common.h b/gfx/common/vulkan_common.h index 5cc0b969b9..d8193d34c7 100644 --- a/gfx/common/vulkan_common.h +++ b/gfx/common/vulkan_common.h @@ -609,6 +609,22 @@ void vulkan_copy_staging_to_dynamic(vk_t *vk, VkCommandBuffer cmd, struct vk_texture *dynamic, struct vk_texture *staging); +#define VULKAN_SYNC_TEXTURE_TO_GPU_COND_PTR(vk, tex) \ + if ((tex)->need_manual_cache_management && (tex)->memory != VK_NULL_HANDLE) \ + VULKAN_SYNC_TEXTURE_TO_GPU(vk->context->device, (tex)->memory) \ + +#define VULKAN_SYNC_TEXTURE_TO_GPU_COND_OBJ(vk, tex) \ + if ((tex).need_manual_cache_management && (tex).memory != VK_NULL_HANDLE) \ + VULKAN_SYNC_TEXTURE_TO_GPU(vk->context->device, (tex).memory) \ + +#define VULKAN_COPY_STAGING_TO_DYNAMIC_PTR(vk, cmd, dynamic, staging) \ + VULKAN_SYNC_TEXTURE_TO_GPU_COND_PTR(vk, staging); \ + vulkan_copy_staging_to_dynamic(vk, cmd, dynamic, staging) + +#define VULKAN_COPY_STAGING_TO_DYNAMIC_OBJ(vk, cmd, dynamic, staging) \ + VULKAN_SYNC_TEXTURE_TO_GPU_COND_PTR(vk, staging); \ + vulkan_copy_staging_to_dynamic(vk, cmd, &dynamic, &staging); + /* VBO will be written to here. */ void vulkan_draw_quad(vk_t *vk, const struct vk_draw_quad *quad); diff --git a/gfx/drivers/vulkan.c b/gfx/drivers/vulkan.c index 4cf761bcb6..44679dc36c 100644 --- a/gfx/drivers/vulkan.c +++ b/gfx/drivers/vulkan.c @@ -1845,16 +1845,14 @@ static bool vulkan_frame(void *data, const void *frame, memcpy(dst, src, frame_width * bpp); } + VULKAN_SYNC_TEXTURE_TO_GPU_COND_OBJ(vk, chain->texture); + /* If we have an optimal texture, copy to that now. */ if (chain->texture_optimal.memory != VK_NULL_HANDLE) { vulkan_copy_staging_to_dynamic(vk, vk->cmd, &chain->texture_optimal, &chain->texture); } - else if (chain->texture.need_manual_cache_management - && chain->texture.memory != VK_NULL_HANDLE) - VULKAN_SYNC_TEXTURE_TO_GPU(vk->context->device, - chain->texture.memory); vk->last_valid_index = frame_index; } @@ -1966,9 +1964,11 @@ static bool vulkan_frame(void *data, const void *frame, { if (vk->menu.dirty[vk->menu.last_index]) { - vulkan_copy_staging_to_dynamic(vk, vk->cmd, - optimal, texture); - vk->menu.dirty[vk->menu.last_index] = false; + VULKAN_SYNC_TEXTURE_TO_GPU_COND_PTR(vk, texture); + + vulkan_copy_staging_to_dynamic(vk, vk->cmd, + optimal, texture); + vk->menu.dirty[vk->menu.last_index] = false; } } } diff --git a/gfx/drivers_font/vulkan_raster_font.c b/gfx/drivers_font/vulkan_raster_font.c index 4ff68e69e9..756f643658 100644 --- a/gfx/drivers_font/vulkan_raster_font.c +++ b/gfx/drivers_font/vulkan_raster_font.c @@ -308,6 +308,8 @@ static void vulkan_raster_font_flush(vulkan_raster_t *font) begin_info.pInheritanceInfo = NULL; vkBeginCommandBuffer(staging, &begin_info); + VULKAN_SYNC_TEXTURE_TO_GPU_COND_OBJ(font->vk, font->texture); + vulkan_copy_staging_to_dynamic(font->vk, staging, &font->texture_optimal, &font->texture);