DXGKCB_NOTIFY_INTERRUPT fungsi panggilan balik (d3dkmddi.h)

Driver miniport tampilan mode kernel memanggil DXGKCB_NOTIFY_INTERRUPT untuk menginformasikan penjadwal unit pemrosesan grafis (GPU) tentang pembaruan perangkat keras grafis pada waktu rutinitas layanan interupsi (ISR).

Sintaks

DXGKCB_NOTIFY_INTERRUPT DxgkcbNotifyInterrupt;

void DxgkcbNotifyInterrupt(
  [in] IN_CONST_HANDLE hAdapter,
  [in] IN_CONST_PDXGKARGCB_NOTIFY_INTERRUPT_DATA unnamedParam2
)
{...}

Parameter

[in] hAdapter

Handel ke objek adaptor untuk GPU. Driver menerima handel dari anggota DeviceHandle dari struktur DXGKRNL_INTERFACE dalam panggilan ke fungsi DxgkDdiStartDevice-nya .

[in] unnamedParam2

Arahkan ke struktur DXGKARGCB_NOTIFY_INTERRUPT_DATA yang berisi informasi pemberitahuan untuk interupsi.

Mengembalikan nilai

Tidak ada

Keterangan

Driver miniport tampilan memanggil fungsi DXGKCB_NOTIFY_INTERRUPT untuk melaporkan gangguan perangkat keras grafis yang ditentukan oleh jenis enumerasi DXGK_INTERRUPT_TYPE .

Biasanya, DXGKCB_NOTIFY_INTERRUPT dipanggil dari fungsi DxgkDdiInterruptRoutine (ISR) driver miniport, yang dipanggil ketika gangguan perangkat keras grafis terjadi. DXGKCB_NOTIFY_INTERRUPT menginformasikan penjadwal GPU tentang pembaruan pada pagar melalui aliran akses memori langsung (DMA) ke perangkat keras grafis.

Jika driver miniport tampilan menggunakan beberapa handler interupsi yang sesuai dengan beberapa IRQL, driver tidak boleh memanggil DXGKCB_NOTIFY_INTERRUPT dengan cara reentrant. Oleh karena itu, dalam hal ini, driver miniport tampilan harus selalu memanggil DXGKCB_NOTIFY_INTERRUPT dari tingkat handler interupsi tetap.

Demikian pula, jika interupsi bersinyalir pesan digunakan, driver miniport tampilan dapat memanggil DXGKCB_NOTIFY_INTERRUPT dari handler interupsi yang sesuai dengan nomor pesan tetap. Driver harus melaporkan nomor pesan yang digunakan untuk pemberitahuan di anggota InterruptMessageNumber dari struktur DXGK_DRIVERCAPS , ketika nilai enumerasi DXGKQAITYPE_DRIVERCAPS ditentukan dalam jenis anggota struktur DXGKARG_QUERYADAPTERINFO dalam panggilan ke fungsi DxgkDdiQueryAdapterInfo driver.

Setelah driver miniport tampilan memanggil DXGKCB_NOTIFY_INTERRUPT tetapi sebelum driver keluar dari ISR-nya, driver harus mengantre panggilan prosedur yang ditangguhkan (DPC) dengan menggunakan fungsi DxgkCbQueueDpc . DPC ini harus diantrekan karena penjadwal GPU juga harus diberi tahu, ketika rutinitas panggilan balik DPC driver memanggil fungsi DXGKCB_NOTIFY_DPC , tentang peristiwa yang sama pada waktu DPC. Sejumlah pemrosesan yang terkait dengan peristiwa perangkat keras grafis hanya dapat dilakukan oleh sistem operasi pada waktu DPC.

Jika driver miniport tampilan menentukan bahwa lebih dari satu gangguan dipicu dalam perangkat keras dan driver harus memanggil DXGKCB_NOTIFY_INTERRUPT untuk setiap gangguan untuk melaporkan gangguan ke sistem operasi, driver harus melaporkan gangguan jenis DMA sebelum gangguan jenis CRTC. Untuk informasi selengkapnya tentang jenis gangguan, lihat DXGK_INTERRUPT_TYPE.

