функция обратного вызова 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 (включая D3dkmddi.h)
IRQL PASSIVE_LEVEL

См. также раздел

DXGKARG_QUERYCURRENTFENCE

DxgkCbNotifyInterrupt

DxgkCbSynchronizeExecution

DxgkDdiAddDevice

DxgkDdiInterruptRoutine