PFND3DDDI_RENDERCB fungsi panggilan balik (d3dumddi.h)
Fungsi pfnRenderCb mengirimkan buffer perintah saat ini untuk penyajian ke driver miniport tampilan.
Sintaks
PFND3DDDI_RENDERCB Pfnd3dddiRendercb;
HRESULT Pfnd3dddiRendercb(
HANDLE hDevice,
D3DDDICB_RENDER *unnamedParam2
)
{...}
Parameter
hDevice
Handel ke perangkat tampilan (konteks grafis).
unnamedParam2
pData [masuk, keluar]
Penunjuk ke struktur D3DDDICB_RENDER yang menjelaskan buffer perintah saat ini untuk dirender.
Nilai kembali
pfnRenderCb mengembalikan salah satu nilai berikut:
Menampilkan kode | Deskripsi |
---|---|
S_OK | Buffer perintah berhasil dirender. |
D3DDDIERR_PRIVILEGEDINSTRUCTION | Driver miniport tampilan mendeteksi instruksi istimewa dalam buffer perintah; instruksi istimewa tidak dapat ada dalam buffer perintah. |
D3DDDIERR_ILLEGALINSTRUCTION | Pengandar miniport tampilan mendeteksi instruksi yang tak bisa didukung oleh piranti keras grafis. |
D3DDDIERR_INVALIDHANDLE | Driver miniport tampilan mendeteksi handel yang tidak valid di buffer perintah. |
D3DDDIERR_CANTRENDERLOCKEDALLOCATION | Manajer memori video mendeteksi referensi ke alokasi terkunci dalam daftar alokasi. Perhatikan bahwa manajer memori video mengembalikan kesalahan ini hanya jika tidak dapat memposisikan ulang alokasi ke segmen memori AGP atau sistem. |
D3DDDIERR_INVALIDUSERBUFFER | Driver miniport tampilan mendeteksi underrun atau overrun data atau instruksi. Artinya, driver menerima lebih sedikit atau lebih banyak instruksi atau data dari yang diharapkan. |
E_OUTOFMEMORY | pfnRenderCb tidak dapat diselesaikan karena memori tidak cukup. |
E_INVALIDARG | Parameter divalidasi dan ditentukan salah. |
Fungsi ini mungkin juga mengembalikan nilai HRESULT lainnya.
Keterangan
Ketika driver tampilan mode pengguna harus mengirimkan buffer perintah saat ini untuk penyajian ke driver miniport tampilan (misalnya, selama panggilan ke fungsi Flush atau Flush (D3D10) driver tampilan mode pengguna harus memanggil fungsi pfnRenderCb . Driver tampilan mode pengguna harus mengatur parameter hDevice ke nilai runtime Microsoft Direct3D yang disediakan selama panggilan CreateDevice atau CreateDevice (D3D10). Dalam struktur D3DDDICB_RENDER yang ditujukkan oleh parameter pData , driver tampilan mode pengguna juga harus mengatur:
- Anggota CommandLength ke jumlah byte perintah dalam buffer perintah yang dimulai dari offset nol.
- Anggota CommandOffset ke nonzero jika driver tampilan mode pengguna harus menentukan offset ke perintah perangkat keras pertama di buffer perintah.
- Anggota NumAllocations ke jumlah elemen dalam daftar alokasi.
- Anggota NumPatchLocations ke jumlah elemen dalam daftar lokasi patch.
Jika driver tampilan mode pengguna mendeteksi bahwa sebagian besar buffer perintah memerah adalah karena driver kehabisan ruang di buffer perintah, daftar alokasi, atau daftar lokasi patch, driver dapat meminta mereka untuk diubah ukurannya. Untuk mengubah ukuran buffer perintah, driver mengatur bendera bit-field ResizeCommandBuffer di anggota BenderaD3DDDICB_RENDER dan menempatkan ukuran yang diminta di anggota NewCommandBufferSize dari D3DDDICB_RENDER. Demikian pula, untuk mengubah ukuran daftar alokasi, driver menetapkan bendera bidang bit ResizeAllocationList di anggota Bendera D3DDDICB_RENDER dan menempatkan jumlah elemen yang diminta dalam anggota NewAllocationListSize dari D3DDDICB_RENDER. Untuk mengubah ukuran daftar lokasi patch, driver mengatur bendera bidang bit ResizePatchLocationList di anggota Bendera D3DDDICB_RENDER dan menempatkan jumlah elemen yang diminta di anggota NewPatchLocationListSize dari D3DDDICB_RENDER.
Contoh
Contoh kode berikut menunjukkan cara mengirimkan buffer perintah saat ini untuk penyajian ke driver miniport tampilan. Contoh kode ini menghasilkan daftar alokasi setelah buffer perintah dan daftar patch dibuat. Ini tidak optimal untuk performa karena buffer perintah diurai lebih dari yang diperlukan. Namun, implementasi ini lebih mudah ditampilkan. Dalam driver produksi, menghasilkan buffer perintah pada saat yang sama dengan alokasi dan daftar patch lebih efisien.
VOID CD3DContext::SubmitDXVABuffer(DWORD Size) {
D3DDDICB_RENDER renderCBData = {0};
DWORD dwAllocationListUsed;
HRESULT hr;
if (GenerateAllocationListFromCmdBuf(R200UpdateQSParamsForDXVASubmit(m_pR200Ctx, Size), m_sContexts[MULTI_ENGINE_NODE_VIDEO].pHwCmdBufAllocList, m_dwHwCmdBufAllocListSize, &dwAllocationListUsed) == FALSE)
{
DBG_BREAK;
return;
}
// 3-D and video packets must be in sync. If the last packet that was sent went to
// the 3-D engine, that packet must finish before the new packet runs on the hardware.
renderCBData.CommandOffset = 0;
renderCBData.CommandLength = Size + sizeof(UMD_CMDBUF_INFO);
renderCBData.NumAllocations = dwAllocationListUsed;
renderCBData.hContext = m_sContexts[MULTI_ENGINE_NODE_VIDEO].hContext;
// Copy command-buffer data from the internal buffer to the buffer that was created by dxgkrnl
memcpy(m_sContexts[MULTI_ENGINE_NODE_VIDEO].pHwCmdBuf, m_pHwCmdBuf + GetCmdBufPreambleSize(m_pR200Ctx), renderCBData.CommandLength);
m_d3dCallbacks.pfnRenderCb(m_hD3D, &renderCBData);
// Makes video the last engine that work was submitted to
m_LastEngineSubmit = MULTI_ENGINE_NODE_VIDEO;
}
Persyaratan
Persyaratan | Nilai |
---|---|
Klien minimum yang didukung | Tersedia di Windows Vista dan versi yang lebih baru dari sistem operasi Windows. |
Target Platform | Desktop |
Header | d3dumddi.h (termasuk D3dumddi.h) |
Lihat juga
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk