функция обратного вызова 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, драйвер минипорта отображения может завершиться сбоем вызова DxgkDdiSetVidVidPnSourceAddress, возвращая 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 равным нулю. В этой ситуации содержимое массива, указанного элементом контекста DXGKARG_SETVIDPNSOURCEADDRESS, не определен. Чтобы выполнить операцию переверки, подсистема ядра графики задает ContextCount количеству контекстов и Контексту массиву контекстов драйвера обрабатывает контексты, которые вносят вклад в операцию переверки.
Если ранее указанный драйвер мини-порта отображения, в вызове функции DxgkDdiQueryAdapterInfo, он поддерживает функцию переверки на основе MMIO (задав флаг FlipOnVSyncMmIo битового поля в элементе FlipCapsDXGK_DRIVERCAPS для true), функция драйвера DxgkDdiSetVidPnSourceAddress впоследствии вызывается на уровне запроса прерывания устройства (DIRQL). Функция драйвера DxgkDdiSetVidPnSourceAddress должна программировать DAC и начать сканирование на следующей вертикальной синхронизации, основная поверхность которого указана в PrimaryAddress члена DXGKARG_SETVIDPNSOURCEADDRESS. Драйвер также должен передать тип прерывания DXGK_INTERRUPT_CRTC_VSYNC в параметре прерывания в вызове функции DxgkCbNotifyInterrupt, чтобы сообщить об эффективном адресе сканирования. Драйвер должен следовать вызову DxgkCbNotifyInterrupt с вызовом функции DxgkCbNotifyDpc.
DxgkDdiSetVidPnSourceAddress должен находиться в неизменяемой памяти. DxgkDdiSetVidPnSourceAddress не должен вызывать код, который находится в памяти, доступной для страниц, и не должен управлять данными, которые доступны для страниц.
Clone-View ситуации
В ситуациях с клонированием драйвер минипорта должен обрабатывать операции переверки соответствующим образом, как описано в этом разделе.
При запуске DWM подсистема графического ядра DirectX перевернута при вертикальной синхронизации. Однако подсистема ядра графики DirectX может синхронизироваться только в том случае, если происходит вертикальная синхронизация одного выходного сигнала графического адаптера. Подсистема графического ядра DirectX должна немедленно перевернуть любые другие выходные сигналы графического адаптера, чтобы избежать разрыва.
Планировщик GPU обнаружит одну вертикальную синхронизацию и определит, что перевернутая поверхность доступна сразу после первого перевернутого монитора. В результате драйвер мини-порта отображения может отображаться на поверхности, на которую по-прежнему отображается второй монитор.
Видео-приложения (например, проигрыватель Windows Media) не знают о ситуациях клонирования и ожидают, что интервал вертикальной синхронизации предсказуем. Если планировщик GPU обнаружил вертикальные синхронизации обоих мониторов, то интервал вертикальной синхронизации (и, следовательно, перевернутый) будет непредсказуемым и будет дрейфовать с течением времени, что приведет к неправильной работе DWM и видео-приложений.
Для ситуаций с клонированным представлением драйвер минипорта должен выполнить вертикальную синхронизацию на первичном мониторе и мгновенное перевернуть на вторичном мониторе на основе MMIO.
Функция драйвера мини-порта отображения DxgkDdiSetVidPnSourceAddress должна записывать адрес, который перевернут в объект графического адаптера.
Чтобы направить драйвер мини-порта отображения, чтобы не ожидать следующего вертикального извлечения дополнительного монитора, подсистема ядра графики DirectX задает флаг FlipImmediate битовое поле для TRUE в вызове функции драйвера DxgkDdiSetVidPnSourceAddress.
См. требования к вызову этой функции с многоплановыми наложениями в многоплановой презентации VidPN.
Требования
Требование | Ценность |
---|---|
минимальные поддерживаемые клиентские | Windows Vista |
заголовка | d3dkmddi.h |
IRQL | PASSIVE_LEVEL. Вызывается в DIRQL, если драйвер поддерживает переверку на основе MMIO. |