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

추가 정보

ID3D12GraphicsCommandList