Bagikan melalui


Perangkat Hilang (Direct3D 9)

Perangkat Direct3D dapat berada dalam status operasional atau status hilang. Status operasional adalah status normal perangkat tempat perangkat berjalan dan menyajikan semua penyajian seperti yang diharapkan. Perangkat membuat transisi ke status hilang ketika suatu peristiwa, seperti hilangnya fokus keyboard dalam aplikasi layar penuh, menyebabkan penyajian menjadi mustahil. Status hilang ditandai dengan kegagalan senyap dari semua operasi penyajian, yang berarti bahwa metode penyajian dapat mengembalikan kode keberhasilan meskipun operasi penyajian gagal. Dalam situasi ini, kode kesalahan D3DERR_DEVICELOST dikembalikan oleh IDirect3DDevice9::P resent.

Secara desain, serangkaian skenario lengkap yang dapat menyebabkan perangkat hilang tidak ditentukan. Beberapa contoh umum termasuk hilangnya fokus, seperti ketika pengguna menekan ALT+TAB atau saat dialog sistem diinisialisasi. Perangkat juga dapat hilang karena peristiwa manajemen daya, atau ketika aplikasi lain mengasumsikan operasi layar penuh. Selain itu, setiap kegagalan dari IDirect3DDevice9::Reset menempatkan perangkat ke dalam keadaan hilang.

Semua metode yang berasal dari IUnknown dijamin berfungsi setelah perangkat hilang. Setelah kehilangan perangkat, setiap fungsi umumnya memiliki tiga opsi berikut:

  • Gagal dengan D3DERR_DEVICELOST - Ini berarti bahwa aplikasi perlu mengenali bahwa perangkat hilang, sehingga aplikasi mengidentifikasi bahwa sesuatu tidak terjadi seperti yang diharapkan.
  • Secara diam-diam gagal, mengembalikan S_OK atau kode pengembalian lainnya - Jika fungsi gagal secara diam-diam, aplikasi umumnya tidak dapat membedakan antara hasil "berhasil" dan "kegagalan senyap."
  • Fungsi mengembalikan kode pengembalian.
Perbedaan antara Direct3D 9 dan Direct3D 9Ex:
Perangkat Direct3D 9 mengembalikan D3DERR_DEVICELOST. Setelah dikembalikan dari IDirect3DDevice9::P resent, perilaku emulasi tidak lagi beroperasi dan semua panggilan di masa mendatang akan gagal sampai perangkat berhasil direset.
Perangkat Direct3D 9Ex tidak pernah mengembalikan D3DERR_DEVICELOST, tetapi dapat mengembalikan pesan status baru (lihat perubahan perilaku perangkat).

 

Menanggapi Perangkat yang Hilang

Perangkat yang hilang harus membuat ulang sumber daya (termasuk sumber daya memori video) setelah direset. Jika perangkat hilang, aplikasi meminta perangkat untuk melihat apakah perangkat dapat dipulihkan ke status operasional. Jika tidak, aplikasi menunggu hingga perangkat dapat dipulihkan.

Jika perangkat dapat dipulihkan, aplikasi menyiapkan perangkat dengan menghancurkan semua sumber daya memori video dan rantai pertukaran apa pun. Kemudian, aplikasi memanggil metode IDirect3DDevice9::Reset . Reset adalah satu-satunya metode yang memiliki efek ketika perangkat hilang, dan merupakan satu-satunya metode di mana aplikasi dapat mengubah perangkat dari yang hilang ke status operasional. Reset akan gagal kecuali aplikasi merilis semua sumber daya yang dialokasikan di D3DPOOL_DEFAULT, termasuk yang dibuat oleh metode IDirect3DDevice9::CreateRenderTarget dan IDirect3DDevice9::CreateDepthStencilSurface .

Sebagian besar, panggilan frekuensi tinggi Direct3D tidak mengembalikan informasi apa pun tentang apakah perangkat telah hilang. Aplikasi dapat terus memanggil metode penyajian, seperti IDirect3DDevice9::D rawPrimitive, tanpa menerima pemberitahuan perangkat yang hilang. Secara internal, operasi ini dibuang hingga perangkat direset ke status operasional.

