Поделиться через


функция обратного вызова DXGKDDI_QUERYCURRENTFENCE (d3dkmddi.h)

Функция DxgkDdiQueryCurrentFence запросы о последнем завершенном идентификаторе ограждения отправки в блоке выполнения команд оборудования.

Синтаксис

DXGKDDI_QUERYCURRENTFENCE DxgkddiQuerycurrentfence;

NTSTATUS DxgkddiQuerycurrentfence(
  [in]     IN_CONST_HANDLE hAdapter,
  [in/out] INOUT_PDXGKARG_QUERYCURRENTFENCE pCurrentFence
)
{...}

Параметры

[in] hAdapter

Дескриптор к блоку контекста, связанному с адаптером отображения. Драйвер минипорта отображения ранее предоставил этот дескриптор подсистеме ядра графики Microsoft DirectX в MiniportDeviceContext выходном параметре функции DxgkDdiAddDevice.

[in/out] pCurrentFence

Указатель на DXGKARG_QUERYCURRENTFENCE структуру, содержащую сведения о текущих данных о ограждении.

Возвращаемое значение

DxgkDdiQueryCurrentFence возвращает STATUS_SUCCESS или соответствующий результат ошибки, если данные оборе не получены успешно.

Замечания

ограждение — это инструкция, содержащая 64 бита данных и адрес. Драйвер мини-порта дисплея может вставить забор в поток прямого доступа к памяти (DMA), который отправляется в модуль обработки графики (GPU). Когда GPU считывает забор, GPU записывает данные о заборе по указанному адресу ограждения. Тем не менее, прежде чем GPU может записывать данные забора в память, он должен обеспечить, чтобы все пиксели от примитивов, предшествующих инструкции по ограждению, были сняты и правильно записаны в память.

Примечание GPU не требуется для остановки всего конвейера, пока он ожидает последнего пикселя от примитивов, предшествующих инструкции по ограждению, чтобы выйти из эксплуатации; GPU может вместо этого запустить примитивы, которые следуют инструкциям по ограждению.
 
Оборудование, поддерживающее виртуальное адресное пространство в контексте GPU, должно поддерживать следующие типы заборов:
  • обычные ограждения являются заборами, которые можно вставить в буфер DMA, созданный в пользовательском режиме. Так как содержимое буфера DMA из пользовательского режима не является доверенным, заборы в таком буфере DMA должны ссылаться на виртуальный адрес в адресном пространстве gpu, а не на физический адрес. Доступ к такому виртуальному адресу привязан тем же механизмом проверки памяти, что и любой другой виртуальный адрес, к которому обращается GPU.
  • привилегированные ограждения — это заборы, которые можно вставить только в созданный буфер DMA (и доступен только в режиме ядра). Ограждения в таком буфере DMA относятся к физическому адресу в памяти.

    Обратите внимание, что если целевой адрес забора был доступен в пользовательском режиме, вредоносное программное обеспечение может выполнить графику по расположению памяти для забора и, следовательно, переопределить содержимое того, что ядро должно получить.

Обратите внимание, что привилегированный буфер DMA может содержать как обычные, так и привилегированные ограждения. Однако если привилегированный буфер DMA содержит обычный забор, компонент ядра, создающий такой буфер DMA, знает, что обычный забор внутри может никогда не быть доступным.

Если драйвер минипорта отображения пропустил последний забор буфера DMA, функция dxgkDdiQueryCurrentFence может быть вызвана для сообщения о пропущенном заборе. Например, если оборудование создает ограждение для памяти, функция dxgkDdiInterruptRoutine активируется для чтения памяти. Однако, если данные о заборе недоступны, когда водитель пытается считывать данные (например, если есть дефектный набор микросхем), забор обычно сообщается при следующем прерывании, если прерывания не были остановлены. Если прерывания были остановлены, и подсистема ядра графики DirectX ожидает слишком долго забора, подсистема вызывает драйвера dxgkDdiQueryCurrentFence функцию, чтобы проверить текущий забор и определить любой ожидающий забор, который он мог пропустить.

Прежде чем драйвер минипорта отображения возвращается из вызова DxgkDdiQueryCurrentFence, если последний идентификатор забора забора, завершенного оборудованием, еще не сообщался, драйвер должен вызвать функцию DxgkCbNotifyInterrupt, чтобы сообщить о заборе. Чтобы реализовать эту функцию, драйвер:

  1. Отслеживает, какие ограждения в последний раз сообщались операционной системе.
  2. Вызывает irQL для прерывания устройства. Чтобы вызвать irQL до уровня прерывания, драйвер может вызвать функцию DxgkCbSynchronizeExecution для синхронизации с ее функцией DxgkDdiInterruptRoutine.
  3. При прерывании IRQL устройства сравнивает последний сообщаемый забор с последним аппаратным забором.
  4. При прерывании IRQL устройства вызовы DxgkCbNotifyInterrupt только в том случае, если последнее оборудование завершено ограждение является более новым, чем последнее сообщаемое ограждение.
DxgkDdiQueryCurrentFence должен быть создан на страницу.

Требования

Требование Ценность
минимальные поддерживаемые клиентские Windows Vista
целевая платформа Настольный
заголовка d3dkmddi.h (include D3dkmddi.h)
IRQL PASSIVE_LEVEL

См. также

DXGKARG_QUERYCURRENTFENCE

DxgkCbNotifyInterrupt

DxgkCbSynchronizeExecution

DxgkDdiAddDevice

DxgkDdiInterruptRoutine