Bagikan melalui


LPD3DHAL_DRAWPRIMITIVES2CB fungsi panggilan balik (d3dhal.h)

Fungsi D3dDrawPrimitives2 merender primitif dan mengembalikan status render yang diperbarui.

Sintaks

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.

Menampilkan nilai

D3dDrawPrimitives2 mengembalikan salah satu kode panggilan balik berikut:

Keterangan

D3dDrawPrimitives2 harus diterapkan di driver Microsoft Direct3D.

Driver harus melakukan hal berikut:

  • Pastikan handel konteks yang ditentukan oleh anggota dwhContext dari struktur D3DHAL_DRAWPRIMITIVES2DATA di pdp valid.
  • Periksa apakah flip ke permukaan gambar yang terkait dengan konteks tidak sedang berlangsung. Jika permukaan gambar terlibat dalam flip, driver harus mengatur anggota ddrval D3DHAL_DRAWPRIMITIVES2DATA ke DDERR_WASSTILLDRAWING dan mengembalikan DDHAL_DRIVER_HANDLED.
  • Tentukan lokasi struktur D3DHAL_DP2COMMAND pertama dengan menambahkan jumlah byte di anggota dwCommandOffset D3DHAL_DRAWPRIMITIVES2DATA ke buffer perintah tempat anggota lpDDCommands D3DHAL_DRAWPRIMITIVES2DATA poin.
  • Tentukan lokasi verteks pertama di buffer vertex. Ini hanya boleh dilakukan jika ada data dalam buffer vertex; artinya, ketika token perintah D3DDP2OP_Xxx diterima (kecuali ketika token D3DDP2OP_LINELIST_IMM atau D3DDP2OP_TRIANGLEFAN_IMM). Kedua opcode ini menunjukkan bahwa data vertex segera diteruskan di aliran perintah, bukan dalam buffer vertex. Jadi, dengan asumsi ada data dalam buffer vertex, jika buffer vertex berada dalam memori pengguna, puncak pertama adalah dwVertexOffset byte ke dalam buffer yang dituju lpVertices . Jika tidak, driver harus menerapkan dwVertexOffset ke memori yang terkait dengan struktur DD_SURFACE_LOCAL tempat lpDDVertex menunjuk . dwVertexOffset, lpVertices, dan lpDDVertex adalah anggota D3DHAL_DRAWPRIMITIVES2DATA.
  • Periksa anggota dwVertexType dari D3DHAL_DRAWPRIMITIVES2DATA untuk memastikan bahwa driver mendukung FVF yang 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 D3DFVF_RESERVED x bit 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_DP2RENDERSTATE wStateCount yang mengikuti dalam buffer perintah, memperbarui status driver untuk setiap struktur status render. Saat bendera D3DHALDP2_EXECUTEBUFFER diatur, driver juga harus mencerminkan perubahan status dalam array yang ditunjukkan lpdwRStates . wStateCount dan lpdwRStates adalah anggota D3DHAL_DRAWPRIMITIVES2DATA.
    • Jika perintah D3DDP2OP_TEXTURESTAGESTATE, proses struktur D3DHAL_DP2TEXTURESTAGESTATE wStateCount 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, memperbarui informasi viewport yang disimpan dalam konteks penyajian internal driver.
    • Jika perintah D3DDP2OP_WINFO, proses struktur D3DHAL_DP2WINFO yang mengikuti dalam buffer perintah, memperbarui informasi w-buffering yang disimpan dalam konteks penyajian internal driver.
    • Jika tidak, proses struktur primitifD3DHAL_DP2 Xxx yang mengikuti perintah rendering primitif D3DDP2OP_Xxx di buffer perintah.
    • Jika perintah tidak diketahui, panggil panggilan balik D3dParseUnknownCommand runtime. Runtime menyediakan panggilan balik ini ke panggilan balik DdGetDriverInfo driver dengan GUID GUID_D3DParseUnknownCommandCallback.
Driver tidak perlu memeriksa keterbacaan memori tempat perintah dan buffer vertex disimpan. Namun, driver harus tetap berada dalam batas yang ditentukan oleh anggota dwCommandLength dan dwVertexLength dari D3DHAL_DRAWPRIMITIVES2DATA.

Jika driver harus gagal D3dDrawPrimitives2, driver harus mengisi anggota dwErrorOffset D3DHAL_DRAWPRIMITIVES2DATA dengan offset ke dalam buffer perintah di mana D3DHAL_DP2COMMAND pertama yang tidak tertangani dapat ditemukan.

