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
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk