diff --git a/include/QF/Vulkan/barrier.h b/include/QF/Vulkan/barrier.h index 56438aeba..8637d7a99 100644 --- a/include/QF/Vulkan/barrier.h +++ b/include/QF/Vulkan/barrier.h @@ -2,21 +2,22 @@ #define __QF_Vulkan_barrier_h typedef struct { - VkPipelineStageFlags src; - VkPipelineStageFlags dst; -} qfv_pipelinestagepair_t; + VkPipelineStageFlags srcStages; + VkPipelineStageFlags dstStages; + VkImageMemoryBarrier barrier; +} qfv_imagebarrier_t; -//XXX Note: imageLayoutTransitionBarriers, imageLayoutTransitionStages and -// the enum must be kept in sync +//XXX Note: imageBarriers and the enum must be kept in sync enum { qfv_LT_Undefined_to_TransferDst, + qfv_LT_TransferDst_to_TransferSrc, qfv_LT_TransferDst_to_ShaderReadOnly, + qfv_LT_TransferSrc_to_ShaderReadOnly, qfv_LT_ShaderReadOnly_to_TransferDst, qfv_LT_Undefined_to_DepthStencil, qfv_LT_Undefined_to_Color, }; -extern const VkImageMemoryBarrier imageLayoutTransitionBarriers[]; -extern const qfv_pipelinestagepair_t imageLayoutTransitionStages[]; +extern const qfv_imagebarrier_t imageBarriers[]; #endif//__QF_Vulkan_barrier_h diff --git a/libs/models/alias/vulkan_model_alias.c b/libs/models/alias/vulkan_model_alias.c index 27971ad56..56a9175bb 100644 --- a/libs/models/alias/vulkan_model_alias.c +++ b/libs/models/alias/vulkan_model_alias.c @@ -184,17 +184,13 @@ Vulkan_Mod_LoadSkin (mod_alias_ctx_t *alias_ctx, byte *skinpix, int skinsize, Vulkan_ExpandPalette (base_data, tskin, vid.palette, 1, skinsize); - VkImageMemoryBarrier barrier; - qfv_pipelinestagepair_t stages; - - stages = imageLayoutTransitionStages[qfv_LT_Undefined_to_TransferDst]; - barrier = imageLayoutTransitionBarriers[qfv_LT_Undefined_to_TransferDst]; - barrier.image = skin->image; - barrier.subresourceRange.levelCount = VK_REMAINING_MIP_LEVELS; - barrier.subresourceRange.layerCount = VK_REMAINING_ARRAY_LAYERS; - dfunc->vkCmdPipelineBarrier (packet->cmd, stages.src, stages.dst, + qfv_imagebarrier_t ib = imageBarriers[qfv_LT_Undefined_to_TransferDst]; + ib.barrier.image = skin->image; + ib.barrier.subresourceRange.levelCount = VK_REMAINING_MIP_LEVELS; + ib.barrier.subresourceRange.layerCount = VK_REMAINING_ARRAY_LAYERS; + dfunc->vkCmdPipelineBarrier (packet->cmd, ib.srcStages, ib.dstStages, 0, 0, 0, 0, 0, - 1, &barrier); + 1, &ib.barrier); VkBufferImageCopy copy = { packet->offset, 0, 0, @@ -207,14 +203,13 @@ Vulkan_Mod_LoadSkin (mod_alias_ctx_t *alias_ctx, byte *skinpix, int skinsize, 1, ©); if (mipLevels == 1) { - stages = imageLayoutTransitionStages[qfv_LT_TransferDst_to_ShaderReadOnly]; - barrier=imageLayoutTransitionBarriers[qfv_LT_TransferDst_to_ShaderReadOnly]; - barrier.image = skin->image; - barrier.subresourceRange.levelCount = VK_REMAINING_MIP_LEVELS; - barrier.subresourceRange.layerCount = VK_REMAINING_ARRAY_LAYERS; - dfunc->vkCmdPipelineBarrier (packet->cmd, stages.src, stages.dst, + ib = imageBarriers[qfv_LT_TransferDst_to_ShaderReadOnly]; + ib.barrier.image = skin->image; + ib.barrier.subresourceRange.levelCount = VK_REMAINING_MIP_LEVELS; + ib.barrier.subresourceRange.layerCount = VK_REMAINING_ARRAY_LAYERS; + dfunc->vkCmdPipelineBarrier (packet->cmd, ib.srcStages, ib.dstStages, 0, 0, 0, 0, 0, - 1, &barrier); + 1, &ib.barrier); } else { QFV_GenerateMipMaps (device, packet->cmd, skin->image, mipLevels, w, h, 4); diff --git a/libs/models/brush/vulkan_model_brush.c b/libs/models/brush/vulkan_model_brush.c index e0211b01a..a5acbdac3 100644 --- a/libs/models/brush/vulkan_model_brush.c +++ b/libs/models/brush/vulkan_model_brush.c @@ -257,10 +257,9 @@ load_textures (model_t *mod, vulkan_ctx_t *ctx) } // base barrier - VkImageMemoryBarrier barrier; - barrier = imageLayoutTransitionBarriers[qfv_LT_Undefined_to_TransferDst]; - barrier.subresourceRange.levelCount = VK_REMAINING_MIP_LEVELS; - barrier.subresourceRange.layerCount = VK_REMAINING_ARRAY_LAYERS; + qfv_imagebarrier_t ib = imageBarriers[qfv_LT_Undefined_to_TransferDst]; + ib.barrier.subresourceRange.levelCount = VK_REMAINING_MIP_LEVELS; + ib.barrier.subresourceRange.layerCount = VK_REMAINING_ARRAY_LAYERS; __auto_type barriers = QFV_AllocImageBarrierSet (image_count, malloc); barriers->size = 0; @@ -271,18 +270,15 @@ load_textures (model_t *mod, vulkan_ctx_t *ctx) } vulktex_t *tex = tx->render; __auto_type b = &barriers->a[barriers->size++]; - *b = barrier; + *b = ib.barrier; b->image = tex->tex->image; if (tex->glow) { b = &barriers->a[barriers->size++]; - *b = barrier; + *b = ib.barrier; b->image = tex->glow->image; } } - qfv_pipelinestagepair_t stages; - - stages = imageLayoutTransitionStages[qfv_LT_Undefined_to_TransferDst]; - dfunc->vkCmdPipelineBarrier (packet->cmd, stages.src, stages.dst, + dfunc->vkCmdPipelineBarrier (packet->cmd, ib.srcStages, ib.dstStages, 0, 0, 0, 0, 0, barriers->size, barriers->a); for (int i = 0, j = 0; i < brush->numtextures; i++) { @@ -307,8 +303,8 @@ load_textures (model_t *mod, vulkan_ctx_t *ctx) } } - stages=imageLayoutTransitionStages[qfv_LT_TransferDst_to_ShaderReadOnly]; - dfunc->vkCmdPipelineBarrier (packet->cmd, stages.src, stages.dst, + ib = imageBarriers[qfv_LT_TransferDst_to_ShaderReadOnly]; + dfunc->vkCmdPipelineBarrier (packet->cmd, ib.srcStages, ib.dstStages, 0, 0, 0, 0, 0, barriers->size, barriers->a); QFV_PacketSubmit (packet); diff --git a/libs/video/renderer/vulkan/barrier.c b/libs/video/renderer/vulkan/barrier.c index 935b370e0..4fc084cd1 100644 --- a/libs/video/renderer/vulkan/barrier.c +++ b/libs/video/renderer/vulkan/barrier.c @@ -31,71 +31,105 @@ #include "QF/Vulkan/qf_vid.h" #include "QF/Vulkan/barrier.h" -const VkImageMemoryBarrier imageLayoutTransitionBarriers[] = { +const qfv_imagebarrier_t imageBarriers[] = { // undefined -> transfer dst optimal - { VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, 0, - 0, - VK_ACCESS_TRANSFER_WRITE_BIT, - VK_IMAGE_LAYOUT_UNDEFINED, - VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, - VK_QUEUE_FAMILY_IGNORED, VK_QUEUE_FAMILY_IGNORED, 0, - { VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1 } + { + .srcStages = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, + .dstStages = VK_PIPELINE_STAGE_TRANSFER_BIT, + .barrier = { + VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, 0, + 0, + VK_ACCESS_TRANSFER_WRITE_BIT, + VK_IMAGE_LAYOUT_UNDEFINED, + VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, + VK_QUEUE_FAMILY_IGNORED, VK_QUEUE_FAMILY_IGNORED, 0, + { VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1 } + }, + }, + // transfer dst optimal -> transfer src optimal + { + .srcStages = VK_PIPELINE_STAGE_TRANSFER_BIT, + .dstStages = VK_PIPELINE_STAGE_TRANSFER_BIT, + .barrier = { + VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, 0, + VK_ACCESS_TRANSFER_WRITE_BIT, + VK_ACCESS_TRANSFER_READ_BIT, + VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, + VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, + VK_QUEUE_FAMILY_IGNORED, VK_QUEUE_FAMILY_IGNORED, 0, + { VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1 } + }, }, // transfer dst optimal -> shader read only optimal - { VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, 0, - VK_ACCESS_TRANSFER_WRITE_BIT, - VK_ACCESS_SHADER_READ_BIT, - VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, - VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, - VK_QUEUE_FAMILY_IGNORED, VK_QUEUE_FAMILY_IGNORED, 0, - { VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1 } + { + .srcStages = VK_PIPELINE_STAGE_TRANSFER_BIT, + .dstStages = VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, + .barrier = { + VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, 0, + VK_ACCESS_TRANSFER_WRITE_BIT, + VK_ACCESS_SHADER_READ_BIT, + VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, + VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, + VK_QUEUE_FAMILY_IGNORED, VK_QUEUE_FAMILY_IGNORED, 0, + { VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1 } + }, + }, + // transfer src optimal -> shader read only optimal + { + .srcStages = VK_PIPELINE_STAGE_TRANSFER_BIT, + .dstStages = VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, + .barrier = { + VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, 0, + VK_ACCESS_TRANSFER_READ_BIT, + VK_ACCESS_SHADER_READ_BIT, + VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, + VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, + VK_QUEUE_FAMILY_IGNORED, VK_QUEUE_FAMILY_IGNORED, 0, + { VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1 } + }, }, // shader read only optimal -> transfer dst optimal - { VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, 0, - VK_ACCESS_SHADER_READ_BIT, - VK_ACCESS_TRANSFER_WRITE_BIT, - VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, - VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, - VK_QUEUE_FAMILY_IGNORED, VK_QUEUE_FAMILY_IGNORED, 0, - { VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1 } + { + .srcStages = VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, + .dstStages = VK_PIPELINE_STAGE_TRANSFER_BIT, + .barrier = { + VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, 0, + VK_ACCESS_SHADER_READ_BIT, + VK_ACCESS_TRANSFER_WRITE_BIT, + VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, + VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, + VK_QUEUE_FAMILY_IGNORED, VK_QUEUE_FAMILY_IGNORED, 0, + { VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1 } + }, }, // undefined -> depth stencil attachment optimal - { VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, 0, - 0, - VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT - | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT, - VK_IMAGE_LAYOUT_UNDEFINED, - VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, - VK_QUEUE_FAMILY_IGNORED, VK_QUEUE_FAMILY_IGNORED, 0, - { VK_IMAGE_ASPECT_DEPTH_BIT, 0, 1, 0, 1 } + { + .srcStages = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, + .dstStages = VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT, + .barrier = { + VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, 0, + 0, + VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT + | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT, + VK_IMAGE_LAYOUT_UNDEFINED, + VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, + VK_QUEUE_FAMILY_IGNORED, VK_QUEUE_FAMILY_IGNORED, 0, + { VK_IMAGE_ASPECT_DEPTH_BIT, 0, 1, 0, 1 } + }, }, // undefined -> color attachment optimal - { VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, 0, - 0, - VK_ACCESS_COLOR_ATTACHMENT_READ_BIT - | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, - VK_IMAGE_LAYOUT_UNDEFINED, - VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, - VK_QUEUE_FAMILY_IGNORED, VK_QUEUE_FAMILY_IGNORED, 0, - { VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1 } + { + .srcStages = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, + .dstStages = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, + .barrier = { + VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, 0, + 0, + VK_ACCESS_COLOR_ATTACHMENT_READ_BIT + | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, + VK_IMAGE_LAYOUT_UNDEFINED, + VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, + VK_QUEUE_FAMILY_IGNORED, VK_QUEUE_FAMILY_IGNORED, 0, + { VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1 } + }, }, - { /* end of transition barriers */ } -}; - -const qfv_pipelinestagepair_t imageLayoutTransitionStages[] = { - // undefined -> transfer dst optimal - { VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, - VK_PIPELINE_STAGE_TRANSFER_BIT }, - // transfer dst optimal -> shader read only optimal - { VK_PIPELINE_STAGE_TRANSFER_BIT, - VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT }, - // shader read only optimal -> transfer dst optimal - { VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, - VK_PIPELINE_STAGE_TRANSFER_BIT }, - // undefined -> depth stencil attachment optimal - { VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, - VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT }, - // undefined -> color attachment optimal - { VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, - VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT }, }; diff --git a/libs/video/renderer/vulkan/image.c b/libs/video/renderer/vulkan/image.c index c05ececf9..61905c982 100644 --- a/libs/video/renderer/vulkan/image.c +++ b/libs/video/renderer/vulkan/image.c @@ -216,45 +216,16 @@ QFV_GenerateMipMaps (qfv_device_t *device, VkCommandBuffer cmd, { qfv_devfuncs_t *dfunc = device->funcs; - qfv_pipelinestagepair_t pre_stages = { - VK_PIPELINE_STAGE_TRANSFER_BIT, - VK_PIPELINE_STAGE_TRANSFER_BIT, - }; - qfv_pipelinestagepair_t post_stages = { - VK_PIPELINE_STAGE_TRANSFER_BIT, - VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, - }; - qfv_pipelinestagepair_t final_stages = { - VK_PIPELINE_STAGE_TRANSFER_BIT, - VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, - }; - VkImageMemoryBarrier pre_barrier = { - VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, 0, - VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_TRANSFER_READ_BIT, - VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, - VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, - VK_QUEUE_FAMILY_IGNORED, VK_QUEUE_FAMILY_IGNORED, - image, - { VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, layers } - }; - VkImageMemoryBarrier post_barrier = { - VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, 0, - VK_ACCESS_TRANSFER_READ_BIT, VK_ACCESS_SHADER_READ_BIT, - VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, - VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, - VK_QUEUE_FAMILY_IGNORED, VK_QUEUE_FAMILY_IGNORED, - image, - { VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, layers } - }; - VkImageMemoryBarrier final_barrier = { - VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, 0, - VK_ACCESS_TRANSFER_READ_BIT, VK_ACCESS_SHADER_READ_BIT, - VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, - VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, - VK_QUEUE_FAMILY_IGNORED, VK_QUEUE_FAMILY_IGNORED, - image, - { VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, layers } - }; + qfv_imagebarrier_t pre=imageBarriers[qfv_LT_TransferDst_to_TransferSrc]; + qfv_imagebarrier_t pst=imageBarriers[qfv_LT_TransferSrc_to_ShaderReadOnly]; + qfv_imagebarrier_t fnl=imageBarriers[qfv_LT_TransferDst_to_ShaderReadOnly]; + + pre.barrier.image = image; + pre.barrier.subresourceRange.layerCount = layers; + pst.barrier.image = image; + pst.barrier.subresourceRange.layerCount = layers; + fnl.barrier.image = image; + fnl.barrier.subresourceRange.layerCount = layers; VkImageBlit blit = { {VK_IMAGE_ASPECT_COLOR_BIT, 0, 0, layers}, @@ -264,17 +235,17 @@ QFV_GenerateMipMaps (qfv_device_t *device, VkCommandBuffer cmd, }; while (--mips > 0) { - dfunc->vkCmdPipelineBarrier (cmd, pre_stages.src, pre_stages.dst, 0, + dfunc->vkCmdPipelineBarrier (cmd, pre.srcStages, pre.dstStages, 0, 0, 0, 0, 0, - 1, &pre_barrier); + 1, &pre.barrier); dfunc->vkCmdBlitImage (cmd, image, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &blit, VK_FILTER_LINEAR); - dfunc->vkCmdPipelineBarrier (cmd, post_stages.src, post_stages.dst, 0, + dfunc->vkCmdPipelineBarrier (cmd, pst.srcStages, pst.dstStages, 0, 0, 0, 0, 0, - 1, &post_barrier); + 1, &pst.barrier); blit.srcSubresource.mipLevel++; blit.srcOffsets[1].x = blit.dstOffsets[1].x; @@ -282,13 +253,13 @@ QFV_GenerateMipMaps (qfv_device_t *device, VkCommandBuffer cmd, blit.dstSubresource.mipLevel++; blit.dstOffsets[1].x = max (blit.dstOffsets[1].x >> 1, 1); blit.dstOffsets[1].y = max (blit.dstOffsets[1].y >> 1, 1); - pre_barrier.subresourceRange.baseMipLevel++; - post_barrier.subresourceRange.baseMipLevel++; - final_barrier.subresourceRange.baseMipLevel++; + pre.barrier.subresourceRange.baseMipLevel++; + pst.barrier.subresourceRange.baseMipLevel++; + fnl.barrier.subresourceRange.baseMipLevel++; } - dfunc->vkCmdPipelineBarrier (cmd, final_stages.src, final_stages.dst, 0, + dfunc->vkCmdPipelineBarrier (cmd, fnl.srcStages, fnl.dstStages, 0, 0, 0, 0, 0, - 1, &final_barrier); + 1, &fnl.barrier); } static int diff --git a/libs/video/renderer/vulkan/scrap.c b/libs/video/renderer/vulkan/scrap.c index ab053bf10..e56c2a7a5 100644 --- a/libs/video/renderer/vulkan/scrap.c +++ b/libs/video/renderer/vulkan/scrap.c @@ -143,17 +143,13 @@ QFV_CreateScrap (qfv_device_t *device, const char *name, int size, scrap->batch_free = 0; scrap->batch_count = 0; - VkImageMemoryBarrier barrier; - qfv_pipelinestagepair_t stages; - qfv_packet_t *packet = QFV_PacketAcquire (stage); // no data for the packet - stages = imageLayoutTransitionStages[qfv_LT_Undefined_to_TransferDst]; - barrier = imageLayoutTransitionBarriers[qfv_LT_Undefined_to_TransferDst]; - barrier.image = scrap->image; - dfunc->vkCmdPipelineBarrier (packet->cmd, stages.src, stages.dst, + qfv_imagebarrier_t ib = imageBarriers[qfv_LT_Undefined_to_TransferDst]; + ib.barrier.image = scrap->image; + dfunc->vkCmdPipelineBarrier (packet->cmd, ib.srcStages, ib.dstStages, 0, 0, 0, 0, 0, - 1, &barrier); + 1, &ib.barrier); VkClearColorValue color = { float32:{0xde/255.0, 0xad/255.0, 0xbe/255.0, 0xef/255.0}, }; @@ -161,12 +157,11 @@ QFV_CreateScrap (qfv_device_t *device, const char *name, int size, dfunc->vkCmdClearColorImage (packet->cmd, scrap->image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, &color, 1, &range); - stages = imageLayoutTransitionStages[qfv_LT_TransferDst_to_ShaderReadOnly]; - barrier=imageLayoutTransitionBarriers[qfv_LT_TransferDst_to_ShaderReadOnly]; - barrier.image = scrap->image; - dfunc->vkCmdPipelineBarrier (packet->cmd, stages.src, stages.dst, + ib = imageBarriers[qfv_LT_TransferDst_to_ShaderReadOnly]; + ib.barrier.image = scrap->image; + dfunc->vkCmdPipelineBarrier (packet->cmd, ib.srcStages, ib.dstStages, 0, 0, 0, 0, 0, - 1, &barrier); + 1, &ib.barrier); QFV_PacketSubmit (packet); return scrap; } @@ -322,15 +317,11 @@ QFV_ScrapFlush (scrap_t *scrap) copy->a[i].imageExtent.depth = 1; } - VkImageMemoryBarrier barrier; - qfv_pipelinestagepair_t stages; - - stages = imageLayoutTransitionStages[qfv_LT_ShaderReadOnly_to_TransferDst]; - barrier=imageLayoutTransitionBarriers[qfv_LT_ShaderReadOnly_to_TransferDst]; - barrier.image = scrap->image; - dfunc->vkCmdPipelineBarrier (packet->cmd, stages.src, stages.dst, + qfv_imagebarrier_t ib = imageBarriers[qfv_LT_ShaderReadOnly_to_TransferDst]; + ib.barrier.image = scrap->image; + dfunc->vkCmdPipelineBarrier (packet->cmd, ib.srcStages, ib.dstStages, 0, 0, 0, 0, 0, - 1, &barrier); + 1, &ib.barrier); size_t offset = packet->offset, size; vrect_t *batch = scrap->batch; @@ -353,12 +344,11 @@ QFV_ScrapFlush (scrap_t *scrap) scrap->batch_count -= i; } - stages = imageLayoutTransitionStages[qfv_LT_TransferDst_to_ShaderReadOnly]; - barrier=imageLayoutTransitionBarriers[qfv_LT_TransferDst_to_ShaderReadOnly]; - barrier.image = scrap->image; - dfunc->vkCmdPipelineBarrier (packet->cmd, stages.src, stages.dst, + ib = imageBarriers[qfv_LT_TransferDst_to_ShaderReadOnly]; + ib.barrier.image = scrap->image; + dfunc->vkCmdPipelineBarrier (packet->cmd, ib.srcStages, ib.dstStages, 0, 0, 0, 0, 0, - 1, &barrier); + 1, &ib.barrier); *scrap->batch_tail = scrap->batch_free; scrap->batch_free = scrap->batch; diff --git a/libs/video/renderer/vulkan/vulkan_bsp.c b/libs/video/renderer/vulkan/vulkan_bsp.c index c498ee09b..75d8a6462 100644 --- a/libs/video/renderer/vulkan/vulkan_bsp.c +++ b/libs/video/renderer/vulkan/vulkan_bsp.c @@ -1390,19 +1390,14 @@ create_default_skys (vulkan_ctx_t *ctx) // temporarily commandeer the light map's staging buffer qfv_packet_t *packet = QFV_PacketAcquire (bctx->light_stage); - VkImageMemoryBarrier barrier; - VkImageMemoryBarrier barriers[2]; - qfv_pipelinestagepair_t stages; - stages = imageLayoutTransitionStages[qfv_LT_Undefined_to_TransferDst]; - barrier = imageLayoutTransitionBarriers[qfv_LT_Undefined_to_TransferDst]; - barrier.subresourceRange.levelCount = VK_REMAINING_MIP_LEVELS; - barrier.subresourceRange.layerCount = VK_REMAINING_ARRAY_LAYERS; - barriers[0] = barrier; - barriers[1] = barrier; + qfv_imagebarrier_t ib = imageBarriers[qfv_LT_Undefined_to_TransferDst]; + ib.barrier.subresourceRange.levelCount = VK_REMAINING_MIP_LEVELS; + ib.barrier.subresourceRange.layerCount = VK_REMAINING_ARRAY_LAYERS; + VkImageMemoryBarrier barriers[2] = { ib.barrier, ib.barrier }; barriers[0].image = skybox; barriers[1].image = skysheet; - dfunc->vkCmdPipelineBarrier (packet->cmd, stages.src, stages.dst, + dfunc->vkCmdPipelineBarrier (packet->cmd, ib.srcStages, ib.dstStages, 0, 0, 0, 0, 0, 2, barriers); @@ -1419,15 +1414,14 @@ create_default_skys (vulkan_ctx_t *ctx) VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, &color, 1, &range); - stages = imageLayoutTransitionStages[qfv_LT_TransferDst_to_ShaderReadOnly]; - barrier=imageLayoutTransitionBarriers[qfv_LT_TransferDst_to_ShaderReadOnly]; - barrier.subresourceRange.levelCount = VK_REMAINING_MIP_LEVELS; - barrier.subresourceRange.layerCount = VK_REMAINING_ARRAY_LAYERS; - barriers[0] = barrier; - barriers[1] = barrier; + ib = imageBarriers[qfv_LT_TransferDst_to_ShaderReadOnly]; + ib.barrier.subresourceRange.levelCount = VK_REMAINING_MIP_LEVELS; + ib.barrier.subresourceRange.layerCount = VK_REMAINING_ARRAY_LAYERS; + barriers[0] = ib.barrier; + barriers[1] = ib.barrier; barriers[0].image = skybox; barriers[1].image = skysheet; - dfunc->vkCmdPipelineBarrier (packet->cmd, stages.src, stages.dst, + dfunc->vkCmdPipelineBarrier (packet->cmd, ib.srcStages, ib.dstStages, 0, 0, 0, 0, 0, 2, barriers); QFV_PacketSubmit (packet); diff --git a/libs/video/renderer/vulkan/vulkan_texture.c b/libs/video/renderer/vulkan/vulkan_texture.c index 7aa8cfc64..4a6949881 100644 --- a/libs/video/renderer/vulkan/vulkan_texture.c +++ b/libs/video/renderer/vulkan/vulkan_texture.c @@ -203,16 +203,12 @@ Vulkan_LoadTex (vulkan_ctx_t *ctx, tex_t *tex, int mip, const char *name) qfv_packet_t *packet = QFV_PacketAcquire (ctx->staging); stage_tex_data (packet, tex, bpp); - VkImageMemoryBarrier barrier; - qfv_pipelinestagepair_t stages; - - stages = imageLayoutTransitionStages[qfv_LT_Undefined_to_TransferDst]; - barrier = imageLayoutTransitionBarriers[qfv_LT_Undefined_to_TransferDst]; - barrier.image = qtex->image; - barrier.subresourceRange.levelCount = VK_REMAINING_MIP_LEVELS; - dfunc->vkCmdPipelineBarrier (packet->cmd, stages.src, stages.dst, + qfv_imagebarrier_t ib = imageBarriers[qfv_LT_Undefined_to_TransferDst]; + ib.barrier.image = qtex->image; + ib.barrier.subresourceRange.levelCount = VK_REMAINING_MIP_LEVELS; + dfunc->vkCmdPipelineBarrier (packet->cmd, ib.srcStages, ib.dstStages, 0, 0, 0, 0, 0, - 1, &barrier); + 1, &ib.barrier); VkBufferImageCopy copy = { packet->offset, 0, 0, {VK_IMAGE_ASPECT_COLOR_BIT, 0, 0, 1}, @@ -223,12 +219,11 @@ Vulkan_LoadTex (vulkan_ctx_t *ctx, tex_t *tex, int mip, const char *name) VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, ©); if (mip == 1) { - stages = imageLayoutTransitionStages[qfv_LT_TransferDst_to_ShaderReadOnly]; - barrier=imageLayoutTransitionBarriers[qfv_LT_TransferDst_to_ShaderReadOnly]; - barrier.image = qtex->image; - dfunc->vkCmdPipelineBarrier (packet->cmd, stages.src, stages.dst, + ib = imageBarriers[qfv_LT_TransferDst_to_ShaderReadOnly]; + ib.barrier.image = qtex->image; + dfunc->vkCmdPipelineBarrier (packet->cmd, ib.srcStages, ib.dstStages, 0, 0, 0, 0, 0, - 1, &barrier); + 1, &ib.barrier); } else { QFV_GenerateMipMaps (device, packet->cmd, qtex->image, mip, tex->width, tex->height, 1); @@ -297,17 +292,13 @@ Vulkan_LoadEnvMap (vulkan_ctx_t *ctx, tex_t *tex, const char *name) qfv_packet_t *packet = QFV_PacketAcquire (ctx->staging); stage_tex_data (packet, tex, bpp); - VkImageMemoryBarrier barrier; - qfv_pipelinestagepair_t stages; - - stages = imageLayoutTransitionStages[qfv_LT_Undefined_to_TransferDst]; - barrier = imageLayoutTransitionBarriers[qfv_LT_Undefined_to_TransferDst]; - barrier.image = qtex->image; - barrier.subresourceRange.levelCount = VK_REMAINING_MIP_LEVELS; - barrier.subresourceRange.layerCount = VK_REMAINING_ARRAY_LAYERS; - dfunc->vkCmdPipelineBarrier (packet->cmd, stages.src, stages.dst, + qfv_imagebarrier_t ib = imageBarriers[qfv_LT_Undefined_to_TransferDst]; + ib.barrier.image = qtex->image; + ib.barrier.subresourceRange.levelCount = VK_REMAINING_MIP_LEVELS; + ib.barrier.subresourceRange.layerCount = VK_REMAINING_ARRAY_LAYERS; + dfunc->vkCmdPipelineBarrier (packet->cmd, ib.srcStages, ib.dstStages, 0, 0, 0, 0, 0, - 1, &barrier); + 1, &ib.barrier); VkBufferImageCopy copy[6] = { { @@ -328,14 +319,13 @@ Vulkan_LoadEnvMap (vulkan_ctx_t *ctx, tex_t *tex, const char *name) qtex->image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 6, copy); - stages = imageLayoutTransitionStages[qfv_LT_TransferDst_to_ShaderReadOnly]; - barrier=imageLayoutTransitionBarriers[qfv_LT_TransferDst_to_ShaderReadOnly]; - barrier.image = qtex->image; - barrier.subresourceRange.levelCount = VK_REMAINING_MIP_LEVELS; - barrier.subresourceRange.layerCount = VK_REMAINING_ARRAY_LAYERS; - dfunc->vkCmdPipelineBarrier (packet->cmd, stages.src, stages.dst, + ib = imageBarriers[qfv_LT_TransferDst_to_ShaderReadOnly]; + ib.barrier.image = qtex->image; + ib.barrier.subresourceRange.levelCount = VK_REMAINING_MIP_LEVELS; + ib.barrier.subresourceRange.layerCount = VK_REMAINING_ARRAY_LAYERS; + dfunc->vkCmdPipelineBarrier (packet->cmd, ib.srcStages, ib.dstStages, 0, 0, 0, 0, 0, - 1, &barrier); + 1, &ib.barrier); QFV_PacketSubmit (packet); return qtex; } @@ -367,17 +357,13 @@ Vulkan_LoadEnvSides (vulkan_ctx_t *ctx, tex_t **tex, const char *name) qfv_packet_t *packet = QFV_PacketAcquire (ctx->staging); - VkImageMemoryBarrier barrier; - qfv_pipelinestagepair_t stages; - - stages = imageLayoutTransitionStages[qfv_LT_Undefined_to_TransferDst]; - barrier = imageLayoutTransitionBarriers[qfv_LT_Undefined_to_TransferDst]; - barrier.image = qtex->image; - barrier.subresourceRange.levelCount = VK_REMAINING_MIP_LEVELS; - barrier.subresourceRange.layerCount = VK_REMAINING_ARRAY_LAYERS; - dfunc->vkCmdPipelineBarrier (packet->cmd, stages.src, stages.dst, + qfv_imagebarrier_t ib = imageBarriers[qfv_LT_Undefined_to_TransferDst]; + ib.barrier.image = qtex->image; + ib.barrier.subresourceRange.levelCount = VK_REMAINING_MIP_LEVELS; + ib.barrier.subresourceRange.layerCount = VK_REMAINING_ARRAY_LAYERS; + dfunc->vkCmdPipelineBarrier (packet->cmd, ib.srcStages, ib.dstStages, 0, 0, 0, 0, 0, - 1, &barrier); + 1, &ib.barrier); VkBufferImageCopy copy[6] = { { @@ -395,14 +381,13 @@ Vulkan_LoadEnvSides (vulkan_ctx_t *ctx, tex_t **tex, const char *name) qtex->image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 6, copy); - stages = imageLayoutTransitionStages[qfv_LT_TransferDst_to_ShaderReadOnly]; - barrier=imageLayoutTransitionBarriers[qfv_LT_TransferDst_to_ShaderReadOnly]; - barrier.image = qtex->image; - barrier.subresourceRange.levelCount = VK_REMAINING_MIP_LEVELS; - barrier.subresourceRange.layerCount = VK_REMAINING_ARRAY_LAYERS; - dfunc->vkCmdPipelineBarrier (packet->cmd, stages.src, stages.dst, + ib = imageBarriers[qfv_LT_TransferDst_to_ShaderReadOnly]; + ib.barrier.image = qtex->image; + ib.barrier.subresourceRange.levelCount = VK_REMAINING_MIP_LEVELS; + ib.barrier.subresourceRange.layerCount = VK_REMAINING_ARRAY_LAYERS; + dfunc->vkCmdPipelineBarrier (packet->cmd, ib.srcStages, ib.dstStages, 0, 0, 0, 0, 0, - 1, &barrier); + 1, &ib.barrier); QFV_PacketSubmit (packet); return qtex; }