ID3D11DeviceContext::UpdateSubresource
CPU によって、マッピング不可能なメモリー内に作成されたサブリソースにメモリーからデータがコピーされます。「解説」を参照してください。
void
UpdateSubresource(
ID3D11Resource *pDstResource,
UINT DstSubresource,
const D3D11_BOX *pDstBox,
const void *pSrcData,
UINT SrcRowPitch,
UINT SrcDepthPitch
);
パラメータ
- pDstResource
コピー先リソースへのポインターです (「ID3D11Resource」を参照してください)。 - DstSubresource
コピー先のサブリソースを特定するための、ゼロから始まるインデックスです。詳細については、「D3D11CalcSubresource」を参照してください。 - pDstBox
リソース データのコピー先となるサブリソースの部分を定義するボックスです。座標の単位は、バッファーの場合はバイト単位になり、テクスチャーの場合はテクセル単位になります。NULL の場合は、オフセットなしでデータがコピー先のサブリソースに書き込まれます。コピー元の次元がコピー先の次元と適合している必要があります (「D3D11_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 ボリューム テクスチャーの概念図
この図の各ブロックはデータの要素を表します。各要素のサイズは、リソースのフォーマットによって異なります。たとえば、リソースのフォーマットが DXGI_FORMAT_R32G32B32A32_FLOAT の場合、各要素のサイズは 128 ビット (16 バイト) になります。この 3D ボリューム テクスチャーの幅は 2、高さは 3、深度は 4 です。
リソースのコピー元の行ピッチ、およびコピー元の深度ピッチを計算するには、次の式を使用します。
- コピー元の行ピッチ = [1 要素のサイズ (バイト単位)] * [1 行の要素数]
- コピー元の深度ピッチ = [コピー元の行ピッチ] * [行の数 (高さ)]
この例に示している 3D ボリューム テクスチャーで各要素のサイズが 16 バイトの場合、式は次のようになります。
- コピー元の行ピッチ = 16 * 2 = 32
- コピー元の深度ピッチ = 16 * 2 * 3 = 96
次の図は、メモリー内に配置されるリソースの概念図です。
図形 2. メモリー内に配置される 3D ボリューム テクスチャーの概念図
次のコードは、2D テクスチャーにおけるコピー先リージョンの指定方法を示す例です。コピー先テクスチャーを 512x512 とし、操作によって pData で指し示されるデータがコピー先テクスチャーの [(120,100)..(200,220)] にコピーされるとします。また、rowPitch は、適正な値 (前述の例) で初期化されているものとします。前面と背面を等しい設定にすると、ボックスが技術的に空白になるため、前面および背面をそれぞれ 0 と 1 に設定します。
D3D11_BOX destRegion; destRegion.left = 120; destRegion.right = 200; destRegion.top = 100; destRegion.bottom = 220; destRegion.front = 0; destRegion.back = 1; pd3dDeviceContext->UpdateSubresource( pDestTexture, 0, &destRegion, pData, rowPitch, 0 );
1D の場合も同様です。次のコードは、1D テクスチャーにおけるコピー先リージョンの指定方法を示す例です。テクスチャーの長さが 512 であることを除いて、上記と同様の仮定を使用します。
D3D11_BOX destRegion; destRegion.left = 120 destRegion.right = 200; destRegion.top = 0; destRegion.bottom = 1; destRegion.front = 0; destRegion.back = 1; pd3dDeviceContext->UpdateSubresource( pDestTexture, 0, &destRegion, pData, rowPitch, 0 );
要件
ヘッダー: D3D11.h 宣言
ライブラリ: D3D11.lib 内容