Метод 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 |