Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Fungsi D3dDrawPrimitives2 merender primitif dan mengembalikan status render yang diperbarui.
Sintaksis
LPD3DHAL_DRAWPRIMITIVES2CB Lpd3dhalDrawprimitives2cb;
DWORD Lpd3dhalDrawprimitives2cb(
LPD3DHAL_DRAWPRIMITIVES2DATA unnamedParam1
)
{...}
Parameter
unnamedParam1
pdp [in]
Menunjuk ke struktur D3DHAL_DRAWPRIMITIVES2DATA yang berisi informasi yang diperlukan driver untuk merender satu atau beberapa primitif.
Mengembalikan nilai
D3dDrawPrimitives2 mengembalikan salah satu kode panggilan balik berikut:
Komentar
D3dDrawPrimitives2 harus diimplementasikan di driver Microsoft Direct3D.
Driver harus melakukan hal berikut:
- Pastikan bahwa handel konteks yang ditentukan oleh dwhContext anggota struktur D3DHAL_DRAWPRIMITIVES2DATA pada pdp valid.
- Periksa apakah flip ke permukaan gambar yang terkait dengan konteks tidak sedang berlangsung. Jika permukaan gambar terlibat dalam flip, driver harus mengatur ddrval anggota D3DHAL_DRAWPRIMITIVES2DATA ke DDERR_WASSTILLDRAWING dan mengembalikan DDHAL_DRIVER_HANDLED.
- Tentukan lokasi struktur D3DHAL_DP2COMMAND pertama dengan menambahkan jumlah byte di dwCommandOffset anggota D3DHAL_DRAWPRIMITIVES2DATA ke buffer perintah tempat lpDDCommands anggota titik D3DHAL_DRAWPRIMITIVES2DATA.
- Tentukan lokasi puncak pertama di buffer vertex. Ini hanya boleh dilakukan jika ada data di buffer vertex; artinya, ketika token perintahD3DDP2OP_ Xxx diterima (kecuali ketika token D3DDP2OP_LINELIST_IMM atau D3DDP2OP_TRIANGLEFAN_IMM). Kedua opcode ini menunjukkan bahwa data vertex segera diteruskan dalam aliran perintah, bukan dalam buffer vertex. Jadi, dengan asumsi ada data dalam buffer vertex, jika buffer vertex berada dalam memori pengguna, puncak pertama dwVertexOffset byte ke dalam buffer yang lpVertices menunjuk. Jika tidak, driver harus menerapkan dwVertexOffset ke memori yang terkait dengan struktur DD_SURFACE_LOCAL yang lpDDVertex poin. dwVertexOffset, lpVertices, dan lpDDVertex adalah anggota D3DHAL_DRAWPRIMITIVES2DATA.
- Periksa dwVertexType anggota D3DHAL_DRAWPRIMITIVES2DATA untuk memastikan bahwa driver mendukung FVFyang diminta. Driver harus gagal dalam panggilan jika ada salah satu kondisi berikut:
- Koordinat puncak tidak ditentukan; artinya, jika D3DFVF_XYZRHW tidak diatur.
- Normal ditentukan; artinya, jika D3DFVF_NORMAL diatur.
- Salah satu bit D3DFVF_RESERVED x yang dipesan diatur.
- Proses semua perintah dalam buffer perintah secara berurutan. Untuk setiap struktur D3DHAL_DP2COMMAND, driver harus melakukan hal berikut:
- Jika perintah D3DDP2OP_RENDERSTATE, proses struktur D3DHAL_DP2RENDERSTATEwStateCount yang mengikuti buffer perintah, memperbarui status driver untuk setiap struktur status render. Ketika bendera D3DHALDP2_EXECUTEBUFFER diatur, driver juga harus mencerminkan perubahan status dalam array yang lpdwRStates menunjuk. wStateCount dan lpdwRStates adalah anggota D3DHAL_DRAWPRIMITIVES2DATA.
- Jika perintah D3DDP2OP_TEXTURESTAGESTATE, proses struktur wStateCount D3DHAL_DP2TEXTURESTAGESTATE yang mengikuti dalam buffer perintah, memperbarui status tekstur driver yang terkait dengan tahap tekstur yang ditentukan untuk setiap struktur status tekstur.
- Jika perintah D3DDP2OP_VIEWPORTINFO, proses struktur D3DHAL_DP2VIEWPORTINFO yang mengikuti di buffer perintah, perbarui informasi viewport yang disimpan dalam konteks penyajian internal driver.
- Jika perintah D3DDP2OP_WINFO, proses struktur D3DHAL_DP2WINFO yang mengikuti di buffer perintah, perbarui informasi w-buffering yang disimpan dalam konteks penyajian internal driver.
- Jika tidak, proses struktur primitif D3DHAL_DP2Xxx yang mengikuti perintah D3DDP2OP_Xxx rendering primitif di buffer perintah.
- Jika perintah tidak diketahui, panggil panggilan balik D3dParseUnknownCommand runtime. Runtime menyediakan panggilan balik ini ke panggilan balik driver DdGetDriverInfo dengan GUID GUID_D3DParseUnknownCommandCallback.
Jika driver harus gagal D3dDrawPrimitives2 , driver harus mengisi dwErrorOffset anggota D3DHAL_DRAWPRIMITIVES2DATA dengan offset ke dalam buffer perintah tempat D3DHAL_DP2COMMAND pertama yang tidak tertangani dapat ditemukan.
Komentar berikut tidak valid untuk aplikasi yang ditulis menggunakan DirectX 8.0 dan antarmuka yang lebih baru karena aplikasi tersebut tidak lagi menggunakan konsep buffer vertex saat ini (yaitu, data vertex tidak lagi diteruskan melalui lpDDVertex anggota D3DHAL_DRAWPRIMITIVES2DATA). Oleh karena itu, dengan aplikasi ini, fungsi D3dDrawPrimitives2 driver tidak boleh menyebabkan penyajian dari buffer vertex ke stall bahkan jika buffer implisit atau eksplisit dan ada kunci yang luar biasa di atasnya.
Jika driver digunakan dengan runtime DirectX 8.0, driver terkadang harus menunda ketika merender dari buffer vertex implisit saat ini untuk mencegah masalah sinkronisasi dan mengakibatkan kerusakan. Selain itu, runtime DirectX 8.0 memanggil fungsi driver D3dDrawPrimitives2 untuk merender dari buffer vertex eksplisit yang terkunci lebih sering kemudian benar-benar diperlukan sehingga performa terdegradasi. Berikut ini adalah solusi sementara untuk driver yang digunakan dengan runtime DirectX 8.0:
-
Driver harus bertransisi antara penyajian primitif memori pengguna (diidentifikasi oleh D3DHALDP2_USERMEMVERTICES) dan penyajian dari buffer vertex implisit saat ini hanya jika tidak mengganti nama buffer (tidak diatur D3DHALDP2_SWAPVERTEXBUFFER).
Contoh berikut menunjukkan kapan D3dDrawPrimitives2 harus menumpuk pada buffer vertex implisit saat ini:
DrawPrimitives2(p*, D3DHALDP2_USERMEMVERTICES); // Do not stall DrawPrimitives2(Implicit VB, 0); // StallContoh berikut menunjukkan kapan D3dDrawPrimitives2 tidak boleh mengulur pada buffer vertex implisit saat ini:
DrawPrimitives2(p*, D3DHALDP2_USERMEMVERTICES); // Do not stall DrawPrimitives2(Explicit VB, 0); // Do not stall if not locked DrawPrimitives2(Explicit VB, D3DHALDP2_SWAPVERTEXBUFFER); // Do not stall whether locked DrawPrimitives2(Implicit VB, 0); // Do not stall whether locked DrawPrimitives2(Implicit VB, 0); // Do not stall whether locked DrawPrimitives2(p*, D3DHALDP2_USERMEMVERTICES); // Do not stall DrawPrimitives2(Implicit VB, D3DHALDP2_SWAPVERTEXBUFFER); // Do not stall because D3DHALDP2_SWAPVERTEXBUFFER is setJika runtime mengatur bendera D3DHALDP2_REQCOMMANDBUFSIZE, maka pengemudi tidak diharuskan untuk mengulur waktu. Secara kebetulan, runtime DirectX 8.0 juga mengatur D3DHALDP2_REQCOMMANDBUFSIZE ketika paling umum dirender dari buffer vertex eksplisit yang terkunci saat ini. Oleh karena itu, driver dapat meningkatkan performa dengan tidak mengulur-ulur ketika mendeteksi D3DHALDP2_REQCOMMANDBUFSIZE saat merender dari buffer vertex eksplisit yang terkunci.
Contoh berikut menunjukkan kapan D3dDrawPrimitives2 harus mengulur pada buffer vertex eksplisit saat ini:
DrawPrimitives2(Explicit VB, 0); // Stall when locked (happens rarely)Contoh berikut menunjukkan kapan D3dDrawPrimitives2 tidak boleh mengulur pada buffer vertex eksplisit saat ini:
DrawPrimitives2(Explicit VB, D3DHALDP2_REQCOMMANDBUFSIZE); // Do not stall whether locked DrawPrimitives2(Explicit VB, D3DHALDP2_SWAPVERTEXBUFFER); // Do not stall whether locked DrawPrimitives2(Explicit VB, D3DHALDP2_SWAPVERTEXBUFFER | D3DHALDP2_REQCOMMANDBUFSIZE); // Do not stallPersyaratan
Syarat Nilai Platform Target Desktop Header d3dhal.h (termasuk D3dhal.h) Lihat juga