Share via


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

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

エイリアス化

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 つの mip レベル、および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 に認識されるスウィズル パターンと同じです。

ヒープ内のサブ割り当て