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.
Setelah panggilan ke pfnRenderCb, driver tampilan mode pengguna harus menentukan alamat dasar dan ukuran buffer perintah yang harus digunakan untuk pengiriman berikutnya dari nilai yang dikembalikan di anggota pNewCommandBuffer dan NewCommandBufferSizedari D3DDDICB_RENDER. Demikian pula, driver harus menentukan alamat dasar dan jumlah elemen daftar alokasi berikutnya dan daftar lokasi patch dari nilai yang dikembalikan di anggota pNewAllocationList dan NewAllocationListSize dan pNewPatchLocationList dan newPatchLocationListSize masing-masing.

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.

Catatan Meskipun driver dapat meminta agar buffer perintah dan daftar alokasi dan lokasi patch diubah ukurannya, manajer memori video mungkin tidak dapat mematuhinya. Oleh karena itu, terlepas dari apakah panggilan ke pfnRenderCb berhasil, driver harus memverifikasi nilai yang dikembalikan di anggota NewCommandBufferSize, NewAllocationListSize, dan NewPatchLocationListSize dari D3DDDICB_RENDER.
 
Jika driver tampilan mode pengguna mengatur anggota hContext dari struktur D3DDDICB_RENDER yang diarahkan oleh parameter pData ke NULL, runtime Microsoft Direct3D mengirimkan operasi penyajian ke konteks default perangkat. Jika driver tampilan mode pengguna mengatur hContext ke handel yang valid yang sebelumnya dikembalikan oleh fungsi pfnCreateContextCb dan yang mewakili konteks perangkat, runtime Direct3D mengirimkan operasi penyajian ke konteks tersebut. Catatan Direct3D Versi 11: Untuk informasi selengkapnya tentang cara driver memanggil pfnRenderCb, lihat Perubahan dari Direct3D 10.

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

CreateDevice

D3DDDICB_RENDER

D3DDDI_DEVICECALLBACKS

Flush

pfnCreateContextCb