Aplikasi dapat menentukan apa yang harus dilakukan saat menemukan perangkat yang hilang dengan mengkueri nilai pengembalian metode IDirect3DDevice9::TestCooperativeLevel .

Operasi Penguncian

Secara internal, Direct3D melakukan pekerjaan yang cukup untuk memastikan bahwa operasi penguncian akan berhasil setelah perangkat hilang. Namun, tidak dijamin bahwa data sumber daya memori video akan akurat selama operasi penguncian. Dijamin bahwa tidak ada kode kesalahan yang akan dikembalikan. Ini memungkinkan aplikasi ditulis tanpa khawatir kehilangan perangkat selama operasi penguncian.

Sumber

Sumber daya dapat menggunakan memori video. Karena perangkat yang hilang terputus dari memori video yang dimiliki oleh adaptor, tidak dimungkinkan untuk menjamin alokasi memori video ketika perangkat hilang. Akibatnya, semua metode pembuatan sumber daya diimplementasikan agar berhasil dengan mengembalikan D3D_OK, tetapi sebenarnya hanya mengalokasikan memori sistem dummy. Karena sumber daya memori video apa pun harus dihancurkan sebelum perangkat diubah ukurannya, tidak ada masalah memori video yang terlalu alokasi. Permukaan dummy ini memungkinkan operasi kunci dan salin tampak berfungsi secara normal sampai aplikasi memanggil IDirect3DDevice9::P resent dan menemukan bahwa perangkat telah hilang.

Semua memori video harus dirilis sebelum perangkat dapat direset dari status hilang ke status operasional. Ini berarti bahwa aplikasi harus merilis rantai pertukaran apa pun yang dibuat dengan IDirect3DDevice9::CreateAdditionalSwapChain dan sumber daya apa pun yang ditempatkan di kelas memori D3DPOOL_DEFAULT. Aplikasi tidak perlu merilis sumber daya di kelas memori D3DPOOL_MANAGED atau D3DPOOL_SYSTEMMEM. Data status lainnya secara otomatis dihancurkan oleh transisi ke status operasional.

Anda didorong untuk mengembangkan aplikasi dengan satu jalur kode untuk merespons kehilangan perangkat. Jalur kode ini kemungkinan serupa, jika tidak identik, ke jalur kode yang diambil untuk menginisialisasi perangkat saat startup.

Data yang Diambil

Direct3D memungkinkan aplikasi untuk memvalidasi tekstur dan merender status terhadap penyajian single pass oleh perangkat keras menggunakan IDirect3DDevice9::ValidateDevice. Metode ini, yang biasanya dipanggil selama inisialisasi aplikasi, akan mengembalikan D3DERR_DEVICELOST jika perangkat telah hilang.

Direct3D juga memungkinkan aplikasi untuk menyalin gambar yang dihasilkan atau ditulis sebelumnya dari sumber daya memori video ke sumber daya memori sistem nonvolatile. Karena gambar sumber transfer tersebut mungkin hilang kapan saja, Direct3D memungkinkan operasi penyalinan tersebut gagal ketika perangkat hilang.

Mengenai kueri asinkron, IDirect3DQuery9::GetData mengembalikan D3DERR_DEVICELOST jika bendera FLUSH ditentukan, untuk menunjukkan ke aplikasi bahwa IDirect3DQuery9::GetData tidak akan pernah mengembalikan S_OK.

Operasi salin, IDirect3DDevice9::GetFrontBufferData, dapat gagal dengan D3DERR_DEVICELOST karena tidak ada permukaan utama saat perangkat hilang. IDirect3DDevice9::CreateAdditionalSwapChain juga dapat gagal dengan D3DERR_DEVICELOST karena buffer belakang tidak dapat dibuat saat perangkat hilang. Perhatikan bahwa kasus-kasus ini adalah satu-satunya instans D3DERR_DEVICELOST di luar metode IDirect3DDevice9::P resent, IDirect3DDevice9::TestCooperativeLevel, dan IDirect3DDevice9::Reset .

Shader yang Dapat Diprogram

Di Direct3D 9, shader vertex dan shader piksel tidak perlu dibuat ulang setelah reset. Mereka akan diingat. Di versi DirectX sebelumnya, perangkat yang hilang memerlukan shader untuk dibuat ulang.

Perangkat Direct3D