ID3D12GraphicsCommandList::CopyResource メソッド (d3d12.h)
ソース リソースの内容全体をコピー先リソースにコピーします。
構文
void CopyResource(
[in] ID3D12Resource *pDstResource,
[in] ID3D12Resource *pSrcResource
);
パラメーター
[in] pDstResource
種類: ID3D12Resource*
宛先リソースを表す ID3D12Resource インターフェイスへのポインター。
[in] pSrcResource
種類: ID3D12Resource*
ソース リソースを表す ID3D12Resource インターフェイスへのポインター。
戻り値
なし
解説
CopyResource 操作は GPU 上で実行され、コピーするデータのサイズに線形的に依存する重要な CPU ワークロードは発生しません。
CopyResource を使用して、同じヒープ メモリに別名を付けるリソースを初期化できます。 詳細については、「 CreatePlacedResource 」を参照してください。
デバッグ レイヤー
ソース サブリソースが D3D12_RESOURCE_STATE_COPY_SOURCE 状態でない場合、デバッグ レイヤーはエラーを発行します。
ターゲット サブリソースが D3D12_RESOURCE_STATE_COPY_DEST 状態でない場合、デバッグ レイヤーはエラーを発行します。
制限
この方法には、パフォーマンスを向上させるために設計されたいくつかの制限があります。 たとえば、ソース リソースと移行先リソースは次のようになります。
- 異なるリソースである必要があります。
- 同じ型である必要があります。
- 同じ合計サイズ (バイト) である必要があります。
- 同じ寸法 (幅、高さ、奥行き) を持っているか、互換性のある 再解釈コピーである必要があります。
- 互換性のある DXGI 形式が必要です。つまり、形式は同一であるか、少なくとも同じ型グループに含まれている必要があります。 たとえば、DXGI_FORMAT_R32G32B32_FLOAT テクスチャは、両方の形式が DXGI_FORMAT_R32G32B32_TYPELESS グループに含まれるため、DXGI_FORMAT_R32G32B32_UINT テクスチャにコピーできます。 CopyResource は、いくつかの形式の種類間でコピーできます ( コピーの再解釈に関するページを参照してください)。
- 現在マップできません。
CopyResource では、コピーのみがサポートされます。ストレッチ、カラー キー、ブレンドはサポートされていません。
CopyResource では、いくつかの形式の種類の間でリソース データを再解釈できます。詳細については、以下の「 コピーの再解釈 」を参照してください。
深度ステンシル リソースは、ソースまたは変換先として使用できます。 マルチサンプリング機能を使用して作成されたリソース ( DXGI_SAMPLE_DESCを参照) は、ソースと宛先の両方に同じマルチサンプリング数と品質がある場合にのみ、ソースと宛先として使用できます。 ソースと宛先の数と品質が異なる場合、または 1 つが複数サンプリングされていて、もう一方がマルチサンプリングされていない場合、 CopyResource の呼び出しは失敗します。 ResolveSubresource を使用して、複数サンプリングされたリソースをマルチサンプリングされていないリソースに解決します。
メソッドは非同期呼び出しであり、コマンド バッファー キューに追加できます。 これにより、データのコピー時に発生する可能性があるパイプライン の停止を削除しようとします。 詳細については、「パフォーマンスに 関する考慮事項」を参照してください。
リソース内のデータの一部のみをコピーする必要がある場合は、CopyTextureRegion または CopyBufferRegion の使用を検討してください。
コピーの再解釈
次の表に、書式変換の再解釈の種類で使用できる変換元と変換先の形式を示します。 基になるデータ値は変換または圧縮/圧縮解除されないため、再解釈が期待どおりに機能するためには適切にエンコードする必要があります。 詳細については、「 Direct3D 10.1 を使用した変換の書式設定」を参照してください。
DXGI_FORMAT_R9G9B9E5_SHAREDEXPの場合、幅と高さは等しい必要があります (ブロックあたり 1 テクセル)。
ブロック圧縮リソースの幅と高さは、非圧縮リソースの幅と高さの 4 倍 (ブロックあたり 16 テクセル) である必要があります。 たとえば、圧縮されていない 256 x 256 DXGI_FORMAT_R32G32B32A32_UINT テクスチャは、1024x1024 DXGI_FORMAT_BC5_UNORM圧縮テクスチャにマップされます。
ビット幅 | 圧縮されていないリソース | ブロック圧縮リソース | 幅/高さの差 |
---|---|---|---|
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 |
ヘッダー | d3d12.h |
Library | D3d12.lib |
[DLL] | D3d12.dll |