функция обратного вызова DXGKDDI_SETVIDPNSOURCEADDRESS (d3dkmddi.h)
Функция DxgkDdiSetVidPnSourceAddress задает адрес основной поверхности, связанной с определенным источником видео.
Синтаксис
DXGKDDI_SETVIDPNSOURCEADDRESS DxgkddiSetvidpnsourceaddress;
NTSTATUS DxgkddiSetvidpnsourceaddress(
IN_CONST_HANDLE hAdapter,
IN_CONST_PDXGKARG_SETVIDPNSOURCEADDRESS pSetVidPnSourceAddress
)
{...}
Параметры
hAdapter
Дескриптор для блока контекста, связанного с видеоадаптером. Драйвер мини-порта дисплея ранее предоставлял этот дескриптор подсистеме ядра графики DirectX в выходном параметре MiniportDeviceContext функции DxgkDdiAddDevice .
pSetVidPnSourceAddress
Указатель на структуру DXGKARG_SETVIDPNSOURCEADDRESS , содержащую аргументы функции.
Возвращаемое значение
DxgkDdiSetVidPnSourceAddress возвращает STATUS_SUCCESS в случае успешного выполнения; в противном случае возвращается один из кодов ошибок, определенных в ntstatus.h.
Начиная с Windows 8 драйвер мини-порта дисплея может завершить вызов DxgkDdiSetVidPnSourceAddress, возвращая STATUS_INVALID_PARAMETER, если элемент SharedPrimaryTransition задан в pSetVidPnSourceAddress-Flags>. Однако такой сбой не ожидается, если не возникнет ошибка в реализации драйвера пользовательского режима функции CheckDirectFlipSupport или в DWM. Если произойдет такой сбой, операционная система не будет легко вернуться в режим композиции, и представление будет неправильным.
Комментарии
DxgkDdiSetVidPnSourceAddress вызывается только с основными источниками, которые соответствуют текущей топологии зафиксированной сети видеотрансляции (VidPN). Например, формат D3DDDIFMT_A8R8G8B8 определяется в соответствии с VidPN, зафиксированным в формате D3DDDIFMT_X8R8G8B8, и наоборот.
Подсистема графического ядра DirectX вызывает DxgkDdiSetVidPnSourceAddress для переключения режима отображения и выполнения операций ввода-вывода на основе памяти (MMIO). Флаги битовых полей в элементе Flagsструктуры DXGKARG_SETVIDPNSOURCEADDRESS , на которую указывает параметр pSetVidPnSourceAddress , указывают тип выполняемой операции отображения. Чтобы переключиться в режим отображения, подсистема ядра графики устанавливает элемент ContextCount DXGKARG_SETVIDPNSOURCEADDRESS равным нулю. В этом случае содержимое массива, указанного элементом Context DXGKARG_SETVIDPNSOURCEADDRESS, не определено. Для выполнения операции переворачивания подсистема графического ядра устанавливает для Параметра ContextCount число контекстов, а Context — для массива дескрипторов контекста драйвера для контекстов, которые участвуют в операции переворачивания.
Если драйвер мини-порта дисплея ранее указал в вызове функции DxgkDdiQueryAdapterInfo , что он поддерживает flip на основе MMIO (установив флаг битового поля FlipOnVSyncMmIo в элементе FlipCaps структуры DXGK_DRIVERCAPSзначение TRUE), функция DxgkDdiSetVidPnPnSourceAddress драйвера впоследствии вызывается на уровне запроса прерывания устройства (DIRQL) для целей flip. Функция DxgkDdiSetVidPnSourceAddress драйвера должна запрограммировать DAC и начать сканирование при следующей вертикальной синхронизации основной поверхности, адрес которой указан в элементе PrimaryAddress DXGKARG_SETVIDPNSOURCEADDRESS. Драйвер также должен передать DXGK_INTERRUPT_CRTC_VSYNC тип прерывания в параметре InterruptType в вызове функции DxgkCbNotifyInterrupt , чтобы сообщить об эффективном адресе сканирования. Драйвер должен следовать вызову DxgkCbNotifyInterrupt с вызовом функции DxgkCbNotifyDpc .
DxgkDdiSetVidPnSourceAddress должен находиться в памяти, не доступной для страницы. DxgkDdiSetVidPnSourceAddress не должен вызывать код, находящийся в памяти для страничных страниц, и не должен управлять данными, которые находится в памяти с возможностью страниц.
Clone-View ситуации
В ситуациях с клонированием драйвер мини-порта дисплея должен соответствующим образом обрабатывать операции перелистывания, как описано в этом разделе.
При запуске DWM подсистема графического ядра DirectX выполняет обратную синхронизацию при вертикальной синхронизации. Однако подсистема ядра графики DirectX может синхронизироваться только при вертикальной синхронизации выходного сигнала одного графического адаптера. Подсистема ядра графики DirectX должна немедленно переворачивать все другие выходные сигналы графического адаптера, чтобы избежать разрыва.
Планировщик GPU обнаружит одну вертикальную синхронизацию и определит, что перевернутая поверхность доступна сразу после первого пролистывания монитора. В результате драйвер минипорта дисплея может отображаться на поверхности, которая по-прежнему отображается на втором мониторе.
Приложения видео (например, Медиаплеер Windows) не знают о ситуациях просмотра клонов и ожидают прогнозируемого интервала вертикальной синхронизации. Если планировщик GPU обнаружил вертикальную синхронизацию обоих мониторов, интервал вертикальной синхронизации (и, следовательно, переворачивание) будет непредсказуемым и со временем будет дрейфовать, что приведет к неправильной работе приложений DWM и видеоприложения.
В ситуациях с клонированием драйвер мини-порта дисплея должен выполнять вертикальное переворачивание на основном мониторе и мгновенное пролистывание на основе MMIO на дополнительном мониторе.
Функция DxgkDdiSetVidPnSourceAddress драйвера мини-порта дисплея должна записывать адрес, на который переворачивается, в объекте графического адаптера.
Чтобы драйвер мини-порта дисплея не ждал следующего вертикального отката дополнительного монитора, подсистема графического ядра DirectX устанавливает для флага битового поля FlipImmediate значение TRUE в вызове функции DxgkDdiSetVidPnSourceAddress драйвера.
См. требования к вызову этой функции с наложениями с несколькими планами в презентации VidPN с многоплановым наложением.
Требования
Требование | Значение |
---|---|
Минимальная версия клиента | Windows Vista |
Верхняя часть | d3dkmddi.h |
IRQL | PASSIVE_LEVEL. Вызывается в DIRQL, если драйвер поддерживает отражение на основе MMIO. |