ID3D10Device::UpdateSubresource メソッド (d3d10.h)
CPU は、マップできないメモリに作成された サブリソース にメモリからデータをコピーします。 「解説」を参照してください。
構文
void UpdateSubresource(
[in] ID3D10Resource *pDstResource,
[in] UINT DstSubresource,
[in] const D3D10_BOX *pDstBox,
[in] const void *pSrcData,
[in] UINT SrcRowPitch,
[in] UINT SrcDepthPitch
);
パラメーター
[in] pDstResource
種類: ID3D10Resource*
宛先リソースへのポインター ( 「ID3D10Resource インターフェイス」を参照)。
[in] DstSubresource
型: UINT
宛先サブリソースを識別する 0 から始まるインデックス。 詳細については、「 D3D10CalcSubresource 」を参照してください。
[in] pDstBox
型: const D3D10_BOX*
リソース データのコピー先となるサブリソースの部分を定義するボックス。 座標はバッファーの場合はバイト単位、テクスチャの場合はテクセル単位です。 NULL の場合、データはオフセットなしで宛先サブリソースに書き込まれます。 ソースのディメンションは、変換先に合っている必要があります ( 「D3D10_BOX」を参照)。
空のボックスを使用すると、操作が不要になります。 上の値が下の値以上であるか、左の値が右の値以上であるか、前面の値が戻り値以上の場合、ボックスは空です。 ボックスが空の場合、 UpdateSubresource は更新操作を実行しません。
[in] pSrcData
型: const void*
メモリ内のソース データへのポインター。
[in] SrcRowPitch
型: UINT
ソース データの 1 行のサイズ。
[in] SrcDepthPitch
型: UINT
ソース データの 1 つの深度スライスのサイズ。
戻り値
なし
解説
シェーダー定数バッファーの場合。pDstBox を NULL に設定 します。 このメソッドを使用してシェーダー定数バッファーを部分的に更新することはできません。
次の場合、リソースを宛先として使用することはできません。
- リソースは、 不変 または 動的な 使用で作成されます。
- リソースは 深度ステンシル リソースとして作成されます。
- リソースはマルチサンプリング機能を使用して作成されます ( DXGI_SAMPLE_DESCを参照)。
UpdateSubresource のパフォーマンスは、ターゲット リソースの競合があるかどうかによって異なります。 たとえば、頂点バッファー リソースの競合は、アプリケーションが Draw 呼び出しを実行し、後で同じ頂点バッファーで UpdateSubresource を呼び出した後、Draw 呼び出しが GPU によって実際に実行される前に発生します。
- リソースの競合が発生すると、UpdateSubresource はソース データの 2 つのコピーを実行します。 最初に、データは CPU によってコマンド バッファーからアクセスできる一時記憶域にコピーされます。 このコピーは、 メソッドが戻る前に行われます。 その後、GPU によって 2 つ目のコピーが実行され、ソース データがマップ不可能なメモリにコピーされます。 この 2 番目のコピーは、コマンド バッファーがフラッシュされるときに GPU によって実行されるため、非同期的に行われます。
- リソースの競合がない場合、UpdateSubresource の動作は、(CPU の観点から) どちらが高速であるかに依存します。データをコマンド バッファーにコピーしてから、コマンド バッファーがフラッシュされたときに 2 つ目のコピーを実行するか、CPU でデータを最終的なリソースの場所にコピーします。 これは、基になるシステムのアーキテクチャに依存します。
このビジュアルの各ブロックはデータの要素を表し、各要素のサイズはリソースの形式に依存します。 たとえば、リソース形式がDXGI_FORMAT_R32G32B32A32_FLOAT場合、各要素のサイズは 128 ビットまたは 16 バイトになります。 この 3D ボリューム テクスチャの幅は 2、高さは 3、奥行きは 4 です。
特定のリソースのソース行のピッチとソースの深さのピッチを計算するには、次の式を使用します。
- ソース行ピッチ = [バイト単位の 1 つの要素のサイズ] * [1 行の要素の数]
- ソース深度ピッチ = [ソース行ピッチ] * [行数 (高さ)]
- ソース行ピッチ = 16 * 2 = 32
- ソース深度ピッチ = 16 * 2 * 3 = 96
たとえば、次のコード スニペットは、2D テクスチャでターゲット領域を指定する方法を示しています。 コピー先のテクスチャが 512 x 512 で、pData が指すデータが [(120,100) にコピーされるとします。(200,220)] をターゲット テクスチャに設定します。 また、rowPitch が適切な値で初期化されていると仮定します (上で説明したように)。 前面と背面はそれぞれ 0 と 1 に設定されます。これは、前面が背面と等しい場合、ボックスは技術的に空であるためです。
D3D10_BOX destRegion;
destRegion.left = 120;
destRegion.right = 200;
destRegion.top = 100;
destRegion.bottom = 220;
destRegion.front = 0;
destRegion.back = 1;
pd3dDevice->UpdateSubresource( pDestTexture, 0, &destRegion, pData, rowPitch, 0 );
1D ケースも同様です。 次のスニペットは、1D テクスチャでターゲット領域を指定する方法を示しています。 テクスチャの長さが 512 であることを除き、上記と同じ前提条件を使用します。
D3D10_BOX destRegion;
destRegion.left = 120;
destRegion.right = 200;
destRegion.top = 0;
destRegion.bottom = 1;
destRegion.front = 0;
destRegion.back = 1;
pd3dDevice->UpdateSubresource( pDestTexture, 0, &destRegion, pData, rowPitch, 0 );
Direct3D 10 と Direct3D 10.1 の違い: Direct3D 10.1 を使用すると、深度ステンシル リソースをソースまたは変換先として使用できます。 |
必要条件
対象プラットフォーム | Windows |
ヘッダー | d3d10.h |
Library | D3D10.lib |