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


Предварительная приостановка GPU

Модель вытеснения GPU была обновлена в Windows 8 (WDDM 1.2). В обновленной модели операционная система:

  • Не позволяет драйверу отображения в режиме ядра (KMD) отключить вытеснение пакетов DMA GPU.
  • Гарантирует, что запросы на прерывание отправляются в GPU перед активацией процесса обнаружения и восстановления тайм-аута (TDR).
Требование Описание
Реализация драйвера — только полная графика и отрисовка Обязательный
WHLK требования и тесты Device.Graphics... Тест предварительного тестирования, Device.Graphics... FlipOnVSyncMmIo

Если ОС не удается успешно прервать выполнение долго работающих пакетов, то:

  • Высокоприоритетная работа GPU (например, работа, требуемая диспетчером окон рабочего стола (DWM)), может быть отложена. Эта задержка приводит к сбою во время переходов и анимаций окна.
  • Процесс TDR может многократно сбросить GPU и в конечном итоге вызвать проверку системной ошибки.

Все WDDM 1.2 KMD должны поддерживать механизм прерывания Windows 8. Однако во время работы драйверы WDDM 1.2 также могут отказаться от модели вытеснения Windows 8 и сохранить поведение Windows 7 при помощи планировщика подсистемы графического ядра DirectX (Dxgkrnl).

Интерфейс прерывания GPU

KMD может использовать следующие DDI для реализации модели вытеснения GPU в Windows 8.

Шаги по реализации драйвера

Выполните следующие общие действия, чтобы реализовать модель предварительной выборки GPU Windows 8 в вашем KMD:

  1. Скомпилируйте драйвер по заголовкам, имеющим DXGKDDI_INTERFACE_VERSION>= DXGKDDI_INTERFACE_VERSION_WIN8.
  2. Объявите поддержку модели вытеснения GPU Windows 8, установив значения членов структуры DXGK_VIDSCHCAPS для параметров PreemptionAware и MultiEngineAware равными 1. Чтобы поддерживать модель вытеснения Windows 7, установите PreemptionAware в ноль.
  3. Укажите поддерживаемый уровень детализации прерывания в структуре D3DKMDT_PREEMPTION_CAPS, которая принимает постоянные значения из перечислений D3DKMDT_GRAPHICS_PREEMPTION_GRANULARITY и D3DKMDT_COMPUTE_PREEMPTION_GRANULARITY.
  4. Если оборудование поддерживает отложенное переключение контекста, отправьте буфер нулевой длины в функцию DxgkDdiSubmitCommand и задайте pSubmitCommand->Флаги->ContextSwitch член 1. Обратите внимание на обсуждение в разделе ContextSwitch член структуры DXGK_SUBMITCOMMANDFLAGS.
  5. Установите выделение контекста графического процессора и выделение контекста устройства, вызвав функцию DxgkCbCreateContextAllocation. Обратите внимание на конкретные инструкции и ограничения, указанные в примечаниях для функции.
  6. Вызовите функцию DxgkCbDestroyContextAllocation, чтобы уничтожить выделения контекста GPU и выделения контекста устройства, созданные с помощью DxgkCbCreateContextAllocation.
  7. При подготовке буфера DMA в ответ на вызов функции DxgkDdiBuildPagingBuffer инициализируйте ресурс контекста путем заполнения внутренней структуры InitContextResource в структуре DXGKARG_BUILDPAGINGBUFFER. Если ресурсы контекста вытеснены или перемещены, диспетчер видеопамяти будет сохранять содержимое ресурсов контекста.
  8. Драйвер должен поддерживать отображение ввода-вывода в памяти при следующей вертикальной синхронизации. В Windows 8 планировщик GPU пытается прервать оборудование, даже если ожидаются перевороты. Таким образом, чтобы предотвратить слезы и отрисовки артефактов, драйвер должен поддерживать модель перевернутого ввода-вывода памяти и задать FlipOnVSyncMmIo член структуры DXGK_FLIPCAPS значение 1 и поддерживать операции, описанные в разделе FlipOnVSyncMmIo.

Аспекты сопоставления памяти в вашей реализации

Следуйте этим рекомендациям, чтобы создать надежный драйвер, поддерживающий модель предварительного использования GPU Windows 8 и предоставляющий качественный пользовательский интерфейс:

  • Запрос прерывания среднего буфера DMA из GPU, когда планировщик Dxgkrnl отправляет команду прерывания. Аппаратные устройства с более высокой степенью детализации предварительной выборки буфера среднего уровня DMA должны обеспечить лучший пользовательский опыт.
  • Разрешить повторное использование идентификаторов барьера команд подкачки: если запрос на вытеснение привел к вытеснению команд подкачки в аппаратной очереди, планировщик Dxgkrnl повторно отправит вытесненные команды подкачки с теми же идентификаторами барьера, которые использовались изначально, и эти команды будут запланированы перед любыми другими командами на этом процессоре. Команды, не относящиеся к использованию памяти, будут повторно отправлены с новыми идентификаторами ограждения.
  • Укажите список расположений патчей для разделенных буферов DMA. Дополнительные сведения см. в разделе Разделение буфера DMA.
  • Доступен режим проверки, называемый обнаружением утечки привязки. Этот режим проверки проходит по списку расположений исправлений и отклоняет пакеты, которые не снимаются или не переназначают выделенные ресурсы для каждого разбиения пакета. Некоторые аппаратные средства поддерживают виртуальные адреса, что позволяет получить дополнительный уровень косвенного обращения, что может сделать эту проверку ненужной. В таком случае, чтобы указать, что драйвер отказался от режима проверки, значение элемента NoDmaPatching структуры DXGK_VIDSCHCAPS должно быть установлено в 1.
  • В Windows 7 планировщик Dxgkrnl гарантирует, что все разделенные пакеты DMA, соответствующие одной команде отрисовки, выполняются последовательно без переключения на другой контекст отрисовки. В модели вытеснения Windows 8 планировщик может выполнять пакеты рендеринга из другого контекста между двумя разделенными пакетами, соответствующими одной и той же команде рендеринга. В результате драйверы, которые осведомлены о прерывании, должны обрабатывать отправку пакетов DMA с разделением или частичную отправку так же, как и обычную полную отправку пакетов. В частности, состояние GPU должно быть сохранено или восстановлено на границе для таких отправк.
  • Драйвер, учитывающий вытеснение, не должен изменять содержимое разделенного буфера DMA при трансляции на нескольких адаптерах в режиме связывания адаптеров отображения (LDA), где несколько физических GPU связаны для формирования более быстрого виртуального GPU. В модели вытеснения Windows 8 планировщик Dxgkrnl больше не гарантирует выполнение в синхронном режиме последовательности разделенных пакетов без переключения на другой контекст. Драйвер, изменивший содержимое разбиения пакета DMA, скомпрометет целостность данных пакета. В частности, если пакет был выполнен на другом обработчике, он будет работать с той же копией буферных данных DMA.
  • В модели предварительной выборки GPU в Windows 8 планировщик Dxgkrnl позволяет производить выборку для пакетов, которые связаны с примитивами синхронизации «сигнал на отправку». Если устройство использует примитивы синхронизации "сигнал при отправке" с аппаратными состояниями ожидания, оно должно поддерживать возможность упреждать инструкцию ожидания перед выполнением условия ожидания.

Требования к сертификации оборудования

Сведения о требованиях, которым должны соответствовать аппаратные устройства при реализации этой функции, вы можете найти в соответствующей документации WHLK по Device.Graphics... Тесту предварительного тестирования и Device.Graphics... FlipOnVSyncMmIo.