メモリ エイリアシングとデータの継承

配置され予約されたリソースにより、ヒープ内の物理メモリがエイリアシングされる場合があります。 ヒープに共有フラグが設定されている場合、またはエイリアスされたリソースでメモリ レイアウトが完全に定義されている場合は、予約済みリソースよりも配置済みリソースの方がより多くのデータ継承シナリオに対応します。

エイリアシング

2 つのリソースが同じ物理メモリを共有する場合は、データの継承が望まれない場合でも、それぞれの使用の合間にエイリアシング バリアを発行する必要があります。 単純な使用モデルでは、少なくともこのような操作に関係する宛先リソースを指定する必要があります。 詳細および高度な使用モデルについては、「CreatePlacedResource」を参照してください。

リソースがアクセスされると、そのリソースと物理メモリを共有するすべてのリソースは、データの継承が許可されない限り無効になります。 無効なリソースの読み取りを行うと、リソースの内容が未定義になります。 無効なリソースに書き込みを行った場合も、次の 2 つの条件が発生しない限り、リソースの内容が未定義になります。

  • リソースには、D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET または D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL がありません。
  • 書き込みが、サブリソースまたはタイル全体に対するコピー操作またはクリア操作である。 タイル初期化は、64KB_TILE_UNDEFINED_SWIZZLE および 64KB_TILE_STANDARD_SWIZZLE を持つリソースでのみ使用できます。

レイアウトからテクセル データの場所に関する情報が得られ、かつリソースが一定の遷移バリア状態にある場合、重複する無効化は、より小さな粒度に範囲指定されます。 ただし、無効化の範囲をリソースのアラインメント粒度より小さくすることはできません。

バッファーのアラインメント粒度は 64 KB で、それよりも大きなアラインメント粒度が優先されます。 4 KB のテクスチャの場合はこの点が重要となります。これは、64 KB の領域に複数の 4 KB のテクスチャを互いに重複しないように配置できるためです。 ただし、同じ 64 KB の領域をエイリアスするバッファーをこのような 4 KB のテクスチャと併せて使用することはできません。 アプリケーションでは、バッファーへのアクセスが 4 KB テクスチャと交差するのを確実に防ぐことができません。これは、GPU が 64 KB 領域内の 4 KB のテクスチャ データを未定義のパターンでスウィズルできるためです。

64KB_TILE_UNDEFINED_SWIZZLE、64KB_TILE_STANDARD_SWIZZLE、および ROW_MAJOR テクスチャ レイアウトは、重複する配置粒度が無効になったことをアプリケーションに通知します。 たとえば、アプリケーションは、2 つの配列スライス、1 つのミップ レベル、および 64KB_TILE_UNDEFINED_SWIZZLE レイアウトを持つ 2D レンダリング ターゲット テクスチャ配列を作成できます。 各配列スライスが 100 個の 64 KB タイルを占有することを、アプリケーションが認識しているものとします。 アプリケーションは配列スライス 0 の使用を中止し、そのメモリを約 6 MB のバッファー、レイアウトが未定義の約 6 MB のテクスチャなどに再利用できます。さらに、アプリケーションが配列スライス 1 の最初のタイルを必要としなくなったと仮定します。 この場合アプリケーションでは、レンダリングで配列スライス 1 の最初のタイルが再び必要となるまで、そこに 64 KB のバッファーを配置することもできます。 最初のタイルをテクスチャ配列で再利用するためには、アプリケーションでタイル全体のクリアまたはコピーを行う必要があります。

ただし、テクスチャが定義済みレイアウトを使用していても問題が生じるケースがあります。 テクスチャ リソースのサイズが、アプリケーションで計算されるサイズと大きく異なることがあります。これは、一般的なレンダリングのシナリオで、一部のアダプター アーキテクチャが有効帯域幅を削減するためにテクスチャに余分なメモリを割り当てるためです。 この余分なメモリ領域で無効化が発生すると、リソース全体が無効になります。 詳細については、「GetResourceAllocationInfo」を参照してください。

データの継承

配置済みリソースは、メモリ レイアウトが未定義であっても、テクスチャでのほとんどのデータ継承に対応します。 アプリケーションは、リソース プロパティが同じである 2 つのテクスチャを共有ヒープ内の同じオフセットに配置することで、共有のコミット済みリソースが実現するデータ継承機能を模倣できます。 リソース記述全体が同一でなければなりません。これには、最適なクリア値やリソース作成方法の種類 (配置済みまたは予約済み) も含まれます。 ただし、初期の遷移バリアの状態は両方のリソースで異なっていてもかまいません。

予約済みリソースはタイル単位のデータ継承に対応しますが、リソース遷移バリアの状態に関して一般に制限があります。

データを継承するには、両方のリソースが互換性のあるリソース遷移バリア状態にあることが必要です。

  • バッファー、同時アクセス テクスチャ、およびクロスアダプター テクスチャについては、リソース遷移の状態は重要ではなく、すべての状態が「互換」です。
  • 以前のプロパティや、64KB_TILE_UNDEFINED_SWIZZLE または 64KB_TILE_STANDARD_SWIZZLE を介したタイルごとのデータ継承を持たない予約済みテクスチャの場合、タイルを含むリソース遷移バリア状態は共通状態である必要があります。
  • リソースの説明が完全に一致する他のすべてのテクスチャの場合、対応するサブリソースの各ペアのリソース遷移バリア状態は次のようになります。
    • 共通の状態である。
    • 状態に同じ GPU 書き込みフラグが設定されている場合に同じである。

GPU が標準のスウィズルをサポートしている場合は、バッファーと標準のスウィズル テクスチャが同じメモリにエイリアスされ、両者の間でデータが継承される可能性があります。 アプリケーションはバッファー表現のテクセルを操作できます。これは、メモリ内のテクセルのレイアウトが標準のスウィズル パターンで記述されているためです。 CPU に認識されるスウィズル パターンは、バッファー内の GPU に認識されるスウィズル パターンと同じです。

ヒープ内のサブ割り当て