| 485 | } |
| 486 | |
| 487 | void CopyContext::copyResource(const Resource* pDst, const Resource* pSrc) |
| 488 | { |
| 489 | // Copy from texture to texture or from buffer to buffer. |
| 490 | FALCOR_ASSERT(pDst->getType() == pSrc->getType()); |
| 491 | |
| 492 | resourceBarrier(pDst, Resource::State::CopyDest); |
| 493 | resourceBarrier(pSrc, Resource::State::CopySource); |
| 494 | |
| 495 | auto resourceEncoder = getLowLevelData()->getResourceCommandEncoder(); |
| 496 | |
| 497 | if (pDst->getType() == Resource::Type::Buffer) |
| 498 | { |
| 499 | const Buffer* pSrcBuffer = static_cast<const Buffer*>(pSrc); |
| 500 | const Buffer* pDstBuffer = static_cast<const Buffer*>(pDst); |
| 501 | |
| 502 | FALCOR_ASSERT(pSrcBuffer->getSize() <= pDstBuffer->getSize()); |
| 503 | |
| 504 | resourceEncoder->copyBuffer(pDstBuffer->getGfxBufferResource(), 0, pSrcBuffer->getGfxBufferResource(), 0, pSrcBuffer->getSize()); |
| 505 | } |
| 506 | else |
| 507 | { |
| 508 | const Texture* pSrcTexture = static_cast<const Texture*>(pSrc); |
| 509 | const Texture* pDstTexture = static_cast<const Texture*>(pDst); |
| 510 | gfx::SubresourceRange subresourceRange = {}; |
| 511 | resourceEncoder->copyTexture( |
| 512 | pDstTexture->getGfxTextureResource(), |
| 513 | gfx::ResourceState::CopyDestination, |
| 514 | subresourceRange, |
| 515 | gfx::ITextureResource::Offset3D(0, 0, 0), |
| 516 | pSrcTexture->getGfxTextureResource(), |
| 517 | gfx::ResourceState::CopySource, |
| 518 | subresourceRange, |
| 519 | gfx::ITextureResource::Offset3D(0, 0, 0), |
| 520 | gfx::ITextureResource::Extents{0, 0, 0} |
| 521 | ); |
| 522 | } |
| 523 | mCommandsPending = true; |
| 524 | } |
| 525 | |
| 526 | void CopyContext::copySubresource(const Texture* pDst, uint32_t dstSubresourceIdx, const Texture* pSrc, uint32_t srcSubresourceIdx) |
| 527 | { |