ID3D12Device::CreatePlacedResource method (d3d12.h)

Membuat sumber daya yang ditempatkan dalam tumpukan tertentu. Sumber daya yang ditempatkan adalah objek sumber daya dengan bobot paling ringan yang tersedia, dan merupakan yang tercepat untuk dibuat dan dihancurkan.

Aplikasi Anda dapat menggunakan kembali memori video dengan menumpuk beberapa sumber daya Direct3D yang ditempatkan dan dipesan di wilayah heap. Model penggunaan ulang memori sederhana (dijelaskan dalam Keterangan) ada untuk mengklarifikasi sumber daya yang tumpang tindih mana yang valid pada waktu tertentu. Untuk memaksimalkan dukungan alat grafis, dengan pewarisan data model sederhana tidak didukung; dan petak peta yang lebih halus dan pembatalan sub-sumber daya tidak didukung. Hanya pembatalan sumber daya yang tumpang tindih penuh yang terjadi.

Sintaks

HRESULT CreatePlacedResource(
  ID3D12Heap                *pHeap,
  UINT64                    HeapOffset,
  const D3D12_RESOURCE_DESC *pDesc,
  D3D12_RESOURCE_STATES     InitialState,
  const D3D12_CLEAR_VALUE   *pOptimizedClearValue,
  REFIID                    riid,
  void                      **ppvResource
);

Parameter

pHeap

Jenis: [in] ID3D12Heap*

Penunjuk ke antarmuka ID3D12Heap yang mewakili tumpukan tempat sumber daya ditempatkan.

HeapOffset

Jenis: UINT64

Offset, dalam byte, ke sumber daya. HeapOffset harus berupa kelipatan keselarasan sumber daya, dan HeapOffset ditambah ukuran sumber daya harus lebih kecil dari atau sama dengan ukuran tumpukan. GetResourceAllocationInfo harus digunakan untuk memahami ukuran sumber daya tekstur.

pDesc

Jenis: [in] const D3D12_RESOURCE_DESC*

Penunjuk ke struktur D3D12_RESOURCE_DESC yang menjelaskan sumber daya.

InitialState

Jenis: D3D12_RESOURCE_STATES

Status awal sumber daya, sebagai kombinasi bitwise-OR dari konstanta enumerasi D3D12_RESOURCE_STATES .

Saat sumber daya dibuat bersama dengan tumpukan D3D12_HEAP_TYPE_UPLOAD , InitialState harus D3D12_RESOURCE_STATE_GENERIC_READ. Saat sumber daya dibuat bersama dengan tumpukan D3D12_HEAP_TYPE_READBACK , InitialState harus D3D12_RESOURCE_STATE_COPY_DEST.

pOptimizedClearValue

Jenis: [in, opsional] const D3D12_CLEAR_VALUE*

Menentukan D3D12_CLEAR_VALUE yang menjelaskan nilai default untuk warna yang jelas.

pOptimizedClearValue menentukan nilai di mana operasi yang jelas paling optimal. Ketika sumber daya yang dibuat adalah tekstur dengan bendera D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET atau D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL , aplikasi Anda harus memilih nilai yang paling sering dipanggil oleh operasi yang jelas.

Operasi yang jelas dapat dipanggil dengan nilai lain, tetapi operasi tersebut tidak akan seefisien ketika nilai cocok dengan yang diteruskan ke dalam pembuatan sumber daya.

pOptimizedClearValue harus NULL ketika digunakan dengan D3D12_RESOURCE_DIMENSION_BUFFER.

riid

Jenis: REFIID

Pengidentifikasi unik global (GUID) untuk antarmuka sumber daya. Ini adalah parameter input.

REFIID, atau GUID, antarmuka ke sumber daya dapat diperoleh dengan menggunakan __uuidof makro. Misalnya, __uuidof(ID3D12Resource) mendapatkan GUID antarmuka ke sumber daya. Meskipun riid , paling umum, GUID untuk ID3D12Resource, mungkin GUID apa pun untuk antarmuka apa pun. Jika objek sumber daya tidak mendukung antarmuka untuk GUID ini, pembuatan gagal dengan E_NOINTERFACE.

ppvResource

Jenis: [out, opsional] batal**

Penunjuk ke blok memori yang menerima penunjuk ke sumber daya. ppvResource bisa NULL, untuk mengaktifkan pengujian kemampuan. Ketika ppvResource ADALAH NULL, tidak ada objek yang akan dibuat dan S_FALSE akan dikembalikan ketika pResourceDesc dan parameter lainnya valid.

Mengembalikan nilai

Jenis: HRESULT

Metode ini mengembalikan E_OUTOFMEMORY jika memori tidak cukup untuk membuat sumber daya. Lihat Kode Pengembalian Direct3D 12 untuk kemungkinan nilai pengembalian lainnya.

Keterangan

CreatePlacedResource mirip dengan sepenuhnya memetakan sumber daya yang dipesan ke offset dalam timbunan; tetapi ruang alamat virtual yang terkait dengan timbunan juga dapat digunakan kembali.

Sumber daya yang ditempatkan lebih ringan untuk dibuat dan dihancurkan daripada sumber daya yang diterapkan. Ini karena tidak ada timbunan yang dibuat atau dihancurkan selama operasi tersebut. Selain itu, sumber daya yang ditempatkan memungkinkan teknik bobot yang lebih ringan untuk menggunakan kembali memori daripada pembuatan dan penghancuran sumber daya—yaitu, menggunakan kembali melalui alias, dan penghalang alias. Beberapa sumber daya yang ditempatkan dapat secara bersamaan saling tumpang tindih pada tumpukan yang sama, tetapi hanya satu sumber daya yang tumpang tindih yang dapat digunakan pada satu waktu.

