METODE ID3D12GraphicsCommandList::CopyResource (d3d12.h)

Menyalin seluruh konten sumber daya sumber ke sumber daya tujuan.

Sintaks

void CopyResource(
  [in] ID3D12Resource *pDstResource,
  [in] ID3D12Resource *pSrcResource
);

Parameter

[in] pDstResource

Jenis: ID3D12Resource*

Penunjuk ke antarmuka ID3D12Resource yang mewakili sumber daya tujuan.

[in] pSrcResource

Jenis: ID3D12Resource*

Penunjuk ke antarmuka ID3D12Resource yang mewakili sumber daya sumber.

Nilai kembali

Tidak ada

Keterangan

Operasi CopyResource dilakukan pada GPU, dan tidak menimbulkan beban kerja CPU yang signifikan secara linier tergantung pada ukuran data yang akan disalin.

CopyResource dapat digunakan untuk menginisialisasi sumber daya yang alias memori timbunan yang sama. Lihat CreatePlacedResource untuk detail selengkapnya.

Lapisan debug

Lapisan debug mengeluarkan kesalahan jika subresource sumber tidak dalam status D3D12_RESOURCE_STATE_COPY_SOURCE .

Lapisan debug mengeluarkan kesalahan jika subsumber daya tujuan tidak dalam status D3D12_RESOURCE_STATE_COPY_DEST .

Batasan

Metode ini memiliki beberapa batasan yang dirancang untuk meningkatkan performa. Misalnya, sumber daya sumber dan tujuan:

  • Harus sumber daya yang berbeda.
  • Harus tipe yang sama.
  • Harus berukuran total (byte) yang sama.
  • Harus memiliki dimensi yang identik (lebar, tinggi, kedalaman) atau menjadi Salinan Reinterpret yang kompatibel.
  • Harus memiliki format DXGI yang kompatibel, yang berarti format harus identik atau setidaknya dari grup jenis yang sama. Misalnya, tekstur DXGI_FORMAT_R32G32B32_FLOAT dapat disalin ke tekstur DXGI_FORMAT_R32G32B32_UINT karena kedua format ini berada dalam grup DXGI_FORMAT_R32G32B32_TYPELESS. CopyResource dapat menyalin antara beberapa jenis format (lihat Menginterpretasikan ulang salinan).
  • Saat ini tidak dapat dipetakan.

CopyResource hanya mendukung salinan; ini tidak mendukung peregangan, kunci warna, atau campuran apa pun.

CopyResource dapat menginterpretasikan ulang data sumber daya di antara beberapa jenis format, lihat Menginterpretasikan Ulang Salinan di bawah ini untuk detailnya.

Anda dapat menggunakan sumber daya stensil kedalaman sebagai sumber atau tujuan. Sumber daya yang dibuat dengan kemampuan multi-pengambilan sampel (lihat DXGI_SAMPLE_DESC) dapat digunakan sebagai sumber dan tujuan hanya jika sumber dan tujuan memiliki jumlah dan kualitas multi-sampel yang identik. Jika sumber dan tujuan berbeda dalam jumlah dan kualitas multi-sampel atau jika satu di-multi-sampel dan yang lain tidak multi-sampel, panggilan ke CopyResource gagal. Gunakan ResolveSubresource untuk mengatasi sumber daya multi-sampel ke sumber daya yang tidak multi-sampel.

Metode ini adalah panggilan asinkron, yang dapat ditambahkan ke antrean buffer perintah. Upaya ini untuk menghapus kios alur yang mungkin terjadi saat menyalin data. Untuk informasi selengkapnya, lihat pertimbangan performa.

Pertimbangkan untuk menggunakan CopyTextureRegion atau CopyBufferRegion jika Anda hanya perlu menyalin sebagian data dalam sumber daya.

Menginterpretasikan ulang salinan

Tabel berikut mencantumkan format sumber dan tujuan yang diizinkan yang bisa Anda gunakan dalam jenis konversi format reinterpretasi. Nilai data yang mendasar tidak dikonversi atau dikompresi/didekompresi dan harus dikodekan dengan benar agar reinterpretasi berfungsi seperti yang diharapkan. Untuk informasi selengkapnya, lihat Konversi Format menggunakan Direct3D 10.1.

Untuk DXGI_FORMAT_R9G9B9E5_SHAREDEXP lebar dan tinggi harus sama (1 texel per blok).

Lebar dan tinggi sumber daya terkompresi blok harus 4 kali lebar dan tinggi sumber daya yang tidak dikompresi (16 texel per blok). Misalnya, tekstur DXGI_FORMAT_R32G32B32A32_UINT 256x256 yang tidak dikompresi akan dipetakan ke tekstur terkompresi 1024x1024 DXGI_FORMAT_BC5_UNORM.

Lebar bit Sumber daya yang tidak dikompresi Sumber daya terkompresi blok Perbedaan lebar/tinggi
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

Contoh

Sampel D3D12HeterogeneousMultiadapter menggunakan CopyResource dengan cara berikut:

	// 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()); 
	} 

Persyaratan

Persyaratan Nilai
Target Platform Windows
Header d3d12.h
Pustaka D3d12.lib
DLL D3d12.dll

Lihat juga

ID3D12GraphicsCommandList