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 mengimplementasikan 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

Perangkat sekarang hanya hilang dalam dua keadaan; ketika perangkat keras direset karena menggantung, dan ketika pengandar perangkat dihentikan. Saat perangkat keras macet, perangkat dapat direset 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 menerima pesan panggilan balik WM_ACTIVATEAPP .

Dalam 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 Vertex Perangkat Lunak Multithreaded

Bit batas baru (D3DCREATE_DISABLE_PSGP_THREADING) telah ditambahkan yang akan menonaktifkan multithreading untuk pemrosesan puncak perangkat lunak (swvp). Gunakan makro ini untuk menghasilkan bendera perilaku untuk IDirect3D9::CreateDevice.

#define D3DCREATE_DISABLE_PSGP_THREADING

Permukaan Satu Bit

Ada jenis format permukaan one bit baru yang dapat sangat berguna untuk memproses glyph teks. Format baru disebut D3DFMT_A1. Permukaan satu-bit dirancang untuk digunakan sebagai tekstur per piksel, atau output target render yang dihasilkan oleh ComposeRects atau ColorFill. Tidak ada tutup terpisah untuk lebar dan tinggi permukaan; implementasi harus mendukung permukaan ukuran tunggal yaitu texel 2K 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 satu-bit dibaca, runtime dapat melakukan sampel 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 satu-bit tidak dapat digunakan sebagai tekstur puncak atau untuk multisampling.

Membaca 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, hanya kedalaman atau 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 dapat dikunci yang baru dibuat. 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 render, buffer stensil kedalaman atau permukaan polos 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 handel yang tidak diinisialisasi (pointer itu sendiri bukan NULL (pSharedHandle != NULL), tetapi pointer menunjuk ke nilai NULL (*pSharedHandle == NULL)). API akan menghasilkan sumber daya bersama dan mengembalikan handel 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 Anda 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 performa yang buruk saat dibagikan. Rendertarget 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 melewati handel di seluruh proses, sertakan informasi dimensi sehingga referensi dapat dibuat secara identik.
  • Permukaan lintas proses bersama tidak menyediakan mekanisme sinkronisasi. Perubahan baca/tulis pada permukaan bersama mungkin tidak mencerminkan tampilan proses referensi permukaan ketika diharapkan. Untuk menyediakan 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 yang tidak dapat menguncinya).
  • Jika sumber daya bersama dikunci, tidak ada validasi untuk proses lain untuk mengetahui apakah sumber daya tersedia.

Konversi sRGB Sebelum Memadukan

Anda sekarang dapat memeriksa untuk melihat apakah perangkat dapat mengonversi data alur ke sRGB sebelum penpaduan 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

Batas ini mengidentifikasi perangkat keras yang mendukung konversi ke sRGB sebelum memadukan. 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 adalah format yang sama, ukuran yang sama dan tidak ada sub-persegi).

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 kali jumlah byte per 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.