ID3D12GraphicsCommandList::CopyResource 메서드(d3d12.h)
원본 리소스의 전체 내용을 대상 리소스에 복사합니다.
구문
void CopyResource(
[in] ID3D12Resource *pDstResource,
[in] ID3D12Resource *pSrcResource
);
매개 변수
[in] pDstResource
형식: ID3D12Resource*
대상 리소스를 나타내는 ID3D12Resource 인터페이스에 대한 포인터입니다.
[in] pSrcResource
형식: ID3D12Resource*
원본 리소스를 나타내는 ID3D12Resource 인터페이스에 대한 포인터입니다.
반환 값
없음
설명
CopyResource 작업은 GPU에서 수행되며 복사할 데이터의 크기에 따라 선형적으로 상당한 CPU 워크로드가 발생하지 않습니다.
CopyResource 를 사용하여 동일한 힙 메모리를 별칭으로 지정하는 리소스를 초기화할 수 있습니다. 자세한 내용은 CreatePlacedResource 를 참조하세요.
디버그 계층
원본 하위 리소스가 D3D12_RESOURCE_STATE_COPY_SOURCE 상태가 아니면 디버그 계층에서 오류가 발생합니다.
대상 하위 리소스가 D3D12_RESOURCE_STATE_COPY_DEST 상태가 아니면 디버그 계층에서 오류가 발생합니다.
제한
이 메서드에는 성능 향상을 위해 설계된 몇 가지 제한 사항이 있습니다. instance 경우 원본 및 대상 리소스는 다음과 같습니다.
- 다른 리소스여야 합니다.
- 동일한 형식이어야 합니다.
- 총 크기(바이트)와 같아야 합니다.
- 동일한 차원(너비, 높이, 깊이)이 있거나 호환되는 재해석 복사여야 합니다.
- 호환되는 DXGI 형식이 있어야 합니다. 즉, 형식이 동일하거나 적어도 동일한 형식 그룹에서 와야 합니다. 예를 들어 이러한 두 형식이 모두 DXGI_FORMAT_R32G32B32_TYPELESS 그룹에 있으므로 DXGI_FORMAT_R32G32B32_FLOAT 텍스처를 DXGI_FORMAT_R32G32B32_UINT 텍스처에 복사할 수 있습니다. CopyResource는 몇 가지 형식 형식 간에 복사할 수 있습니다( 복사 재해석 참조).
- 현재 매핑할 수 없습니다.
CopyResource는 복사만 지원합니다. 스트레치, 색 키 또는 혼합을 지원하지 않습니다.
CopyResource는 몇 가지 형식 형식 간에 리소스 데이터를 재해석할 수 있습니다. 자세한 내용은 아래 복사 다시 해석을 참조하세요.
깊이 스텐실 리소스를 원본 또는 대상으로 사용할 수 있습니다. 다중 샘플링 기능( DXGI_SAMPLE_DESC 참조)으로 만든 리소스는 원본과 대상 모두 다중 샘플링 수와 품질이 동일한 경우에만 원본 및 대상으로 사용할 수 있습니다. 원본과 대상이 다중 샘플링된 수와 품질이 다르거나 다중 샘플링되고 다른 하나는 다중 샘플링되지 않은 경우 CopyResource 에 대한 호출이 실패합니다. ResolveSubresource를 사용하여 다중 샘플링된 리소스를 다중 샘플링되지 않은 리소스에 resolve.
메서드는 명령 버퍼 큐에 추가할 수 있는 비동기 호출입니다. 이렇게 하면 데이터를 복사할 때 발생할 수 있는 파이프라인 중단이 제거됩니다. 자세한 내용은 성능 고려 사항을 참조하세요.
리소스에서 데이터의 일부만 복사해야 하는 경우 CopyTextureRegion 또는 CopyBufferRegion 을 사용하는 것이 좋습니다.
복사본 재해석
다음 표에서는 형식 변환의 재해석 형식에 사용할 수 있는 허용 가능한 원본 및 대상 형식을 나열합니다. 기본 데이터 값은 변환되거나 압축/압축/압축 해제되지 않으며 재해석이 예상대로 작동하려면 제대로 인코딩되어야 합니다. 자세한 내용은 Direct3D 10.1을 사용하여 형식 변환을 참조하세요.
DXGI_FORMAT_R9G9B9E5_SHAREDEXP 경우 너비와 높이가 같아야 합니다(블록당 1텍셀).
블록 압축 리소스 너비 및 높이는 압축되지 않은 리소스 너비 및 높이(블록당 16텍셀)의 4배여야 합니다. 예를 들어 압축되지 않은 256x256 DXGI_FORMAT_R32G32B32A32_UINT 텍스처는 1024x1024 DXGI_FORMAT_BC5_UNORM 압축된 텍스처에 매핑됩니다.
비트 너비 | 압축되지 않은 리소스 | 블록 압축 리소스 | 너비/높이 차이 |
---|---|---|---|
32 | DXGI_FORMAT_R32_UINT DXGI_FORMAT_R32_SINT |
DXGI_FORMAT_R9G9B9E5_SHAREDEXP | 1:1 |
64 | DXGI_FORMAT_R16G16B16A16_UINT DXGI_FORMAT_R16G16B16A16_SINT DXGI_FORMAT_R32G32_UINT DXGI_FORMAT_R32G32_SINT |
DXGI_FORMAT_BC1_UNORM[_SRGB] DXGI_FORMAT_BC4_UNORM DXGI_FORMAT_BC4_SNORM |
1:4 |
128 | DXGI_FORMAT_R32G32B32A32_UINT DXGI_FORMAT_R32G32B32A32_SINT |
DXGI_FORMAT_BC2_UNORM[_SRGB] DXGI_FORMAT_BC3_UNORM[_SRGB] DXGI_FORMAT_BC5_UNORM DXGI_FORMAT_BC5_SNORM |
1:4 |
예제
D3D12HeterogeneousMultiadapter 샘플은 다음과 같은 방식으로 CopyResource를 사용합니다.
// Command list to copy the render target to the shared heap on the primary adapter.
{
const GraphicsAdapter adapter = Primary;
// Reset the copy command allocator and command list.
ThrowIfFailed(m_copyCommandAllocators[m_frameIndex]->Reset());
ThrowIfFailed(m_copyCommandList->Reset(m_copyCommandAllocators[m_frameIndex].Get(), nullptr));
// Copy the intermediate render target to the cross-adapter shared resource.
// Transition barriers are not required since there are fences guarding against
// concurrent read/write access to the shared heap.
if (m_crossAdapterTextureSupport)
{
// If cross-adapter row-major textures are supported by the adapter,
// simply copy the texture into the cross-adapter texture.
m_copyCommandList->CopyResource(m_crossAdapterResources[adapter][m_frameIndex].Get(), m_renderTargets[adapter][m_frameIndex].Get());
}
else
{
// If cross-adapter row-major textures are not supported by the adapter,
// the texture will be copied over as a buffer so that the texture row
// pitch can be explicitly managed.
// Copy the intermediate render target into the shared buffer using the
// memory layout prescribed by the render target.
D3D12_RESOURCE_DESC renderTargetDesc = m_renderTargets[adapter][m_frameIndex]->GetDesc();
D3D12_PLACED_SUBRESOURCE_FOOTPRINT renderTargetLayout;
m_devices[adapter]->GetCopyableFootprints(&renderTargetDesc, 0, 1, 0, &renderTargetLayout, nullptr, nullptr, nullptr);
CD3DX12_TEXTURE_COPY_LOCATION dest(m_crossAdapterResources[adapter][m_frameIndex].Get(), renderTargetLayout);
CD3DX12_TEXTURE_COPY_LOCATION src(m_renderTargets[adapter][m_frameIndex].Get(), 0);
CD3DX12_BOX box(0, 0, m_width, m_height);
m_copyCommandList->CopyTextureRegion(&dest, 0, 0, 0, &src, &box);
}
ThrowIfFailed(m_copyCommandList->Close());
}
요구 사항
요구 사항 | 값 |
---|---|
대상 플랫폼 | Windows |
헤더 | d3d12.h |
라이브러리 | D3d12.lib |
DLL | D3d12.dll |