MCPcopy Create free account
hub / github.com/NVIDIAGameWorks/Falcor / create

Method create

Source/Falcor/Core/API/CopyContext.cpp:320–377  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

318}
319
320CopyContext::ReadTextureTask::SharedPtr CopyContext::ReadTextureTask::create(
321 CopyContext* pCtx,
322 const Texture* pTexture,
323 uint32_t subresourceIndex
324)
325{
326 SharedPtr pThis = SharedPtr(new ReadTextureTask);
327 pThis->mpContext = pCtx;
328 // Get footprint
329 gfx::ITextureResource* srcTexture = pTexture->getGfxTextureResource();
330 gfx::FormatInfo formatInfo;
331 gfx::gfxGetFormatInfo(srcTexture->getDesc()->format, &formatInfo);
332
333 auto mipLevel = pTexture->getSubresourceMipLevel(subresourceIndex);
334 pThis->mActualRowSize =
335 uint32_t((pTexture->getWidth(mipLevel) + formatInfo.blockWidth - 1) / formatInfo.blockWidth * formatInfo.blockSizeInBytes);
336 size_t rowAlignment = 1;
337 pCtx->mpDevice->getGfxDevice()->getTextureRowAlignment(&rowAlignment);
338 pThis->mRowSize = align_to(static_cast<uint32_t>(rowAlignment), pThis->mActualRowSize);
339 uint64_t rowCount = (pTexture->getHeight(mipLevel) + formatInfo.blockHeight - 1) / formatInfo.blockHeight;
340 uint64_t size = pTexture->getDepth(mipLevel) * rowCount * pThis->mRowSize;
341
342 // Create buffer
343 pThis->mpBuffer = pCtx->getDevice()->createBuffer(size, ResourceBindFlags::None, MemoryType::ReadBack, nullptr);
344
345 // Copy from texture to buffer
346 pCtx->resourceBarrier(pTexture, Resource::State::CopySource);
347 auto encoder = pCtx->getLowLevelData()->getResourceCommandEncoder();
348 gfx::SubresourceRange srcSubresource = {};
349 srcSubresource.baseArrayLayer = pTexture->getSubresourceArraySlice(subresourceIndex);
350 srcSubresource.mipLevel = mipLevel;
351 srcSubresource.layerCount = 1;
352 srcSubresource.mipLevelCount = 1;
353 encoder->copyTextureToBuffer(
354 pThis->mpBuffer->getGfxBufferResource(),
355 0,
356 size,
357 pThis->mRowSize,
358 srcTexture,
359 gfx::ResourceState::CopySource,
360 srcSubresource,
361 gfx::ITextureResource::Offset3D(0, 0, 0),
362 gfx::ITextureResource::Extents{
363 static_cast<gfx::GfxIndex>(pTexture->getWidth(mipLevel)),
364 static_cast<gfx::GfxIndex>(pTexture->getHeight(mipLevel)),
365 static_cast<gfx::GfxIndex>(pTexture->getDepth(mipLevel))}
366 );
367 pCtx->setPendingCommands(true);
368
369 // Create a fence and signal
370 pThis->mpFence = pCtx->getDevice()->createFence();
371 pThis->mpFence->breakStrongReferenceToDevice();
372 pCtx->submit(false);
373 pCtx->signal(pThis->mpFence.get());
374 pThis->mRowCount = (uint32_t)rowCount;
375 pThis->mDepth = pTexture->getDepth(mipLevel);
376 return pThis;
377}

Callers

nothing calls this directly

Calls 13

align_toFunction · 0.85
getWidthMethod · 0.80
getHeightMethod · 0.80
createBufferMethod · 0.80
resourceBarrierMethod · 0.80
createFenceMethod · 0.80
getDeviceMethod · 0.45
submitMethod · 0.45
signalMethod · 0.45

Tested by

no test coverage detected