Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этой статье содержатся сведения о мониторинге контекста, который был представлен в Windows 10 (WDDM 2.0).
Мониторинг контекста обеспечивает гибкую синхронизацию между ядрами GPU или ядрами ЦП и ядрами GPU. Отслеживаемый объект ограждения — это усовершенствованная форма синхронизации ограждения, которая позволяет ядру ЦП или движку GPU сигнализировать или ожидать относительно определённого объекта ограждения.
Мониторинг создания ограждения
Среда выполнения Direct3D создает объект ограждения с мониторингом путем вызова обратного вызова драйвера в пользовательском режиме (UMD) pfnCreateSynchronizationObject2Cb с помощью структуры D3DDDICB_CREATESYNCHRONIZATIONOBJECT2. Элемент сведений этой структуры — это структура D3DDDI_SYNCHRONIZATIONOBJECTINFO2 , описывающая создаваемый объект синхронизации. Среда выполнения задает Info.Type в D3DDDI_MONITORED_FENCE, чтобы указать, что структура Info.MonitoredFence должна использоваться во время создания.
Созданный отслеживаемый объект ограждения имеет следующие атрибуты:
- Начальное значение ограждения.
- Флаги, определяющие поведение ожидания и сигнализирования.
После создания отслеживаемый объект ограждения возвращается со следующими сведениями:
| Товар | Описание |
|---|---|
| hSyncObject | Обработка объекта синхронизации. Этот дескриптор используется в последующих вызовах Dxgkrnl. |
| FenceValueCPUVirtualAddress | Сопоставление только для чтения барьерного значения (64 бита) для ЦП. Этот адрес сопоставляется как WB (кэшируемый) с точки зрения ЦП на платформах, поддерживающих когерентность ввода-вывода, и как UC (некэшируемый) на других платформах. Позволяет ЦП отслеживать ход выполнения барьера, просто считывая это местоположение памяти. ЦП не может записывать данные в это расположение памяти. Чтобы обозначить барьер, ЦП необходимо вызвать SignalSynchronizationObjectFromCpuCb. Адаптеры, поддерживающие IoMmu, должны использовать этот адрес для доступа к GPU. Адрес в этом случае сопоставляется для доступа на чтение и запись. |
| FenceValueGPUVirtualAddress | Сопоставление считывания и записи значения забора (64 бита) для GPU. Этот адрес обозначен как требующий согласования ввода-вывода на платформах, поддерживающих это. Для синхронизации с барьером GPU позволено напрямую записывать данные в этот виртуальный адрес GPU. Графические процессоры IoMmu не должны использовать этот адрес. |
Значение ограждения — это 64-разрядное значение с соответствующими виртуальными адресами, выровненными по 64-разрядной границе. Графические процессоры должны объявлять, способны ли они атомарно обновлять 64-разрядные значения, видимые ЦП с помощью добавленного флага DXGK_VIDSCHCAPS::No64BitAtomics . Если GPU способен атомарно обновлять только 32-битные значения, ОС автоматически обрабатывает случай переполнения барьера. Однако оно накладывает ограничение, что значения ожидания и сигнальные значения ограждения не могут отличаться от последнего сигнального значения ограждения более чем на UINT_MAX/2.
Сигнал GPU
Если движок GPU не способен записывать в отслеживаемый синхронизационный барьер с использованием своего виртуального адреса, UMD использует обратный вызов SignalSynchronizationObjectFromGpuCb для постановки в очередь пакета программного сигнала в контекст GPU.
Чтобы обозначить ограждение для GPU, UMD вставляет команду записи ограждения в поток команд контекста напрямую, минуя режим ядра. Механизм, с помощью которого ядро отслеживает ход выполнения забора, зависит от того, поддерживает ли конкретный обработчик GPU базовую или расширенную реализацию отслеживаемого забора.
После завершения выполнения буфера команд на GPU Dxgkrnl:
- Проходит по списку объектов ограждения с ожидающим ожиданием, которые можно оповестить для этого процесса.
- Считывает текущее значение барьера.
- Определяет, есть ли какие-либо ожидания, которые необходимо отменить.
Ожидание графического процессора
Чтобы дождаться отслеживаемого забора на обработчике GPU, UMD сначала необходимо очистить его ожидающий буфер команды, а затем вызвать WaitForSynchronizationObjectFromGpuCb , указав объект забора (hSyncObject) и значение забора, которое ожидается. Dxgkrnl помещает зависимость во внутреннюю базу данных, а затем немедленно возвращается к UMD, чтобы он мог продолжать помещать задачи в очередь вслед за операцией ожидания. Буферы команд, отправленные после операции ожидания, не запланированы для выполнения до тех пор, пока операция ожидания не будет выполнена.
Сигнал ЦП
Добавлен обратный вызов SignalSynchronizationObjectFromCpuCb, позволяющий ЦП сигнализировать отслеживаемый объект ограждения. Когда Центральный процессор сигнализирует отслеживаемый объект ограждения, Dxgkrnl обновляет адрес в памяти ограждения с сигнальным значением. Это значение становится немедленно видимым для любого средства чтения в пользовательском режиме и немедленно отменяет все удовлетворенные ожидания.
Ожидание центрального процессора (ЦП)
Добавлен обратный вызов WaitForSynchronizationObjectFromCpuCb , позволяющий ЦП ждать объекта отслеживаемого ограждения. Доступны две формы операций ожидания:
- В первой форме waitForSynchronizationObjectFromCpuCb блокируется до тех пор, пока ожидание не будет удовлетворено.
- Во второй форме WaitForSynchronizationObjectFromCpuCb принимает дескриптор события для ЦП, которое сигнализируется, когда условие ожидания выполнено.