Поделиться через


Метод ID3D12GraphicsCommandList::CopyResource (d3d12.h)

Копирует все содержимое исходного ресурса в целевой ресурс.

Синтаксис

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

Параметры

[in] pDstResource

Тип: ID3D12Ресурс*

Указатель на интерфейс ID3D12Resource , представляющий целевой ресурс.

[in] pSrcResource

Тип: ID3D12Ресурс*

Указатель на интерфейс ID3D12Resource , представляющий исходный ресурс.

Возвращаемое значение

None

Remarks

Операции CopyResource выполняются на GPU и не влечет за собой значительную рабочую нагрузку ЦП, которая линейно зависит от размера копируемой данных.

CopyResource можно использовать для инициализации ресурсов с псевдонимом одной и той же памяти кучи. Дополнительные сведения см. в разделе CreatePlacedResource .

Уровень отладки

Уровень отладки выдает ошибку, если исходный подресурс не находится в состоянии D3D12_RESOURCE_STATE_COPY_SOURCE .

Уровень отладки выдает ошибку, если целевой подресурс не находится в состоянии D3D12_RESOURCE_STATE_COPY_DEST .

Ограничения

Этот метод имеет несколько ограничений, предназначенных для повышения производительности. Например, исходный и целевой ресурсы:

  • Должны быть разные ресурсы.
  • Должен быть одного типа.
  • Должен иметь одинаковый общий размер (байты).
  • Должен иметь одинаковые размеры (ширина, высота, глубина) или быть совместимым с функцией повторной интерпретации копирования.
  • Должны иметь совместимые форматы DXGI, то есть форматы должны быть идентичными или, по крайней мере, из одной группы типов. Например, DXGI_FORMAT_R32G32B32_FLOAT текстуру можно скопировать в DXGI_FORMAT_R32G32B32_UINT текстуру, так как оба этих формата находятся в группе DXGI_FORMAT_R32G32B32_TYPELESS. CopyResource может копировать между несколькими типами форматов (см. раздел Повторная интерпретация копирования).
  • Не удается сопоставить в настоящее время.

CopyResource поддерживает только копирование; он не поддерживает растяжение, цвет или смешения.

CopyResource может переосмыслить данные ресурсов между несколькими типами форматов. Дополнительные сведения см. в разделе Переосмысление копирования ниже.

Ресурс трафарета глубины можно использовать в качестве источника или назначения. Ресурсы, созданные с поддержкой множественной выборки (см . DXGI_SAMPLE_DESC), можно использовать в качестве источника и назначения только в том случае, если оба источника и назначения имеют одинаковое количество и качество нескольких выборок. Если источник и назначение отличаются по количеству и качеству нескольких выборок или если один из них является несколькими выборкой, а другой не является многофакторной, вызов CopyResource завершается ошибкой. Используйте ResolveSubresource , чтобы разрешить ресурс с несколькими выборкой в ресурс, который не является несколькими выборкой.

Метод является асинхронным вызовом, который может быть добавлен в очередь буфера команд. При этом предпринимается попытка удалить остановки конвейера, которые могут возникнуть при копировании данных. Дополнительные сведения см. в разделе Рекомендации по производительности.

Рассмотрите возможность использования CopyTextureRegion или CopyBufferRegion , если вам нужно скопировать только часть данных в ресурсе.

Переосмыслить копию

В следующей таблице перечислены допустимые исходные и целевые форматы, которые можно использовать в типе повторного интерпретации преобразования формата. Базовые значения данных не преобразуются, не сжимаются или распаковываются и должны быть правильно закодированы, чтобы повторное толкование работало должным образом. Дополнительные сведения см. в разделе Преобразование формата с помощью Direct3D 10.1.

Для DXGI_FORMAT_R9G9B9E5_SHAREDEXP ширина и высота должны быть равными (1 тексель на блок).

Ширина и высота ресурса со сжатием блока должны быть в 4 раза больше ширины и высоты несжатого ресурса (16 текселей на блок). Например, несжатая текстура DXGI_FORMAT_R32G32B32A32_UINT 256 x 256 будет сопоставляться с текстурой со сжатием DXGI_FORMAT_BC5_UNORM 1024 x 1024.

Битовая ширина Несжатый ресурс Ресурс со сжатием блока Разница ширины и высоты
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
Header d3d12.h
Библиотека D3d12.lib
DLL D3d12.dll

См. также раздел

ID3D12GraphicsCommandList