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 に設定 します。 このメソッドを使用してシェーダー定数バッファーを部分的に更新することはできません。

次の場合、リソースを宛先として使用することはできません。

UpdateSubresource が戻ると、pSrcData が指すデータをアプリケーションで自由に変更したり解放したりすることもできます。これは、 メソッドが元のコンテンツを既にコピーまたはスナップしているためです。

UpdateSubresource のパフォーマンスは、ターゲット リソースの競合があるかどうかによって異なります。 たとえば、頂点バッファー リソースの競合は、アプリケーションが Draw 呼び出しを実行し、後で同じ頂点バッファーで UpdateSubresource を呼び出した後、Draw 呼び出しが GPU によって実際に実行される前に発生します。

  • リソースの競合が発生すると、UpdateSubresource はソース データの 2 つのコピーを実行します。 最初に、データは CPU によってコマンド バッファーからアクセスできる一時記憶域にコピーされます。 このコピーは、 メソッドが戻る前に行われます。 その後、GPU によって 2 つ目のコピーが実行され、ソース データがマップ不可能なメモリにコピーされます。 この 2 番目のコピーは、コマンド バッファーがフラッシュされるときに GPU によって実行されるため、非同期的に行われます。
  • リソースの競合がない場合、UpdateSubresource の動作は、(CPU の観点から) どちらが高速であるかに依存します。データをコマンド バッファーにコピーしてから、コマンド バッファーがフラッシュされたときに 2 つ目のコピーを実行するか、CPU でデータを最終的なリソースの場所にコピーします。 これは、基になるシステムのアーキテクチャに依存します。
ソース行のピッチパラメーターとソース深度ピッチ パラメーターを理解するには、次の 3D ボリューム テクスチャの図を検討してください。 3D ボリューム テクスチャの図

このビジュアルの各ブロックはデータの要素を表し、各要素のサイズはリソースの形式に依存します。 たとえば、リソース形式がDXGI_FORMAT_R32G32B32A32_FLOAT場合、各要素のサイズは 128 ビットまたは 16 バイトになります。 この 3D ボリューム テクスチャの幅は 2、高さは 3、奥行きは 4 です。

特定のリソースのソース行のピッチとソースの深さのピッチを計算するには、次の式を使用します。

  • ソース行ピッチ = [バイト単位の 1 つの要素のサイズ] * [1 行の要素の数]
  • ソース深度ピッチ = [ソース行ピッチ] * [行数 (高さ)]
この例の 3D ボリューム テクスチャの場合、各要素のサイズが 16 バイトの場合、数式は次のようになります。
  • ソース行ピッチ = 16 * 2 = 32
  • ソース深度ピッチ = 16 * 2 * 3 = 96
次の図は、メモリにレイアウトされているリソースを示しています。 メモリ内の 3D ボリューム テクスチャの図

たとえば、次のコード スニペットは、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

関連項目

ID3D10Device

ID3D10Resource インターフェイス