@@ -627,6 +627,115 @@ pl_copy_texture_to_buffer(plBlitEncoder* ptEncoder, plTextureHandle tTextureHand
627627 pl_temp_allocator_reset (& gptGraphics -> tTempAllocator );
628628}
629629
630+ void
631+ pl_copy_texture (plBlitEncoder * ptEncoder , plTextureHandle tSrcHandle , plTextureHandle tDstHandle , uint32_t uRegionCount , const plImageCopy * ptRegions )
632+ {
633+ plCommandBuffer * ptCmdBuffer = ptEncoder -> ptCommandBuffer ;
634+ plDevice * ptDevice = ptCmdBuffer -> ptDevice ;
635+
636+ // allocate temporary memory
637+ VkImageCopy * atCopyRegions = pl_temp_allocator_alloc (& gptGraphics -> tTempAllocator , sizeof (VkImageCopy ) * uRegionCount );
638+ memset (atCopyRegions , 0 , sizeof (VkImageCopy ) * uRegionCount );
639+
640+ VkImageSubresourceRange * atSubResourceRanges = pl_temp_allocator_alloc (& gptGraphics -> tTempAllocator , sizeof (VkImageSubresourceRange ) * uRegionCount );
641+ memset (atSubResourceRanges , 0 , sizeof (VkImageSubresourceRange ) * uRegionCount * 2 );
642+
643+ // setup copy regions
644+ plTexture * ptColdSrcTexture = pl__get_texture (ptDevice , tSrcHandle );
645+ plTexture * ptColdDstTexture = pl__get_texture (ptDevice , tDstHandle );
646+
647+ uint32_t uCurrentSrcBaseArrayLevel = UINT32_MAX ;
648+ uint32_t uCurrentSrcMipLevel = UINT32_MAX ;
649+
650+ uint32_t uCurrentDestBaseArrayLevel = UINT32_MAX ;
651+ uint32_t uCurrentDestMipLevel = UINT32_MAX ;
652+
653+ for (uint32_t i = 0 ; i < uRegionCount ; i ++ )
654+ {
655+
656+ atSubResourceRanges [i ].aspectMask = ptColdSrcTexture -> tDesc .tUsage & PL_TEXTURE_USAGE_DEPTH_STENCIL_ATTACHMENT ? VK_IMAGE_ASPECT_DEPTH_BIT : VK_IMAGE_ASPECT_COLOR_BIT ;
657+ atSubResourceRanges [i ].baseMipLevel = ptRegions [i ].uSourceMipLevel ;
658+ atSubResourceRanges [i ].levelCount = ptRegions [i ].uSourceLayerCount ;
659+ atSubResourceRanges [i ].baseArrayLayer = ptRegions [i ].uSourceBaseArrayLayer ;
660+ atSubResourceRanges [i ].layerCount = ptRegions [i ].uSourceLayerCount ;
661+
662+ atSubResourceRanges [i + uRegionCount ].aspectMask = ptColdDstTexture -> tDesc .tUsage & PL_TEXTURE_USAGE_DEPTH_STENCIL_ATTACHMENT ? VK_IMAGE_ASPECT_DEPTH_BIT : VK_IMAGE_ASPECT_COLOR_BIT ;
663+ atSubResourceRanges [i + uRegionCount ].baseMipLevel = ptRegions [i ].uDestinationMipLevel ;
664+ atSubResourceRanges [i + uRegionCount ].levelCount = ptRegions [i ].uDestinationLayerCount ;
665+ atSubResourceRanges [i + uRegionCount ].baseArrayLayer = ptRegions [i ].uDestinationBaseArrayLayer ;
666+ atSubResourceRanges [i + uRegionCount ].layerCount = ptRegions [i ].uDestinationLayerCount ;
667+
668+
669+ if (uCurrentSrcBaseArrayLevel != atSubResourceRanges [i ].baseArrayLayer || uCurrentSrcMipLevel != atSubResourceRanges [i ].baseMipLevel )
670+ {
671+ pl__transition_image_layout (ptCmdBuffer -> tCmdBuffer , ptDevice -> sbtTexturesHot [tSrcHandle .uIndex ].tImage , pl__vulkan_layout (ptRegions [i ].tSourceImageUsage ), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL , atSubResourceRanges [i ], VK_PIPELINE_STAGE_ALL_COMMANDS_BIT , VK_PIPELINE_STAGE_TRANSFER_BIT );
672+ uCurrentSrcBaseArrayLevel = atSubResourceRanges [i ].baseArrayLayer ;
673+ uCurrentSrcMipLevel = atSubResourceRanges [i ].baseMipLevel ;
674+ }
675+
676+ if (uCurrentDestBaseArrayLevel != atSubResourceRanges [i + uRegionCount ].baseArrayLayer || uCurrentDestMipLevel != atSubResourceRanges [i + uRegionCount ].baseMipLevel )
677+ {
678+ pl__transition_image_layout (ptCmdBuffer -> tCmdBuffer , ptDevice -> sbtTexturesHot [tDstHandle .uIndex ].tImage , pl__vulkan_layout (ptRegions [i ].tDestinationImageUsage ), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL , atSubResourceRanges [i + uRegionCount ], VK_PIPELINE_STAGE_ALL_COMMANDS_BIT , VK_PIPELINE_STAGE_TRANSFER_BIT );
679+ uCurrentDestBaseArrayLevel = atSubResourceRanges [i + uRegionCount ].baseArrayLayer ;
680+ uCurrentDestMipLevel = atSubResourceRanges [i + uRegionCount ].baseMipLevel ;
681+ }
682+
683+
684+ atCopyRegions [i ].srcOffset .x = ptRegions [i ].iSourceOffsetX ;
685+ atCopyRegions [i ].srcOffset .y = ptRegions [i ].iSourceOffsetY ;
686+ atCopyRegions [i ].srcOffset .z = ptRegions [i ].iSourceOffsetZ ;
687+
688+ atCopyRegions [i ].extent .width = ptRegions [i ].uSourceExtentX ;
689+ atCopyRegions [i ].extent .height = ptRegions [i ].uSourceExtentY ;
690+ atCopyRegions [i ].extent .depth = ptRegions [i ].uSourceExtentZ ;
691+
692+ atCopyRegions [i ].srcSubresource .baseArrayLayer = ptRegions [i ].uSourceBaseArrayLayer ;
693+ atCopyRegions [i ].srcSubresource .layerCount = ptRegions [i ].uSourceLayerCount ;
694+ atCopyRegions [i ].srcSubresource .mipLevel = ptRegions [i ].uSourceMipLevel ;
695+ atCopyRegions [i ].srcSubresource .aspectMask = ptColdSrcTexture -> tDesc .tUsage & PL_TEXTURE_USAGE_DEPTH_STENCIL_ATTACHMENT ? VK_IMAGE_ASPECT_DEPTH_BIT : VK_IMAGE_ASPECT_COLOR_BIT ;
696+
697+ atCopyRegions [i ].dstOffset .x = ptRegions [i ].iDestinationOffsetX ;
698+ atCopyRegions [i ].dstOffset .y = ptRegions [i ].iDestinationOffsetY ;
699+ atCopyRegions [i ].dstOffset .z = ptRegions [i ].iDestinationOffsetZ ;
700+
701+ atCopyRegions [i ].dstSubresource .baseArrayLayer = ptRegions [i ].uDestinationBaseArrayLayer ;
702+ atCopyRegions [i ].dstSubresource .layerCount = ptRegions [i ].uDestinationLayerCount ;
703+ atCopyRegions [i ].dstSubresource .mipLevel = ptRegions [i ].uDestinationMipLevel ;
704+ atCopyRegions [i ].dstSubresource .aspectMask = ptColdDstTexture -> tDesc .tUsage & PL_TEXTURE_USAGE_DEPTH_STENCIL_ATTACHMENT ? VK_IMAGE_ASPECT_DEPTH_BIT : VK_IMAGE_ASPECT_COLOR_BIT ;
705+ }
706+
707+ vkCmdCopyImage (ptCmdBuffer -> tCmdBuffer ,
708+ ptDevice -> sbtTexturesHot [tSrcHandle .uIndex ].tImage ,
709+ VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL ,
710+ ptDevice -> sbtTexturesHot [tDstHandle .uIndex ].tImage ,
711+ VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL ,
712+ uRegionCount ,
713+ atCopyRegions );
714+
715+ uCurrentSrcBaseArrayLevel = UINT32_MAX ;
716+ uCurrentSrcMipLevel = UINT32_MAX ;
717+ uCurrentDestBaseArrayLevel = UINT32_MAX ;
718+ uCurrentDestMipLevel = UINT32_MAX ;
719+
720+ for (uint32_t i = 0 ; i < uRegionCount ; i ++ )
721+ {
722+ if (uCurrentSrcBaseArrayLevel != atSubResourceRanges [i ].baseArrayLayer || uCurrentSrcMipLevel != atSubResourceRanges [i ].baseMipLevel )
723+ {
724+ pl__transition_image_layout (ptCmdBuffer -> tCmdBuffer , ptDevice -> sbtTexturesHot [tSrcHandle .uIndex ].tImage , VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL , pl__vulkan_layout (ptRegions [i ].tSourceImageUsage ), atSubResourceRanges [i ], VK_PIPELINE_STAGE_TRANSFER_BIT , VK_PIPELINE_STAGE_ALL_COMMANDS_BIT );
725+ uCurrentSrcBaseArrayLevel = atSubResourceRanges [i ].baseArrayLayer ;
726+ uCurrentSrcMipLevel = atSubResourceRanges [i ].baseMipLevel ;
727+ }
728+ if (uCurrentDestBaseArrayLevel != atSubResourceRanges [i + uRegionCount ].baseArrayLayer || uCurrentDestMipLevel != atSubResourceRanges [i + uRegionCount ].baseMipLevel )
729+ {
730+ pl__transition_image_layout (ptCmdBuffer -> tCmdBuffer , ptDevice -> sbtTexturesHot [tDstHandle .uIndex ].tImage , VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL , pl__vulkan_layout (ptRegions [i ].tDestinationImageUsage ), atSubResourceRanges [i + uRegionCount ], VK_PIPELINE_STAGE_TRANSFER_BIT , VK_PIPELINE_STAGE_ALL_COMMANDS_BIT );
731+ uCurrentDestBaseArrayLevel = atSubResourceRanges [i + uRegionCount ].baseArrayLayer ;
732+ uCurrentDestMipLevel = atSubResourceRanges [i + uRegionCount ].baseMipLevel ;
733+ }
734+ }
735+
736+ pl_temp_allocator_reset (& gptGraphics -> tTempAllocator );
737+ }
738+
630739void
631740pl_generate_mipmaps (plBlitEncoder * ptEncoder , plTextureHandle tTexture )
632741{
@@ -946,7 +1055,7 @@ pl_update_bind_group(plDevice* ptDevice, plBindGroupHandle tHandle, const plBind
9461055 const plVulkanBuffer * ptVulkanBuffer = & ptDevice -> sbtBuffersHot [ptData -> atBufferBindings [i ].tBuffer .uIndex ];
9471056
9481057 sbtBufferDescInfos [i ].buffer = ptVulkanBuffer -> tBuffer ;
949- sbtBufferDescInfos [i ].offset = ptData -> atBufferBindings [i ].szOffset ;
1058+ sbtBufferDescInfos [i ].offset = ptData -> atBufferBindings [i ]._szOffset ;
9501059 sbtBufferDescInfos [i ].range = ptData -> atBufferBindings [i ].szBufferRange == 0 ? VK_WHOLE_SIZE : ptData -> atBufferBindings [i ].szBufferRange ;
9511060
9521061 sbtWrites [uCurrentWrite ].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET ;
0 commit comments