| 207 | } |
| 208 | |
| 209 | bool CopyBufferToTextureVulkan(nvrhi::ICommandList* commandList, |
| 210 | nvrhi::IBuffer* srcBuffer, |
| 211 | size_t srcOffset, |
| 212 | ntc::LatentTextureFootprint const& footprint, |
| 213 | nvrhi::ITexture* dstTexture, |
| 214 | int mipLevel, |
| 215 | int arrayLayer) |
| 216 | { |
| 217 | #if NTC_WITH_VULKAN |
| 218 | // Use a buffer-to-image copy with raw Vulkan API beacuse there is no way to do that through NVRHI. |
| 219 | // The closest feature a copyTexture function taking a StagingTexture, but it requires an actual staging texture, |
| 220 | // which we don't need here (no CPU access necessary), and NVRHI's StagingTexture doesn't provide access |
| 221 | // to the underlying buffer and its subresource placement. |
| 222 | |
| 223 | vk::BufferImageCopy region = vk::BufferImageCopy() |
| 224 | .setBufferOffset(srcOffset) |
| 225 | .setImageExtent(vk::Extent3D() |
| 226 | .setWidth(footprint.width) |
| 227 | .setHeight(footprint.height) |
| 228 | .setDepth(1)) |
| 229 | .setImageSubresource(vk::ImageSubresourceLayers() |
| 230 | .setAspectMask(vk::ImageAspectFlagBits::eColor) |
| 231 | .setBaseArrayLayer(arrayLayer) |
| 232 | .setMipLevel(mipLevel) |
| 233 | .setLayerCount(1)); |
| 234 | |
| 235 | vk::CommandBuffer vkCmdBuf = vk::CommandBuffer(commandList->getNativeObject(nvrhi::ObjectTypes::VK_CommandBuffer)); |
| 236 | assert(vkCmdBuf); |
| 237 | vk::Buffer vkSrcBuffer = vk::Buffer(srcBuffer->getNativeObject(nvrhi::ObjectTypes::VK_Buffer)); |
| 238 | assert(vkSrcBuffer); |
| 239 | vk::Image vkDstImage = vk::Image(dstTexture->getNativeObject(nvrhi::ObjectTypes::VK_Image)); |
| 240 | assert(vkDstImage); |
| 241 | |
| 242 | // Note: the image is already in the TransferDstOptimal layout, because we manage latent texture states |
| 243 | // explicitly, and they're transitioned to the CopyDest state in ExecuteTextureLoadingTasks(...) |
| 244 | vkCmdBuf.copyBufferToImage(vkSrcBuffer, vkDstImage, vk::ImageLayout::eTransferDstOptimal, 1, ®ion); |
| 245 | |
| 246 | return true; |
| 247 | #else |
| 248 | return false; |
| 249 | #endif |
| 250 | } |
| 251 | |
| 252 | bool ExecuteBufferLoadingTasks( |
| 253 | nvrhi::IDevice* device, |
no outgoing calls
no test coverage detected