D3D10_USAGE のまとめ

従来 CPU からのアクセスは、リソース内の範囲を指定して Lock()/Unlock() を
呼び出していました。D3D10 では Map()/Unmap() に変わっていて、特にアクセス
範囲の指定もありません。
CPU と GPU のそれぞれのリソースアクセス制限は、生成時の D3D10_USAGE に
よって区別します。

・D3D10_USAGE_DEFAULT
  GPU が読み書きするリソース。CPU はアクセスできない。

・D3D10_USAGE_IMMUTABLE
  一度作成したら書き換えできない。constant のようなリソース。
  従来のゲームの作り方だと大半がこれに相当します。

・D3D10_USAGE_DYNAMIC
  CPU から GPU へ一方通行転送が可能。これを使うことで動的なオブジェクトも
  スムーズなやり取りができます。

・D3D10_USAGE_STAGING
  CPU 側で読み込めます。つまり GPU → CPU の転送が可能です。

それぞれの読み書き制限をまとめると次のようになります。

GPU-R,GPU-W,CPU-R,CPU-W
 ○  ○  ×  ×   DEFAULT
 ○  ×  ×  ×   IMMUTABLE
 ○  ×  ×  ○   DYNAMIC
 ○  ○  ○  ○   STAGING

特筆すべき点は、CPU 書込み禁止のリソースは Map() すらできないことです。
それじゃどうやって初期データを書き込むのかというと、バッファ作成時に
一緒に初期化用データを渡すことができます。
初期化時の一度きりの転送と Map() による直接アクセスを明確に分離している
わけですね。

また DYNAMIC は GPU が読み込みのみで CPU は書き込み専用です。
これを使えばスムーズな同期転送ができそうなこともわかります。

この辺必要な機能が明確になってかなりわかりやすくなりました。