Bagikan melalui


Alias Memori dan Pewarisan Data

Sumber daya yang ditempatkan dan dipesan dapat alias memori fisik dalam tumpukan. Sumber daya yang ditempatkan memungkinkan lebih banyak skenario pewarisan data daripada sumber daya yang dipesan ketika tumpukan memiliki set bendera bersama atau ketika sumber daya alias memiliki tata letak memori yang sepenuhnya ditentukan.

Aliasing

Hambatan alias harus dikeluarkan antara penggunaan dua sumber daya yang memiliki memori fisik yang sama, bahkan jika pewarisan data tidak diinginkan. Model penggunaan sederhana harus menunjukkan, setidaknya, sumber daya tujuan yang terlibat dalam operasi seperti itu. Lihat CreatePlacedResource untuk detail selengkapnya dan model penggunaan tingkat lanjut.

Setelah sumber daya diakses, sumber daya apa pun yang berbagi memori fisik dengan sumber daya tersebut menjadi tidak valid, kecuali jika pewarisan data diizinkan untuk terjadi. Pembacaan sumber daya yang tidak valid menghasilkan konten sumber daya yang tidak terdefinisi. Menulis ke sumber daya yang tidak valid juga mengakibatkan konten sumber daya yang tidak ditentukan, kecuali terjadi dua kondisi:

  • Sumber daya tidak memiliki D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET atau D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL.
  • Tulis adalah operasi salin atau hapus ke seluruh sub sumber daya atau petak peta. Inisialisasi petak peta hanya tersedia untuk sumber daya dengan 64KB_TILE_UNDEFINED_SWIZZLE dan 64KB_TILE_STANDARD_SWIZZLE.

Pembatalan tumpang tindih dicakup ke granularitas yang lebih kecil, ketika tata letak memberikan informasi tentang lokasi pada lokasi data texel dan ketika sumber daya berada dalam status penghalang transisi tertentu. Tetapi, pembatalan tidak dapat lebih kecil dari granularitas perataan sumber daya.

Granularitas perataan buffer adalah 64KB, dan granularitas perataan yang lebih besar lebih diutamakan. Ini penting ketika mempertimbangkan tekstur 4KB, karena beberapa tekstur 4KB dapat berada di wilayah 64KB tanpa saling tumpang tindih. Tapi, buffer yang alias wilayah 64KB yang sama tidak dapat digunakan bersama dengan salah satu tekstur 4KB tersebut. Aplikasi tidak dapat dengan andal menjaga akses ke buffer dari intersecting tekstur 4KB, karena GPU diizinkan untuk menggeser data tekstur 4KB dalam wilayah 64KB dalam pola yang tidak ditentukan.

tata letak tekstur 64KB_TILE_UNDEFINED_SWIZZLE, 64KB_TILE_STANDARD_SWIZZLE, dan ROW_MAJOR menginformasikan aplikasi yang granularitas perataan tumpang tindih telah menjadi tidak valid. Misalnya: Aplikasi dapat membuat array tekstur target render 2D dengan 2 irisan array, satu tingkat mip, dan tata letak 64KB_TILE_UNDEFINED_SWIZZLE. Asumsikan aplikasi memahami setiap ikatan array menempati petak peta 100 64KB. Aplikasi dapat forgo menggunakan array slice 0, dan menggunakan kembali memori tersebut untuk buffer ~6MB, tekstur ~6MB dengan tata letak yang tidak ditentukan, dll. Selanjutnya, asumsikan aplikasi tidak lagi memerlukan petak peta pertama ikatan array 1. Kemudian, aplikasi juga dapat menemukan buffer 64KB di sana sampai penyajian akan kembali memerlukan petak peta pertama ikatan array 1. Aplikasi harus melakukan penghapusan atau penyalinan petak peta penuh untuk menggunakan kembali petak peta pertama dengan array tekstur lagi.

Namun, bahkan tekstur dengan tata letak yang ditentukan masih memiliki kasus yang bermasalah. Ukuran sumber daya tekstur dapat secara signifikan berbeda dari apa yang dapat dihitung aplikasi itu sendiri, karena beberapa arsitektur adaptor mengalokasikan memori tambahan untuk tekstur untuk mengurangi bandwidth yang efektif selama skenario penyajian umum. Setiap pembatalan ke wilayah memori tambahan tersebut menyebabkan seluruh sumber daya menjadi tidak valid. Lihat GetResourceAllocationInfo untuk detail selengkapnya.

Pewarisan Data

Sumber daya yang ditempatkan memungkinkan pewarisan data terbanyak untuk tekstur, bahkan dengan tata letak memori yang tidak ditentukan. Aplikasi dapat meniru kemampuan pewarisan data yang memungkinkan sumber daya berkomitmen bersama dengan menemukan dua tekstur dengan properti sumber daya yang identik pada offset yang sama dalam tumpukan bersama. Seluruh deskripsi sumber daya harus identik, termasuk nilai yang jelas dan jenis metode pembuatan sumber daya yang dioptimalkan (ditempatkan atau dicadangkan). Namun, kedua sumber daya tersebut mungkin memiliki status hambatan transisi awal yang berbeda.

Sumber daya yang dicadangkan memungkinkan pewarisan data per petak peta; tetapi pembatasan biasanya ada untuk status hambatan transisi sumber daya.

Untuk mewarisi data, kedua sumber daya harus berada dalam status hambatan transisi sumber daya yang kompatibel:

  • Untuk buffer, tekstur akses simultan, dan tekstur adaptor silang, status transisi sumber daya tidak penting dan semua status "kompatibel".
  • Untuk tekstur yang dipesan tanpa properti sebelumnya atau pewarisan data per petak peta lainnya melalui 64KB_TILE_UNDEFINED_SWIZZLE atau 64KB_TILE_STANDARD_SWIZZLE, status hambatan transisi sumber daya termasuk petak peta harus dalam keadaan umum.
  • Untuk semua tekstur lainnya, di mana deskripsi sumber daya cocok persis, status penghubung transisi sumber daya untuk setiap pasangan sub-sumber daya yang sesuai harus:
    • Berada dalam keadaan umum.
    • Sama dengan ketika status memiliki bendera GPU-write yang sama di dalamnya.

Ketika GPU mendukung swizzle standar, buffer dan tekstur swizzle standar dapat di-alias ke memori yang sama dan mewarisi data di antara mereka. Aplikasi ini dapat memanipulasi texel dari representasi buffer, karena pola swizzle standar menggambarkan bagaimana texel ditata dalam memori. Pola swizzle yang terlihat CPU setara dengan pola swizzle yang terlihat GPU yang terlihat di buffer.

Suballocation Dalam Timbunan