ID3D12GraphicsCommandList::CopyResource-Methode (d3d12.h)

Kopiert den gesamten Inhalt der Quellressource in die Zielressource.

Syntax

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

Parameter

[in] pDstResource

Typ: ID3D12Resource*

Ein Zeiger auf die ID3D12Resource-Schnittstelle , die die Zielressource darstellt.

[in] pSrcResource

Typ: ID3D12Resource*

Ein Zeiger auf die ID3D12Resource-Schnittstelle , die die Quellressource darstellt.

Rückgabewert

Keine

Bemerkungen

CopyResource-Vorgänge werden auf der GPU ausgeführt und verursachen keine erhebliche CPU-Workload, die linear von der Größe der zu kopierenden Daten abhängt.

CopyResource kann verwendet werden, um Ressourcen zu initialisieren, die denselben Heapspeicher aliasen. Weitere Informationen finden Sie unter CreatePlacedResource .

Debugebene

Die Debugebene gibt einen Fehler aus, wenn sich die Quellunterquelle nicht im D3D12_RESOURCE_STATE_COPY_SOURCE Zustand befindet.

Die Debugebene gibt einen Fehler aus, wenn sich die Zielunterquelle nicht im D3D12_RESOURCE_STATE_COPY_DEST Zustand befindet.

Beschränkungen

Diese Methode hat einige Einschränkungen, die zur Verbesserung der Leistung entwickelt wurden. Für instance die Quell- und Zielressourcen:

  • Es müssen unterschiedliche Ressourcen sein.
  • Muss der gleiche Typ sein.
  • Muss die gleiche Gesamtgröße (Bytes) aufweisen.
  • Muss identische Dimensionen (Breite, Höhe, Tiefe) aufweisen oder eine kompatible Neuinterpretkopie sein.
  • Muss über kompatible DXGI-Formate verfügen, was bedeutet, dass die Formate identisch oder mindestens aus derselben Typgruppe sein müssen. Beispielsweise kann eine DXGI_FORMAT_R32G32B32_FLOAT Textur in eine DXGI_FORMAT_R32G32B32_UINT Textur kopiert werden, da sich beide Formate in der DXGI_FORMAT_R32G32B32_TYPELESS Gruppe befinden. CopyResource kann zwischen einigen Formattypen kopieren (siehe Neuinterpret Copy).
  • Kann derzeit nicht zugeordnet werden.

CopyResource unterstützt nur das Kopieren. Es unterstützt keine Stretch-, Farbtasten- oder Blend-Elemente.

CopyResource kann die Ressourcendaten zwischen einigen Formattypen neu interpretieren. Weitere Informationen finden Sie unter Neuinterpret Copy unten.

Sie können eine Tiefenschablonenressource entweder als Quelle oder als Ziel verwenden. Ressourcen, die mit der Multisamplingfunktion erstellt wurden (siehe DXGI_SAMPLE_DESC), können nur dann als Quelle und Ziel verwendet werden, wenn sowohl Quelle als auch Ziel identische Anzahl und Qualität mit mehreren Stichproben aufweisen. Wenn sich Quelle und Ziel in Anzahl und Qualität mit mehreren Stichproben unterscheiden oder wenn eine stichprobenweise und die andere nicht mehrfach stichprobenweise ist, schlägt der Aufruf von CopyResource fehl. Verwenden Sie ResolveSubresource , um eine Ressource mit mehreren Stichproben in eine Ressource aufzulösen, die nicht in mehreren Stichproben enthalten ist.

Die -Methode ist ein asynchroner Aufruf, der der Befehlspufferwarteschlange hinzugefügt werden kann. Dadurch wird versucht, Pipeline-Würfe zu entfernen, die beim Kopieren von Daten auftreten können. Weitere Informationen finden Sie unter Überlegungen zur Leistung.

Erwägen Sie die Verwendung von CopyTextureRegion oder CopyBufferRegion , wenn Sie nur einen Teil der Daten in einer Ressource kopieren müssen.

Kopieren neu interpretieren

In der folgenden Tabelle sind die zulässigen Quell- und Zielformate aufgeführt, die Sie beim Neuinterpretationstyp der Formatkonvertierung verwenden können. Die zugrunde liegenden Datenwerte werden nicht konvertiert oder komprimiert/dekomprimiert und müssen ordnungsgemäß codiert werden, damit die Neuinterpretation wie erwartet funktioniert. Weitere Informationen finden Sie unter Formatkonvertierung mit Direct3D 10.1.

Für DXGI_FORMAT_R9G9B9E5_SHAREDEXP müssen Breite und Höhe gleich sein (1 Texel pro Block).

Blockkomprimierte Ressourcenbreite und -höhe müssen das 4-Fache der unkomprimierten Ressourcenbreite und -höhe (16 Texel pro Block) sein. Beispielsweise wird eine nicht komprimierte 256x256-DXGI_FORMAT_R32G32B32A32_UINT Textur einer komprimierten Textur von 1024x1024 DXGI_FORMAT_BC5_UNORM komprimierten Textur zugeordnet.

Bitbreite Nicht komprimierte Ressource Blockkomprimierte Ressource Breite/Höhendifferenz
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

Beispiele

Im Beispiel D3D12HeterogeneousMultiadapter wird CopyResource wie folgt verwendet:

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

Anforderungen

Anforderung Wert
Zielplattform Windows
Kopfzeile d3d12.h
Bibliothek D3d12.lib
DLL D3d12.dll

Weitere Informationen

ID3D12GraphicsCommandList