From cdca5d0afcaa256eee457466f8781fed6a0b252f Mon Sep 17 00:00:00 2001 From: twinaphex Date: Tue, 15 Dec 2020 07:20:33 +0100 Subject: [PATCH] Turn vulkan_copy_staging_to_dynamic into macro --- gfx/common/vulkan_common.c | 63 ------------------------- gfx/common/vulkan_common.h | 66 ++++++++++++++++++++++----- gfx/drivers/vulkan.c | 12 +++-- gfx/drivers_font/vulkan_raster_font.c | 9 +++- 4 files changed, 69 insertions(+), 81 deletions(-) diff --git a/gfx/common/vulkan_common.c b/gfx/common/vulkan_common.c index a9b4db7a6b..aa594ce156 100644 --- a/gfx/common/vulkan_common.c +++ b/gfx/common/vulkan_common.c @@ -318,69 +318,6 @@ 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; - - /* We don't have to sync against previous TRANSFER, - * since we observed the completion by fences. - * - * If we have a single texture_optimal, we would need to sync against - * previous transfers to avoid races. - * - * 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, - VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, - VK_PIPELINE_STAGE_TRANSFER_BIT); - - region.bufferOffset = 0; - region.bufferRowLength = 0; - region.bufferImageHeight = 0; - region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; - region.imageSubresource.mipLevel = 0; - region.imageSubresource.baseArrayLayer = 0; - region.imageSubresource.layerCount = 1; - region.imageOffset.x = 0; - region.imageOffset.y = 0; - region.imageOffset.z = 0; - region.imageExtent.width = dynamic->width; - region.imageExtent.height = dynamic->height; - region.imageExtent.depth = 1; - - vkCmdCopyBufferToImage( - cmd, - staging->buffer, - dynamic->image, - VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, - 1, - ®ion); - - VULKAN_IMAGE_LAYOUT_TRANSITION( - cmd, - dynamic->image, - VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, - VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, - VK_ACCESS_TRANSFER_WRITE_BIT, - VK_ACCESS_SHADER_READ_BIT, - VK_PIPELINE_STAGE_TRANSFER_BIT, - VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT); - - dynamic->layout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; -} - #ifdef VULKAN_DEBUG_TEXTURE_ALLOC static VkImage vk_images[4 * 1024]; static unsigned vk_count; diff --git a/gfx/common/vulkan_common.h b/gfx/common/vulkan_common.h index d8193d34c7..7b254de988 100644 --- a/gfx/common/vulkan_common.h +++ b/gfx/common/vulkan_common.h @@ -605,10 +605,62 @@ void vulkan_destroy_texture( VkDevice device, struct vk_texture *tex); -void vulkan_copy_staging_to_dynamic(vk_t *vk, VkCommandBuffer cmd, - struct vk_texture *dynamic, - struct vk_texture *staging); +/* Dynamic texture type should be set to : VULKAN_TEXTURE_DYNAMIC + * Staging texture type should be set to : VULKAN_TEXTURE_STAGING + */ +#define VULKAN_COPY_STAGING_TO_DYNAMIC(vk, cmd, dynamic, staging) \ +{ \ + VkBufferImageCopy region; \ + 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); \ + region.bufferOffset = 0; \ + region.bufferRowLength = 0; \ + region.bufferImageHeight = 0; \ + region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; \ + region.imageSubresource.mipLevel = 0; \ + region.imageSubresource.baseArrayLayer = 0; \ + region.imageSubresource.layerCount = 1; \ + region.imageOffset.x = 0; \ + region.imageOffset.y = 0; \ + region.imageOffset.z = 0; \ + region.imageExtent.width = dynamic->width; \ + region.imageExtent.height = dynamic->height; \ + region.imageExtent.depth = 1; \ + vkCmdCopyBufferToImage( \ + cmd, \ + staging->buffer, \ + dynamic->image, \ + VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, \ + 1, \ + ®ion); \ + VULKAN_IMAGE_LAYOUT_TRANSITION( \ + cmd, \ + dynamic->image, \ + VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, \ + VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, \ + VK_ACCESS_TRANSFER_WRITE_BIT, \ + VK_ACCESS_SHADER_READ_BIT, \ + VK_PIPELINE_STAGE_TRANSFER_BIT, \ + VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT); \ + dynamic->layout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; \ +} +/* We don't have to sync against previous TRANSFER, + * since we observed the completion by fences. + * + * If we have a single texture_optimal, we would need to sync against + * previous transfers to avoid races. + * + * We would also need to optionally maintain extra textures due to + * changes in resolution, so this seems like the sanest and + * simplest solution. */ #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) \ @@ -617,14 +669,6 @@ void vulkan_copy_staging_to_dynamic(vk_t *vk, VkCommandBuffer cmd, 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 44679dc36c..b7ac31f725 100644 --- a/gfx/drivers/vulkan.c +++ b/gfx/drivers/vulkan.c @@ -1850,8 +1850,9 @@ static bool vulkan_frame(void *data, const void *frame, /* 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); + struct vk_texture *dynamic = &chain->texture_optimal; + struct vk_texture *staging = &chain->texture; + VULKAN_COPY_STAGING_TO_DYNAMIC(vk, vk->cmd, dynamic, staging); } vk->last_valid_index = frame_index; @@ -1964,10 +1965,11 @@ static bool vulkan_frame(void *data, const void *frame, { if (vk->menu.dirty[vk->menu.last_index]) { + struct vk_texture *dynamic = optimal; + struct vk_texture *staging = texture; VULKAN_SYNC_TEXTURE_TO_GPU_COND_PTR(vk, texture); - - vulkan_copy_staging_to_dynamic(vk, vk->cmd, - optimal, texture); + VULKAN_COPY_STAGING_TO_DYNAMIC(vk, vk->cmd, + dynamic, staging); 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 756f643658..733fe0745a 100644 --- a/gfx/drivers_font/vulkan_raster_font.c +++ b/gfx/drivers_font/vulkan_raster_font.c @@ -294,6 +294,8 @@ static void vulkan_raster_font_flush(vulkan_raster_t *font) VkSubmitInfo submit_info; VkCommandBufferAllocateInfo cmd_info; VkCommandBufferBeginInfo begin_info; + struct vk_texture *dynamic_tex = NULL; + struct vk_texture *staging_tex = NULL; cmd_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO; cmd_info.pNext = NULL; @@ -310,8 +312,11 @@ static void vulkan_raster_font_flush(vulkan_raster_t *font) VULKAN_SYNC_TEXTURE_TO_GPU_COND_OBJ(font->vk, font->texture); - vulkan_copy_staging_to_dynamic(font->vk, staging, - &font->texture_optimal, &font->texture); + dynamic_tex = &font->texture_optimal; + staging_tex = &font->texture; + + VULKAN_COPY_STAGING_TO_DYNAMIC(font->vk, staging, + dynamic_tex, staging_tex); vkEndCommandBuffer(staging);