ID3D10Device::UpdateSubresource

CPU によって、マッピング不可能なメモリー内に作成されたサブリソースにメモリーからデータがコピーされます。「解説」を参照してください。

void 
UpdateSubresource(
  ID3D10Resource *pDstResource,
  UINT DstSubresource,
  const D3D10_BOX *pDstBox,
  const void *pSrcData,
  UINT SrcRowPitch,
  UINT SrcDepthPitch
);

パラメータ

  • pDstResource
    コピー先リソースへのポインターです (「ID3D10Resource インターフェイス」を参照してください)。
  • DstSubresource
    コピー先のサブリソースを特定するための、ゼロから始まるインデックスです。詳細については、「D3D10CalcSubresource」を参照してください。
  • pDstBox
    リソース データのコピー先となるサブリソースの部分を定義するボックスです。座標の単位は、バッファーの場合はバイト単位になり、テクスチャーの場合はテクセル単位になります。NULL の場合は、オフセットなしでデータがコピー先のサブリソースに書き込まれます。コピー元の次元がコピー先の次元と適合している必要があります (「D3D10_BOX」を参照してください)。
  • pSrcData
    メモリー内のコピー元データへのポインターです。
  • SrcRowPitch
    コピー元データの 1 行のサイズです。
  • SrcDepthPitch
    コピー元データの 1 深度スライスのサイズです。

戻り値

何も返しません。

解説 

シェーダー定数バッファーの場合は pDstBox を NULL に設定します。このメソッドで、シェーダー定数バッファーの一部分を更新することはできません。

次に該当するリソースはコピー先にできません。

  • リソースが固定で作成されている場合。
  • リソースが深度ステンシル リソースとして作成されている場合。
  • リソースがマルチサンプリング機能を使用して作成されている場合 (「DXGI_SAMPLE_DESC」を参照してください)。

UpdateSubresource から復帰すると、このメソッドによって元の内容が既にコピーされて設定済みになっているため、アプリケーションは pSrcData が指し示すデータを自由に変更したり、解放したりすることができます。

UpdateSubresource のパフォーマンスは、コピー先リソースに競合があるかどうかによって異なります。たとえば、アプリケーションが描画関数呼び出しを実行し、その描画関数呼び出しが GPU で実際に実行される前に、同じ頂点バッファーを使用して UpdateSubresource を呼び出した場合、頂点バッファー リソースの競合が発生します。

  • リソースに競合がある場合、UpdateSubresource はコピー元データのコピーを 2 回実行します。まず、CPU によって、コマンド バッファーからアクセスできる一時ストレージ領域にデータがコピーされます。このコピーは、メソッドから復帰する前に実行されます。次に GPU によって 2 回目のコピーが実行され、コピー元データがマッピング不可能なメモリーにコピーされます。2 回目のコピーは、コマンド バッファーのフラッシュ時に GPU によって実行されるため、非同期で行われます。
  • リソースの競合がない場合の UpdateSubresource の動作は、どの方法が高速に実行されるか (CPU の観点から) によって異なります。データをコマンド バッファーにコピーし、その後でコマンド バッファーのフラッシュ時に 2 回目のコピーを実行する方法と、CPU によってデータを最終的なリソースの場所にコピーする方法があります。これは、基盤となるシステムのアーキテクチャーにも影響されます。

コピー元の行のピッチ、およびコピー元の深度のピッチのパラメーターの理解を深めるため、次のような 3D ボリューム テクスチャーの概念図を考えてください。

図形 1.  3D ボリューム テクスチャーの概念図

Bb173621.d3d10_pitches_conceptual(ja-jp,VS.85).gif

この図の各ブロックはデータの要素を表します。各要素のサイズは、リソースのフォーマットによって異なります。たとえば、リソースのフォーマットが DXGI_FORMAT_R32G32B32A32_FLOAT の場合、各要素のサイズは 128 ビット (16 バイト) になります。この 3D ボリューム テクスチャーの幅は 2、高さは 3、深度は 4 です。

リソースのコピー元の行ピッチ、およびコピー元の深度ピッチを計算するには、次の式を使用します。

  • コピー元の行ピッチ = [1 要素のサイズ (バイト単位)] * [1 行の要素数]
  • コピー元の深度ピッチ = [コピー元の行ピッチ] * [行の数 (高さ)]

この例に示している 3D ボリューム テクスチャーで各要素のサイズが 16 バイトの場合、式は次のようになります。

  • コピー元の行ピッチ = 16 * 2 = 32
  • コピー元の深度ピッチ = 16 * 2 * 3 = 96

次の図は、メモリー内に配置されるリソースの概念図です。

図形 2.  メモリー内に配置される 3D ボリューム テクスチャーの概念図

Bb173621.d3d10_pitches(ja-jp,VS.85).gif

次のコードは、2D テクスチャーにおけるコピー先リージョンの指定方法を示す例です。コピー先テクスチャーを 512x512 とし、操作によって 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 では、深度ステンシル リソースをコピー元またはコピー先として使用できます。

要件

ヘッダー: D3D10.h 宣言

関連項目

ID3D10Resource インターフェイス