Ringkasan Fitur (Direct3D 9 untuk Windows Vista)
Dokumentasi ini secara khusus mengacu pada ekstensi Windows Vista untuk grafik DirectX. Untuk mengembangkan kekuatan DirectX untuk Windows Vista, Anda harus menginstal Windows Vista SDK serta DirectX SDK. Aplikasi yang menggunakan DirectX untuk Windows Vista harus menggunakan perangkat keras yang menggunakan driver WDDM (Model Driver Perangkat Windows) dibandingkan dengan XPDM (Model Driver XP); driver yang tidak menerapkan WDDM tidak dapat membuat instans antarmuka grafis Windows Vista DirectX.
Temukan fitur grafis DirectX baru di Windows Vista di salah satu bagian berikut:
- Perubahan Perilaku Perangkat
- Menonaktifkan Pemrosesan Perangkat Lunak Multithreaded Verteks
-
One Bit Surfaces - Buffer Kedalaman Pembacaan/Stensil
- Sumber Daya Berbagi
- Konversi sRGB Sebelum Pencampuran
- Peningkatan StretchRect
- Pembuatan Tekstur dalam Memori Sistem
Perubahan Perilaku Perangkat
Perangkat sekarang hanya hilang dalam dua keadaan: jika perangkat keras direset karena macet, dan jika driver perangkat dihentikan. Ketika perangkat keras macet, perangkat dapat diatur ulang dengan memanggil ResetEx. Jika perangkat keras macet, memori tekstur akan hilang.
Setelah driver dihentikan, objek IDirect9Ex harus dibuat ulang untuk melanjutkan penyajian.
Ketika area presentasi dikaburkan oleh jendela lain dalam mode berjendela, atau ketika aplikasi layar penuh diminimalkan, PresentEx akan mengembalikan S_D3DPRESENTATIONOCCLUDED. Aplikasi layar penuh dapat melanjutkan penyajian saat mereka menerima pesan panggilan balik WM_ACTIVATEAPP.
Di versi DirectX sebelumnya, ketika aplikasi mengalami perubahan mode, satu-satunya cara untuk memulihkan adalah dengan mengatur ulang perangkat dan membuat ulang semua sumber daya memori video dan rantai pertukaran. Sekarang dengan DirectX untuk Windows Vista, memanggil Reset setelah perubahan mode tidak menyebabkan permukaan memori tekstur, tekstur, dan informasi status hilang dan sumber daya ini tidak perlu dibuat ulang.
Menonaktifkan Pemrosesan Verteks Perangkat Lunak Multithreaded
Bit batas baru (D3DCREATE_DISABLE_PSGP_THREADING) telah ditambahkan yang akan menonaktifkan multithreading untuk pemrosesan verteks perangkat lunak (swvp). Gunakan makro ini untuk menghasilkan bendera perilaku untuk IDirect3D9::CreateDevice.
#define D3DCREATE_DISABLE_PSGP_THREADING
Permukaan Berbit Tunggal
Ada jenis format permukaan satu bit baru yang dapat sangat berguna untuk memproses glyph teks. Format baru disebut D3DFMT_A1. Permukaan satu-bit dirancang untuk digunakan baik sebagai tekstur per piksel, atau sebagai output target render yang dihasilkan oleh ComposeRects atau ColorFill. Tidak ada batas terpisah untuk lebar dan tinggi permukaan; implementasi harus mendukung permukaan ukuran tunggal yaitu 2K texel x 8K texel.
Permukaan satu bit memiliki satu bit per texel; oleh karena itu, satu akan berarti bahwa semua komponen (r,g,b,a) dari piksel adalah 1, dan nol berarti bahwa semua komponen sama dengan 0. Anda dapat menggunakan permukaan satu-bit dengan API berikut: ColorFill, UpdateSurface, dan UpdateTexture.
Ketika permukaan berukuran satu bit dibaca, runtime dapat melakukan penyampelan titik atau pemfilteran konvolusi. Filter konvolusi dapat disesuaikan (lihat SetConvolutionMonoKernel).
Ada beberapa batasan untuk permukaan satu-bit:
- Pemetaan mip tidak didukung
- data sRGB tidak dapat dibaca atau ditulis ke permukaan satu-bit.
- Permukaan 1-bit tidak dapat digunakan sebagai tekstur verteks atau untuk multisampling.
Pembacaan Buffer Kedalaman/Stensil
Gunakan IDirect3DDevice9::UpdateSurface untuk membaca atau menulis data kedalaman/stensil dari permukaan yang diperoleh dari IDirect3DDevice9::CreateDepthStencilSurface atau IDirect3DDevice9::GetDepthStencilSurface.
Pertama, buat permukaan yang dapat dikunci, baik hanya untuk kedalaman maupun hanya untuk stensil, menggunakan IDirect3DDevice9::CreateOffscreenPlainSurface. Gunakan salah satu format berikut:
- D3DFMT_D16_LOCKABLE
- D3DFMT_D32F_LOCKABLE
- D3DFMT_D32_LOCKABLE
- D3DFMT_S8_LOCKABLE
Kedua, transfer data antara buffer kedalaman/stensil dan permukaan kedalaman atau stensil yang baru dibuat yang dapat dikunci. Transfer dilakukan menggunakan IDirect3DDevice9::UpdateSurface.
UpdateSurface akan gagal ketika kedua permukaan berformat LOCKABLE atau keduanya tidak dapat dikunci.
Mentransfer data yang tidak ada akan mengakibatkan kesalahan (misalnya, mentransfer dari permukaan khusus kedalaman yang tidak dapat dikunci ke permukaan D3DFMT_S8_LOCKABLE).
Sisa pembatasan untuk IDirect3DDevice9::UpdateSurface masih berlaku.
Berbagi Sumber Daya
Sumber daya Direct3D sekarang dapat dibagikan antara perangkat atau proses. Ini berlaku untuk sumber daya Direct3D apa pun termasuk tekstur, buffer vertex, buffer indeks, atau permukaan (seperti target hasil render, buffer stensil kedalaman, atau permukaan biasa di luar layar). Untuk dibagikan, Anda perlu menunjuk sumber daya untuk dibagikan pada saat pembuatan, dan menemukan sumber daya di kumpulan default (D3DPOOL_DEFAULT). Setelah sumber daya dibuat untuk dibagikan, sumber daya dapat dibagikan di seluruh perangkat dalam proses, atau dibagikan di seluruh proses.
Untuk mengaktifkan sumber daya bersama, API pembuatan sumber daya memiliki parameter handel tambahan. Ini adalah HANDLE yang menunjuk ke sumber daya bersama. Dalam revisi DirectX sebelumnya, argumen ini telah menjadi bagian dari tanda tangan API, tetapi telah tidak digunakan dan harus diatur ke NULL. Dimulai dengan Windows Vista, gunakan pSharedHandle dengan cara berikut:
- Atur pointer (pSharedHandle) ke NULL untuk tidak berbagi sumber daya. Ini sama seperti perilaku DirectX sebelum Windows Vista.
- Untuk membuat sumber daya bersama, panggil API pembuatan sumber daya apa pun (lihat di bawah) dengan pegangan yang tidak diinisialisasi (pointer itu sendiri bukan NULL (pSharedHandle != NULL), tetapi pointer menunjuk ke nilai NULL (*pSharedHandle == NULL)). API akan menciptakan sumber daya bersama dan mengembalikan penangan yang valid.
- Untuk membuka dan mengakses sumber daya bersama yang dibuat sebelumnya dengan menggunakan handel sumber daya bersama nonNULL, atur pSharedHandle ke alamat handel tersebut. Setelah Membuka sumber daya bersama yang dibuat sebelumnya dengan cara ini, Anda dapat menggunakan antarmuka yang dikembalikan di Direct3D 9 atau Direct3D 9Ex API seolah-olah antarmuka adalah sumber daya khas dari jenis tersebut.
API pembuatan sumber daya meliputi - CreateTexture, CreateVolumeTexture, CreateCubeTexture, CreateRenderTarget, CreateVertexBuffer, CreateIndexBuffer, CreateDepthStencilSurface, CreateOffscreenPlainSurface, CreateDepthStencilSurfaceEx, CreateOffscreenPlainSurfaceEx, dan CreateRenderTargetEx.
Ada beberapa batasan untuk menggunakan sumber daya bersama. Ini termasuk:
- API yang Anda gunakan untuk membuka sumber daya bersama harus cocok dengan API yang Anda gunakan untuk membuat sumber daya bersama. Misalnya, jika Anda menggunakan CreateTexture untuk membuat sumber daya bersama, Anda harus menggunakan CreateTexture untuk membuka sumber daya bersama tersebut; jika Anda menggunakan CreateRenderTarget untuk membuat sumber daya bersama, Anda harus menggunakan CreateRenderTarget untuk membuka sumber daya bersama tersebut; dan sebagainya.
- Saat membuka sumber daya bersama, Anda harus menentukan D3DPOOL_DEFAULT.
- Sumber daya yang dapat dikunci (tekstur dengan D3DUSAGE_DYNAMIC, buffer vertex, dan buffer indeks, misalnya) dapat mengalami kinerja yang buruk saat dibagikan. Target render yang dapat dikunci akan gagal dibagikan pada beberapa perangkat keras.
- Referensi ke sumber daya bersama lintas proses harus memiliki dimensi yang sama dengan sumber daya asli. Saat meneruskan handle antar proses, sertakan informasi dimensi agar referensi dapat dibuat sama persis.
- Permukaan lintas proses bersama tidak menyediakan mekanisme sinkronisasi. Perubahan baca/tulis pada permukaan bersama mungkin tidak mencerminkan pandangan dari proses yang merujuk pada permukaan tersebut seperti yang diharapkan. Untuk memberikan sinkronisasi, gunakan kueri peristiwa atau kunci tekstur.
- Hanya proses yang awalnya membuat sumber daya bersama yang dapat menguncinya (proses apa pun yang membuka referensi ke sumber daya bersama tersebut tidak dapat menguncinya).
- Jika sumber daya bersama dikunci, tidak ada validasi untuk proses lain untuk mengetahui apakah sumber daya tersedia.
Konversi sRGB Sebelum Blending
Anda sekarang dapat memeriksa apakah perangkat dapat mengonversi data jalur pemrosesan ke sRGB sebelum penggabungan frame-buffer. Ini menyiratkan bahwa perangkat mengonversi nilai target render dari sRGB. Untuk melihat apakah konversi didukung oleh perangkat keras, periksa batas ini:
D3DPMISCCAPS_POSTBLENDSRGBCONVERT
Cap ini mengidentifikasi perangkat keras yang mendukung konversi ke sRGB sebelum pencampuran. Kemampuan ini penting untuk penyajian berkualitas tinggi dari buffer bingkai fp16 di manajer jendela desktop (DWM).
Peningkatan StretchRect
Di versi DirectX sebelumnya, StretchRect memiliki banyak batasan untuk mengakomodasi driver yang berbeda (lihat IDirect3DDevice9::StretchRect). Windows Vista dibangun pada Windows Device Driver Model (WDDM). Model driver baru ini jauh lebih kuat, dan memungkinkan driver untuk menangani kasus khusus dalam perangkat keras.
Secara umum, satu-satunya batasan yang tersisa adalah bahwa target render harus dibuat dengan penggunaan target render (D3DUSAGE_RENDERTARGET). Pembatasan ini dicabut jika Anda melakukan salinan sederhana (di mana sumber dan tujuan memiliki format yang sama, ukuran yang sama, dan tidak ada sub-rectangle).
Pembuatan Tekstur dalam Memori Sistem
Aplikasi yang membutuhkan lebih banyak fleksibilitas atas penggunaan, alokasi, dan penghapusan memori sistem sekarang dapat membuat tekstur dari penunjuk memori sistem. Misalnya, aplikasi dapat membuat tekstur Direct3D dari penunjuk bitmap memori sistem GDI.
Anda perlu melakukan dua hal untuk membuat tekstur seperti itu:
- Alokasikan memori sistem yang cukup untuk menahan permukaan tekstur. Jumlah minimum byte adalah lebar x tinggi x byte per piksel.
- Teruskan alamat pointer ke permukaan memori sistem Anda untuk parameter HANDLE* ke IDirect3DDevice9::CreateTexture.
Berikut adalah prototipe fungsi untuk IDirect3DDevice9::CreateTexture:
STDMETHOD(CreateTexture)(THIS_ UINT Width, UINT Height, UINT Levels,
DWORD Usage, D3DFORMAT Format, D3DPOOL Pool, IDirect3DTexture9** ppTexture,
HANDLE* pSharedHandle)
Tekstur memori sistem memiliki batasan berikut:
- Pitch tekstur harus sama dengan lebar tekstur dikalikan dengan jumlah byte di setiap piksel.
- Saat menggunakan format terkompresi (format DXT), aplikasi bertanggung jawab untuk mengalokasikan ukuran yang benar.
- Hanya tekstur dengan tingkat mipmap tunggal yang didukung.
- Nilai yang diteruskan ke CreateTexture untuk argumen Kumpulan harus D3DPOOL_SYSTEMMEM.
- API ini membungkus memori yang disediakan dalam tekstur. Jangan batalkan alokasi memori ini sampai Anda selesai dengannya.