Catatan Komentar berikut hanya berlaku untuk aplikasi yang ditulis menggunakan antarmuka Microsoft DirectX 7.0 dan yang berkomunikasi dengan driver melalui runtime DirectX 8.0 dan DirectX 8.1.

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 anggota lpDDVertex dari D3DHAL_DRAWPRIMITIVES2DATA). Oleh karena itu, dengan aplikasi ini, fungsi D3dDrawPrimitives2 driver seharusnya tidak pernah menyebabkan rendering 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.1 atau yang lebih baru, fungsi D3dDrawPrimitives2 driver tidak boleh menyebabkan penyajian dari buffer vertex saat ini (diteruskan melalui lpDDVertex) ke stall jika buffer implisit. Jika buffer eksplisit dan ada kunci yang luar biasa di atasnya, driver harus mengintai di akhir fungsi D3dDrawPrimitives2 jika tidak mengganti nama buffer (tidak diatur D3DHALDP2_SWAPVERTEXBUFFER). Jika driver mengganti nama buffer, maka pengemudi tidak akan terhenti. Runtime DirectX 8.1 dan yang lebih baru memanggil fungsi D3dDrawPrimitives2 driver untuk merender dari buffer vertex eksplisit terkunci hanya jika diperlukan sehingga performa jarang terpengaruh. Buffer vertex implisit dibuat oleh panggilan balik CreateD3DBuffer driver hanya dengan bendera DDSCAPS_EXECUTEBUFFER yang ditetapkan. Buffer vertex eksplisit dibuat oleh panggilan balik CreateD3DBuffer driver dengan bendera DDSCAPS_EXECUTEBUFFER dan DDSCAPS2_VERTEXBUFFER diatur. Buffer vertex eksplisit menjadi terkunci oleh panggilan balik LockD3DBuffer driver.

Jika driver digunakan dengan runtime DirectX 8.0, driver terkadang harus terhenti saat merender dari buffer vertex implisit saat ini untuk mencegah masalah sinkronisasi dan mengakibatkan kerusakan. Selain itu, runtime DirectX 8.0 memanggil fungsi D3dDrawPrimitives2 driver untuk merender dari buffer vertex eksplisit saat ini 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 terhenti ketika transisi 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 terhambat pada buffer vertex implisit saat ini:

    DrawPrimitives2(p*, D3DHALDP2_USERMEMVERTICES); // Do not stall
    DrawPrimitives2(Implicit VB, 0); // Stall 
    

    Contoh berikut menunjukkan kapan D3dDrawPrimitives2 tidak boleh di-stall 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 set
    

    Jika runtime mengatur bendera D3DHALDP2_REQCOMMANDBUFSIZE, maka driver tidak diperlukan untuk stall. Secara kebetulan, runtime DirectX 8.0 juga mengatur D3DHALDP2_REQCOMMANDBUFSIZE ketika paling sering dirender dari buffer vertex eksplisit saat ini yang terkunci. Oleh karena itu, driver dapat meningkatkan performa dengan tidak mengulur-ulur ketika mendeteksi D3DHALDP2_REQCOMMANDBUFSIZE saat merender dari buffer vertex eksplisit saat ini yang terkunci.

    Contoh berikut menunjukkan kapan D3dDrawPrimitives2 harus menumpang pada buffer vertex eksplisit saat ini:

    DrawPrimitives2(Explicit VB, 0); // Stall when locked (happens rarely)
    

    Contoh berikut menunjukkan kapan D3dDrawPrimitives2 tidak boleh di-stall 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 stall
    

    Persyaratan

    Persyaratan Nilai
    Target Platform Desktop
    Header d3dhal.h (termasuk D3dhal.h)

    Lihat juga

    D3DHAL_DP2INDEXEDLINELIST

    D3DHAL_DP2INDEXEDLINESTRIP

    D3DHAL_DP2INDEXEDTRIANGLEFAN

    D3DHAL_DP2INDEXEDTRIANGLELIST

    D3DHAL_DP2INDEXEDTRIANGLESTRIP

    D3DHAL_DP2LINELIST

    D3DHAL_DP2LINESTRIP

    D3DHAL_DP2POINTS

    D3DHAL_DP2TRIANGLEFAN

    D3DHAL_DP2TRIANGLELIST

    D3DHAL_DP2TRIANGLESTRIP

    FVF