@@ -729,39 +729,32 @@ bool CVulkanCommandBuffer::drawIndexedIndirectCount_impl(const asset::SBufferBin
729
729
return true ;
730
730
}
731
731
732
- bool CVulkanCommandBuffer::blitImage_impl (const IGPUImage* const srcImage, const IGPUImage::LAYOUT srcImageLayout, IGPUImage* const dstImage, const IGPUImage::LAYOUT dstImageLayout, const uint32_t regionCount, const SImageBlit* pRegions , const IGPUSampler::E_TEXTURE_FILTER filter)
732
+ bool CVulkanCommandBuffer::blitImage_impl (const IGPUImage* const srcImage, const IGPUImage::LAYOUT srcImageLayout, IGPUImage* const dstImage, const IGPUImage::LAYOUT dstImageLayout, const std::span< const SImageBlit> regions , const IGPUSampler::E_TEXTURE_FILTER filter)
733
733
{
734
734
VkImage vk_srcImage = static_cast <const CVulkanImage*>(srcImage)->getInternalObject ();
735
735
VkImage vk_dstImage = static_cast <const CVulkanImage*>(dstImage)->getInternalObject ();
736
736
737
- constexpr uint32_t MAX_BLIT_REGION_COUNT = 100u ;
738
- VkImageBlit vk_blitRegions[MAX_BLIT_REGION_COUNT];
739
- assert (regionCount <= MAX_BLIT_REGION_COUNT);
740
-
741
- for (uint32_t i = 0u ; i < regionCount; ++i)
737
+ core::vector<VkImageBlit> vk_blitRegions (regions.size ());
738
+ auto outRegionIt = vk_blitRegions.data ();
739
+ for (auto region : regions)
742
740
{
743
- vk_blitRegions[i].srcSubresource .aspectMask = static_cast <VkImageAspectFlags>(pRegions[i].srcSubresource .aspectMask .value );
744
- vk_blitRegions[i].srcSubresource .mipLevel = pRegions[i].srcSubresource .mipLevel ;
745
- vk_blitRegions[i].srcSubresource .baseArrayLayer = pRegions[i].srcSubresource .baseArrayLayer ;
746
- vk_blitRegions[i].srcSubresource .layerCount = pRegions[i].srcSubresource .layerCount ;
747
-
748
- // Todo(achal): Remove `static_cast`s
749
- vk_blitRegions[i].srcOffsets [0 ] = { static_cast <int32_t >(pRegions[i].srcOffsets [0 ].x ), static_cast <int32_t >(pRegions[i].srcOffsets [0 ].y ), static_cast <int32_t >(pRegions[i].srcOffsets [0 ].z ) };
750
- vk_blitRegions[i].srcOffsets [1 ] = { static_cast <int32_t >(pRegions[i].srcOffsets [1 ].x ), static_cast <int32_t >(pRegions[i].srcOffsets [1 ].y ), static_cast <int32_t >(pRegions[i].srcOffsets [1 ].z ) };
751
-
752
- vk_blitRegions[i].dstSubresource .aspectMask = static_cast <VkImageAspectFlags>(pRegions[i].dstSubresource .aspectMask .value );
753
- vk_blitRegions[i].dstSubresource .mipLevel = pRegions[i].dstSubresource .mipLevel ;
754
- vk_blitRegions[i].dstSubresource .baseArrayLayer = pRegions[i].dstSubresource .baseArrayLayer ;
755
- vk_blitRegions[i].dstSubresource .layerCount = pRegions[i].dstSubresource .layerCount ;
756
-
757
- // Todo(achal): Remove `static_cast`s
758
- vk_blitRegions[i].dstOffsets [0 ] = { static_cast <int32_t >(pRegions[i].dstOffsets [0 ].x ), static_cast <int32_t >(pRegions[i].dstOffsets [0 ].y ), static_cast <int32_t >(pRegions[i].dstOffsets [0 ].z ) };
759
- vk_blitRegions[i].dstOffsets [1 ] = { static_cast <int32_t >(pRegions[i].dstOffsets [1 ].x ), static_cast <int32_t >(pRegions[i].dstOffsets [1 ].y ), static_cast <int32_t >(pRegions[i].dstOffsets [1 ].z ) };
741
+ outRegionIt->srcSubresource .aspectMask = static_cast <VkImageAspectFlags>(region.aspectMask );
742
+ outRegionIt->srcSubresource .mipLevel = region.srcMipLevel ;
743
+ outRegionIt->srcSubresource .baseArrayLayer = region.srcBaseLayer ;
744
+ outRegionIt->srcSubresource .layerCount = region.layerCount ;
745
+
746
+ memcpy (outRegionIt->srcOffsets ,®ion.srcMinCoord ,sizeof (VkOffset3D)*2 );
747
+
748
+ outRegionIt->dstSubresource .aspectMask = static_cast <VkImageAspectFlags>(region.aspectMask );
749
+ outRegionIt->dstSubresource .mipLevel = region.dstMipLevel ;
750
+ outRegionIt->dstSubresource .baseArrayLayer = region.dstBaseLayer ;
751
+ outRegionIt->dstSubresource .layerCount = region.layerCount ;
752
+
753
+ memcpy (outRegionIt->dstOffsets ,®ion.dstMinCoord ,sizeof (VkOffset3D)*2 );
754
+ outRegionIt++;
760
755
}
761
756
762
- getFunctionTable ().vkCmdBlitImage (m_cmdbuf, vk_srcImage, getVkImageLayoutFromImageLayout (srcImageLayout),
763
- vk_dstImage, getVkImageLayoutFromImageLayout (dstImageLayout), regionCount, vk_blitRegions,
764
- static_cast <VkFilter>(filter));
757
+ getFunctionTable ().vkCmdBlitImage (m_cmdbuf,vk_srcImage,getVkImageLayoutFromImageLayout (srcImageLayout),vk_dstImage,getVkImageLayoutFromImageLayout (dstImageLayout),regions.size (),vk_blitRegions.data (),static_cast <VkFilter>(filter));
765
758
766
759
return true ;
767
760
}
0 commit comments