функция обратного вызова DXGKDDI_ACQUIRESWIZZLINGRANGE (d3dkmddi.h)

Функция DxgkDdiAcquireSwizzlingRange делает выделение доступным через диафрагму центрального блока обработки (ЦП) для данного сегмента.

Синтаксис

DXGKDDI_ACQUIRESWIZZLINGRANGE DxgkddiAcquireswizzlingrange;

NTSTATUS DxgkddiAcquireswizzlingrange(
  [in]     IN_CONST_HANDLE hAdapter,
  [in/out] INOUT_PDXGKARG_ACQUIRESWIZZLINGRANGE pAcquireSwizzlingRange
)
{...}

Параметры

[in] hAdapter

Дескриптор для блока контекста, связанного с видеоадаптером. Драйвер мини-порта дисплея ранее предоставлял этот дескриптор подсистеме ядра графики Microsoft DirectX в выходном параметре MiniportDeviceContext функции DxgkDdiAddDevice .

[in/out] pAcquireSwizzlingRange

Указатель на структуру DXGKARG_ACQUIRESWIZZLINGRANGE , содержащую сведения для предоставления доступа к выделению через диафрагму ЦП.

Возвращаемое значение

DxgkDdiAcquireSwizzlingRange возвращает одно из следующих значений:

Код возврата Описание
STATUS_SUCCESS DxgkDdiAcquireSwizzlingRange успешно сделал выделение доступным.
STATUS_GRAPHICS_UNSWIZZLING_APERTURE_UNSUPPORTED DxgkDdiAcquireSwizzlingRange не удалось запрограммировать диапазон свертывания для выделения. Диспетчеру видеопамоты не удается получить диапазон поворота без дальнейших попыток.
STATUS_GRAPHICS_UNSWIZZLING_APERTURE_UNAVAILABLE DxgkDdiAcquireSwizzlingRange не удалось запрограммировать диапазон свертывания для выделения, так как другой диапазон в настоящее время использует необходимые ресурсы графического процессора (GPU). Диспетчер видеопаметь пытается освободить диапазон, который используется в данный момент, а затем пытается снова настроить диапазон поворота.

Комментарии

Функция DxgkDdiAcquireSwizzlingRange вызывается после того, как драйвер отображения пользовательского режима запрашивает виртуальный адрес, который ссылается на биты выделения (т. е. после того, как драйвер отображения пользовательского режима вызывает функцию pfnLockCb с флагом битового поля AcquireAperture , установленным в элементе Flags структуры D3DDDICB_LOCK и в то время как выделение в настоящее время находится в доступном для ЦП сегменте памяти). Если флаг битового поля AcquireAperture не задан в вызове pfnLockCb, DxgkDdiAcquireSwizzlingRange не вызывается, и выделение должно быть в формате, который может обработать драйвер отображения пользовательского режима или приложение.

При вызове DxgkDdiAcquireSwizzlingRange драйвер мини-порта дисплея должен обеспечить доступ к указанному выделению (то есть элементу hAllocationструктуры DXGKARG_ACQUIRESWIZZLINGRANGE , на которую указывает параметр pAcquireSwizzlingRange ), через диафрагму ЦП для указанного сегмента (то есть член SegmentId DXGKARG_ACQUIRESWIZZLINGRANGE). Выделение должно отображаться точно так же, как и в памяти компьютера после распаковки.

Не все запросы драйвера дисплея пользовательского режима доступны драйверу мини-порта дисплея. Диапазоны свертывания, полученные диспетчером видеопамяти, кэшируются на основе выделения, с которым они связаны, и указанных частных данных. При первом запросе драйвера дисплея пользовательского режима для доступа к выделению вызывается функция DxgkDdiAcquireSwizzlingRange драйвера дисплея miniport, чтобы сделать выделение доступным. При последующих запросах с соответствующими частными данными для доступа к выделению используется ранее настроенное сопоставление.

Диспетчер видеопамяти вызывает функцию DxgkDdiReleaseSwizzlingRange драйвера мини-порта дисплея, чтобы освободить диапазон поворота при вытеснения или уничтожении выделения или когда для другого выделения требуется диафрагма. Выделение может быть связано с любым количеством диапазонов поворота (например, с одной диафрагмой на уровень MIP).

Число диапазонов поворотов, поддерживаемых адаптером, предоставляется драйвером в элементе NumberOfSwizzlingRangesструктуры DXGK_DRIVERCAPS при вызове функции DxgkDdiQueryAdapterInfo драйвера. Все диапазоны равны (т. е. любой диапазон может раскрутить или пока любой тип поворота или мозаицы). Диспетчер видеопамяти определяет доступные диапазоны поворота между всеми приложениями, которым они требуются.

Драйвер должен использовать подключенный к памяти ввод-вывод (MMIO) для настройки диапазона поворота. Эти возможности доступа в диапазоне swizzling не должны мешать выполнению GPU (т. е. GPU не должен находиться в бездействии при вызове DxgkDdiAcquireSwizzlingRange ).

Все вызовы DxgkDdiAcquireSwizzlingRange сериализуются между собой, но не с любой другой функцией DDI.

Если GPU поддерживает вращающиеся диапазоны, которые перенаправляют доступ к ЦП к сегментам памяти, не доступным ЦП, или системной памяти, драйвер отображения пользовательского режима может задать сочетание флагов битовых полей AcquireAperture и UseAlternateVA в элементе Flags структуры D3DDDICB_LOCK в вызове функции pfnLockCb для блокировки выделения. В этом случае диспетчер видеопамяти вызывает функцию DxgkDdiAcquireSwizzlingRange драйвера мини-порта дисплея, чтобы получить диапазон поворота для выделения, даже если выделение находится в сегменте памяти, недоступном для ЦП, или в сегменте диафрагмы. Диапазоны поворота связаны с некоторыми ресурсами GPU (например, диапазонами диафрагмы PCI), которыми управляет драйвер, и которые недоступны диспетчеру видеопамяти или не учитываются им.

Вызов DxgkDdiAcquireSwizzlingRange для получения диапазона поворота может завершиться ошибкой из-за того, что ресурс, управляемый драйвером, закончился. Хотя сам диапазон поворота является бесплатным, он может быть недоступен из-за отсутствия ресурса. Драйвер может указать, что диапазон поворотов недоступен для диспетчера видеопамяти, возвращая STATUS_GRAPHICS_UNSWIZZLING_APERTURE_UNAVAILABLE из DxgkDdiAcquireSwizzlingRange. Затем диспетчер видеопамяти пытается освободить диапазон поворотов, который используется в настоящее время, а затем снова вызывает функцию DxgkDdiAcquireSwizzlingRange драйвера, чтобы настроить новый диапазон поворота. Если все диапазоны поворота освобождены, а драйвер по-прежнему завершается сбоем с STATUS_GRAPHICS_UNSWIZZLING_APERTURE_UNAVAILABLE, диспетчер видеопамяти не сможет получить диапазон поворота для выделения.

DxgkDdiAcquireSwizzlingRange следует сделать страничной.

Требования

Требование Значение
Минимальная версия клиента Windows Vista
Целевая платформа Персональный компьютер
Верхняя часть d3dkmddi.h
IRQL PASSIVE_LEVEL

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

D3DDDICB_LOCK

DXGKARG_ACQUIRESWIZZLINGRANGE

DXGK_DRIVERCAPS

DxgkDdiAddDevice

DxgkDdiCreateAllocation

DxgkDdiQueryAdapterInfo

DxgkDdiReleaseSwizzlingRange

pfnLockCb