Alokasi Buffer Perintah dan Puncak

Ada tiga jenis buffer yang digunakan dalam Direct3D:

  • Buffer vertex implisit, yang dibuat hanya untuk penggunaan internal; artinya, aplikasi tidak menyadarinya. Satu buffer vertex implisit selalu dibuat setelah pembuatan konteks dan Direct3D menyimpan data vertex di dalamnya.

  • Buffer vertex eksplisit, yang dibuat hanya sebagai respons terhadap permintaan aplikasi. Direct3D kemudian menyimpan data vertex dalam buffer vertex eksplisit.

  • Buffer perintah, yang dibuat hanya untuk penggunaan internal; artinya, aplikasi tidak menyadari buffer perintah. Direct3D menyimpan data perintah dalam buffer perintah.

Buffer vertex implisit adalah buffer vertex khusus yang digunakan secara internal oleh Direct3D untuk batching. Mereka dibuat selama inisialisasi perangkat dan dapat multibuffered. Mereka selalu baca/tulis sehingga tidak boleh dimasukkan ke dalam memori video (untuk Microsoft DirectX 6.0 dan versi yang lebih baru). Jenis buffer ini ditandai dengan tidak adanya bendera DDSCAPS2_VERTEXBUFFER dan DDSCAPS2_COMMANDBUFFER.

Buffer vertex eksplisit dibuat dan dikontrol oleh aplikasi. Ini tidak dapat di-multibuffered dan tidak dapat dimasukkan ke dalam memori video lokal atau nonlokal kecuali bendera DDSCAPS_WRITEONLY diatur. Buffer vertex eksplisit ditandai dengan DDSCAPS_VERTEXBUFFER.

Buffer perintah digunakan oleh Direct3D untuk perintah batch. Mereka dapat multibuffered dan digunakan untuk semua API kecuali untuk TLVERTEX atau panggilan API execute-buffer yang tidak terpotong. Jenis buffer ini ditandai dengan bendera DDSCAPS2_COMMANDBUFFER. Mereka selalu hanya menulis, meskipun tidak ada bendera eksplisit yang diatur dan tidak pernah berisi instruksi yang tidak valid.

Secara default, runtime Direct3D mengalokasikan semua buffer ini. Buffer vertex implisit dan buffer perintah diakses melalui permukaan yang terkait dengannya. Semua buffer diteruskan ke panggilan balik D3dDrawPrimitives2 driver.

Buffer Verteks dan Perintah yang Dialokasikan Driver

Driver Direct3D secara opsional melakukan alokasi vertex dan buffer perintah dengan menyediakan fungsi panggilan balik. Untuk menyediakan fungsi panggilan balik ini, driver Direct3D mengisi struktur DD_D3DBUFCALLBACKS dan menunjuk anggota lpD3DBufCallbacks dari struktur DD_HALINFO ke dalamnya. DD_HALINFO dikembalikan oleh DrvGetDirectDrawInfo sebagai respons terhadap inisialisasi komponen DirectDraw driver. Panggilan balik yang dilaporkan dalam struktur DD_D3DBUFCALLBACKS adalah:

Fungsi-fungsi ini dipanggil dengan cara yang sama seperti panggilan balik DdXxxSurface (seperti DdCanCreateSurface) dan hanya ketika bendera DDSCAPS_EXECUTEBUFFER diatur. Bendera pembuatan buffer DDSCAPS_WRITEONLY, DDSCAPS2_VERTEXBUFFER, dan DDSCAPS2_COMMANDBUFFER.

Driver menentukan jenis buffer yang diminta dengan memeriksa anggota ddsCaps dari struktur DD_SURFACE_LOCAL yang diteruskan ke panggilan balik CanCreateExecuteBuffer dan CreateExecuteBuffer untuk bendera berikut:

  • DDSCAPS_VERTEXBUFFER menunjukkan bahwa driver harus mengalokasikan buffer vertex eksplisit.

  • DDSCAPS_COMMANDBUFFER menunjukkan bahwa driver harus mengalokasikan buffer perintah.

  • Jika tidak ada bendera yang diatur, driver harus mengalokasikan buffer vertex implisit.

Driver secara internal mengalokasikan buffer vertex dan perintah dan berputar melalui buffer ini. Direct3D mengisi pasangan tertentu sementara perangkat keras secara asinkron merender dari buffer antrean lainnya. Ini sangat berguna dengan akses memori langsung (DMA).

Buffer dalam set multibuffering dapat berada di jenis memori yang berbeda, yaitu, dalam memori sistem atau video. Ketika driver dipanggil untuk membuat buffer pertama, ia segera membuat set dan mengembalikan buffer pertama dalam set ke Direct3D. Driver menggunakan bendera untuk menentukan jenis memori yang digunakan untuk mengalokasikan setiap buffer dalam set. Driver harus mengembalikan buffer baru dalam memori sistem untuk setiap panggilan ke D3dDrawPrimitives2 jika bendera D3DHALDP2_SWAPVERTEXBUFFER atau D3DHALDP2_SWAPCOMMANDBUFFER diatur. Jika buffer yang dikembalikan berada dalam memori video, bendera D3DHALDP2_VIDMEMVERTEXBUF atau D3DHALDP2_VIDMEMCOMMANDBUF yang sesuai harus diatur.

Terkadang, Direct3D meminta ukuran minimum untuk buffer berikutnya. Jika ukurannya terlalu besar, driver harus mengalokasikan buffer dalam memori sistem (permukaan backing). Jika ukurannya terlalu kecil, driver diizinkan untuk menyediakan buffer yang lebih besar. Driver harus melacak berapa banyak buffer dan jenis memori apa mereka dan membersihkan semuanya saat keluar.