@@ -729,39 +729,32 @@ bool CVulkanCommandBuffer::drawIndexedIndirectCount_impl(const asset::SBufferBin
729729 return true ;
730730}
731731
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)
733733{
734734 VkImage vk_srcImage = static_cast <const CVulkanImage*>(srcImage)->getInternalObject ();
735735 VkImage vk_dstImage = static_cast <const CVulkanImage*>(dstImage)->getInternalObject ();
736736
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)
742740 {
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++;
760755 }
761756
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));
765758
766759 return true ;
767760}
0 commit comments