Ada dua semantik penggunaan sumber daya yang ditempatkan—model sederhana, dan model tingkat lanjut. Kami menyarankan agar Anda memilih model sederhana (memaksimalkan dukungan alat grafis di berbagai ekosistem GPU), kecuali dan sampai Anda menemukan bahwa Anda memerlukan model tingkat lanjut untuk aplikasi Anda.

Model sederhana

Dalam model ini, Anda dapat mempertimbangkan sumber daya yang ditempatkan berada di salah satu dari dua status: aktif, atau tidak aktif. Tidak valid bagi GPU untuk membaca atau menulis dari sumber daya yang tidak aktif. Sumber daya yang ditempatkan dibuat dalam status tidak aktif.

Untuk mengaktifkan sumber daya dengan penghapus alias pada daftar perintah, aplikasi Anda harus meneruskan sumber daya di D3D12_RESOURCE_ALIASING_BARRIER::p ResourceAfter. pResourceBefore dapat dibiarkan NULL selama aktivasi. Semua sumber daya yang berbagi memori fisik dengan sumber daya yang diaktifkan sekarang menjadi tidak aktif, yang mencakup sumber daya yang tumpang tindih ditempatkan dan dipesan.

Hambatan alias harus dikelompokkan dan dikirimkan bersama-sama, untuk memaksimalkan efisiensi.

Setelah aktivasi, sumber daya dengan target render atau bendera stensil kedalaman harus diinisialisasi lebih lanjut. Lihat catatan tentang inisialisasi sumber daya yang diperlukan di bawah ini.

Catatan tentang inisialisasi sumber daya yang diperlukan

Jenis sumber daya tertentu masih memerlukan inisialisasi. Sumber daya dengan target render atau bendera stensil kedalaman harus diinisialisasi dengan operasi yang jelas atau kumpulan salinan sub sumber daya penuh. Jika hambatan alias digunakan untuk menunjukkan transisi antara dua sumber daya alias, inisialisasi harus terjadi setelah hambatan alias. Inisialisasi ini masih diperlukan setiap kali sumber daya akan diaktifkan dalam model sederhana.

Sumber daya yang ditempatkan dan dipesan dengan target render atau bendera stensil kedalaman harus diinisialisasi dengan salah satu operasi berikut sebelum operasi lain didukung.

Aplikasi harus lebih memilih operasi paling eksplisit yang menghasilkan jumlah paling sedikit texel yang dimodifikasi. Pertimbangkan contoh berikut.

  • Menggunakan buffer kedalaman untuk memecahkan visibilitas piksel biasanya mengharuskan setiap texel kedalaman dimulai pada 1.0 atau 0. Oleh karena itu, operasi Clear harus menjadi opsi paling efisien untuk inisialisasi buffer kedalaman alias.
  • Aplikasi dapat menggunakan target render alias sebagai tujuan pemetaan nada. Karena aplikasi akan merender setiap piksel selama pemetaan nada, DiscardResource harus menjadi opsi paling efisien untuk inisialisasi.

Model tingkat lanjut

Dalam model ini, Anda dapat mengabaikan abstraksi status aktif/tidak aktif. Sebagai gantinya, Anda harus mematuhi aturan tingkat bawah ini.

  • Penghambat alias harus berada di antara dua akses sumber daya GPU yang berbeda dari memori fisik yang sama, selama akses tersebut berada dalam panggilan ExecuteCommandLists yang sama.
  • Operasi penyajian pertama ke jenis sumber daya alias tertentu masih harus menjadi inisialisasi, sama seperti model sederhana.

Operasi inisialisasi harus terjadi baik pada seluruh subsumber daya, atau pada granularitas 64KB. Seluruh inisialisasi sub sumber daya didukung untuk semua jenis sumber daya. Granularitas inisialisasi 64KB, diselaraskan pada offset 64KB, didukung untuk buffer dan tekstur dengan tata letak tekstur 64KB_UNDEFINED_SWIZZLE atau 64KB_STANDARD_SWIZZLE (lihat D3D12_TEXTURE_LAYOUT).

Catatan tentang hambatan alias

Penghalang alias dapat mengatur NULL untuk pResourceAfter dan pResourceBefore. Definisi koherensi memori dari ExecuteCommandLists dan penghalus alias sama, sehingga dua akses alias ke memori fisik yang sama tidak memerlukan hambatan alias ketika akses berada di dua pemanggilan ExecuteCommandLists yang berbeda.

Untuk model penggunaan tingkat lanjut D3D12, definisi sinkronisasi ExecuteCommandLists setara dengan hambatan alias. Oleh karena itu, aplikasi dapat memasukkan hambatan alias antara menggunakan kembali memori fisik, atau memastikan dua penggunaan alias memori fisik terjadi dalam dua panggilan terpisah ke ExecuteCommandLists.

Jumlah inaktivasi bervariasi berdasarkan properti sumber daya. Tekstur dengan tata letak memori yang tidak terdefinisi adalah kasus terburuk, karena seluruh tekstur harus tidak aktif secara atomik. Untuk dua sumber daya yang tumpang tindih dengan tata letak yang ditentukan, inaktivasi hanya dapat mengakibatkan wilayah sumber daya yang tumpang tindih. Pewarisan data bahkan dapat didefinisikan dengan baik. Untuk detail selengkapnya, lihat Alias memori dan pewarisan data.

Persyaratan

Persyaratan Nilai
Target Platform Windows
Header d3d12.h
Pustaka D3D12.lib
DLL D3D12.dll

Lihat juga

CreateCommittedResource

CreateReservedResource

ID3D12Device

Tumpuk Bersama