Penelepon DXGKCB_NOTIFY_INTERRUPT berjalan pada tingkat interupsi (yaitu, DIRQL, yang merupakan beberapa IRQL antara DISPATCH_LEVEL dan PROFILE_LEVEL, tidak inklusif).

DXGKCB_XXX diimplementasikan oleh Dxgkrnl. Untuk menggunakan fungsi panggilan balik ini, panggil DxgkCbNotifyInterrupt melalui DXGKRNL_INTERFACE.

Contoh

Contoh kode berikut menunjukkan kode mesin perangkat lunak yang memantau antrean perangkat lunak dan memberi tahu penjadwal GPU tentang penyelesaian paket.

typedef struct _SubmitParams {
    HW_DEVICE_EXTENSION *pHwDeviceExtension;
    UINT                NodeOrdinal;
    UINT                FenceID;
    UINT                PreemptionFenceID;
} SubmitParams;

BOOLEAN R200TEST_SWNode_SynchronizeVidSchNotifyInt(PVOID* params)
{
    SubmitParams  *pSchNotifyParams = (SubmitParams*)params;
    DXGKCB_NOTIFY_INTERRUPT  DxgkCbNotifyInterrupt;
    DXGKARGCB_NOTIFY_INTERRUPT_DATA  notifyInt = {0};

    DxgkCbNotifyInterrupt = (DXGKCB_NOTIFY_INTERRUPT)pSchNotifyParams->pHwDeviceExtension->pVidSchINTCB;

    if(!DxgkCbNotifyInterrupt) {
        return FALSE;
    }

    if(pSchNotifyParams->PreemptionFenceID) {
        notifyInt.InterruptType = DXGK_INTERRUPT_DMA_PREEMPTED;
        notifyInt.DmaPreempted.PreemptionFenceId = pSchNotifyParams->PreemptionFenceID;
        notifyInt.DmaPreempted.LastCompletedFenceId = pSchNotifyParams->FenceID;
        notifyInt.DmaPreempted.NodeOrdinal = pSchNotifyParams->NodeOrdinal;
    }
    else {
        notifyInt.InterruptType = DXGK_INTERRUPT_DMA_COMPLETED;
        notifyInt.DmaCompleted.SubmissionFenceId = pSchNotifyParams->FenceID;
        notifyInt.DmaCompleted.NodeOrdinal = pSchNotifyParams->NodeOrdinal;
    }

    DxgkCbNotifyInterrupt(pSchNotifyParams->pHwDeviceExtension->DeviceHandle, &notifyInt);

    pSchNotifyParams->pHwDeviceExtension->PrevSubmitFenceIDArray[pSchNotifyParams->NodeOrdinal] = pSchNotifyParams->FenceID;

    if(pSchNotifyParams->PreemptionFenceID) {
        pSchNotifyParams->pHwDeviceExtension->PrevPreemptFenceIDArray[pSchNotifyParams->NodeOrdinal] = pSchNotifyParams->PreemptionFenceID;
    }

    return TRUE;
}

Persyaratan

Persyaratan Nilai
Klien minimum yang didukung Windows Vista (WDDM 1.0)
Target Platform Desktop
Header d3dkmddi.h (termasuk D3dkmddi.h)
IRQL Lihat bagian Keterangan.

Lihat juga

DXGK_DRIVERCAPS

DXGKARGCB_NOTIFY_INTERRUPT_DATA

DXGKARG_QUERYADAPTERINFO

DXGKRNL_INTERFACE

DXGK_INTERRUPT_TYPE

DXGKCB_NOTIFY_DPC

DxgkCbQueueDpc

DxgkDdiInterruptRoutine

DxgkDdiQueryAdapterInfo

DxgkDdiStartDevice