DX12で確保可能なResourceのフラグの組わせについて

引き続き、DX12のResource/Heapについてです。

Resource/Heapを確保する際は、いくつかのフラグを指定するのですが、複数のフラグがあり、見かけ上の組み合わせはたくさんあります。ただし、実際に確保可能なResourceに絞ると、意外とシンプルなので、以下に示します。
以下は、NVIDIAのGPUとDriverを用いた場合です。

D3D12_HEAP_TYPE_DEFAULT

このHEAP_TYPEは、CPU_PAGEとMEMORY_POOLはUNKNOWNしか指定できません。それ以外はエラーとなります。HEAP_MISCは、NONE、SHARED共に指定可能ですので、Device間の共有リソースも作れるようです。
このHEAP_TYPEは、GPUで有効なアドレスを持っていますが、CPUでMapすることはできません。
一般的なVidMemリソースの確保と考えてよさそうです。

D3D12_HEAP_TYPE_UPLOAD

このHEAP_TYPEは、現在以下のフラグと共にのみResourceが作成可能です。

D3D12_CPU_PAGE_UNKNOWN
D3D12_MEMORY_POOL_UNKNOWN
D3D12_HEAP_MISC_NONE
D3D12_RESOURCE_USAGE_GENERIC_READ

このResouceは、GPUで有効なアドレスを保持し、CPUでMapすることが可能です。
対象のアドレス領域には、WRITE_COMBINEフラグが適用されており、VidMemリソースが確保されていると考えてよさそうです。

D3D12_HEAP_TYPE_READBACK

このHEAP_TYPEは、現在以下のフラグと共にのみResourceが作成可能です。

D3D12_CPU_PAGE_UNKNOWN
D3D12_MEMORY_POOL_UNKNOWN
D3D12_HEAP_MISC_NONE
D3D12_RESOURCE_USAGE_COPY_DEST

このResouceは、GPUで有効なアドレスを保持し、CPUでMapすることが可能です。
対象のアドレス領域には、WRITE_COMBINEやNOCACHEフラグが適用されていないので、一般的なwrite back(通常のキャッシュが有効なメモリ)と同じです。また、USAGEがCOPY_DESTに限定されているので、このResouceはSysMemに配置されており、読み出しの前に、明示的なコピー操作を必要とすると思われます。

D3D12_HEAP_TYPE_CUSTOM

TYPE_CUSTOMは様々な組み合わせが存在します。

D3D12_CPU_PAGE_NOT_AVAILABLEを用いた場合

POOL_L0、POOL_L1共にリソース確保可能。
GPUで有効なアドレスを保持しますが、Mapすることはできません。

D3D12_CPU_PAGE_WRITE_COMBINEを用いた場合

POOL_L0、POOL_L1共にリソース確保可能。
GPUで有効なアドレスを保持し、Map可能です。
対象のアドレス領域には、WRITE_COMBINEフラグが適用されています。

D3D12_CPU_PAGE_WRITE_BACKを用いた場合

POOL_L0のみリソース確保可能。
GPUで有効なアドレスを保持し、Map可能です。
対象のアドレス領域には、WRITE_COMBINEやNOCACHEフラグが適用されていないので、一般的なwrite back(通常のキャッシュが有効なメモリ)と考えられます。

D3D12_MEMORY_POOLとは何なのか

基本的にMEMORY_POOLが指定できるのは、HEAP_TYPE_CUSTOMの時のみです。また、WRITE_BACKを指定したときは、L0リソースのみ確保可能でした。write backを有効にして、VidMemがMapされた領域にアクセスすることは不可能ではないと思いますが、コヒーレンシが維持できないと思います。このことから、L0がSysMemでL1がVidMemとするならば、ある程度納得できると思います。