MCPcopy Create free account
hub / github.com/NVIDIA-RTX/RTXNTC / CopyBufferToTextureVulkan

Function CopyBufferToTextureVulkan

libraries/ntc-utils/src/BufferLoading.cpp:209–250  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

207}
208
209bool 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, &region);
245
246 return true;
247#else
248 return false;
249#endif
250}
251
252bool ExecuteBufferLoadingTasks(
253 nvrhi::IDevice* device,

Callers 1

Calls

no outgoing calls

Tested by

no test coverage detected