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


Инициализация использования сегментов памяти

Сегменты памяти в контексте модели драйвера отображения для Windows Vista и более поздних версий (WDDM) описывают адресное пространство единицы обработки графики в диспетчере памяти видео. Сегменты памяти обобщают и виртуализируют ресурсы видеопамяти. Сегменты памяти настраиваются в соответствии с типами памяти, поддерживаемыми оборудованием (например, память буфера кадров или диафрагма системной памяти).

Чтобы инициализировать использование сегментов памяти, подсистема ядра графики Microsoft DirectX (Dxgkrnl.sys) вызывает функцию драйвера минипорта для отображения DxgkDdiQueryAdapterInfo . Чтобы направить драйвер минипорта дисплея для возвращения сведений о сегментах памяти из вызова DxgkDdiQueryAdapterInfo, графическая подсистема задает либо значение DXGKQAITYPE_QUERYSEGMENT или DXGKQAITYPE_QUERYSEGMENT3 в элементе Type структуры DXGKARG_QUERYADAPTERINFO.

Графическая подсистема дважды вызывает функцию DxgkDdiQueryAdapterInfo дисплейного минипорт-драйвера для получения сведений о сегменте. Первый вызов DxgkDdiQueryAdapterInfo извлекает количество сегментов, поддерживаемых драйвером, а второй вызов получает подробные сведения о каждом сегменте. В вызовах DxgkDdiQueryAdapterInfo драйвер направляет член pOutputDataDXGKARG_QUERYADAPTERINFO на заполненные структуры DXGK_QUERYSEGMENTOUT (для версии драйвера до Windows Display Driver Model (WDDM) 1.2) или на заполненные структуры DXGK_QUERYSEGMENTOUT3 (для драйвера версии WDDM 1.2 и более поздних).

В первом вызове элемент pSegmentDescriptorDXGK_QUERYSEGMENTOUT (для версии драйвера до версии WDDM 1.2) или DXGK_QUERYSEGMENTOUT3 (для драйвера WDDM 1.2 и более поздних версий) имеет значение NULL. Драйвер должен заполнить только элемент NbSegmentDXGK_QUERYSEGMENTOUT или DXGK_QUERYSEGMENTOUT3 числом поддерживаемых типов сегментов. Это число также указывает количество незапущенных DXGK_SEGMENTDESCRIPTOR (для версии драйвера до версии WDDM 1.2) или DXGK_SEGMENTDESCRIPTOR3 (для WDDM 1.2 и более поздних версий драйвера), которые драйвер требует от второго вызова DxgkDdiQueryAdapterInfo.

Во втором вызове драйвер должен заполнить все члены DXGK_QUERYSEGMENTOUT или DXGK_QUERYSEGMENTOUT3. Во втором вызове драйвер должен заполнить массив размером NbSegmentDXGK_SEGMENTDESCRIPTOR или DXGK_SEGMENTDESCRIPTOR3 структур в элементе pSegmentDescriptorDXGK_QUERYSEGMENTOUT или DXGK_QUERYSEGMENTOUT3 сведениями о сегментах, поддерживаемых драйвером.

В обоих вызовах DxgkDdiQueryAdapterInfo член pInputData структуры DXGKARG_QUERYADAPTERINFO указывает на структуру DXGK_QUERYSEGMENTIN, содержащую сведения о расположении и свойствах апертуры AGP. Если нет диафрагмы AGP или если он присутствует, но не установлен соответствующий драйвер GART, сведения о диафрагме AGP равны нулю. Если нет диафрагмы AGP, драйвер минипорта дисплея не должен указывать, в массиве pSegmentDescriptorDXGK_QUERYSEGMENTOUT или DXGK_QUERYSEGMENTOUT3, что он поддерживает сегмент диафрагмы типа AGP. Если сегмент диафрагмы типа AGP указан в таких обстоятельствах, адаптер не может инициализироваться.

Во время инициализации, так как память достаточно, память для буфера разбиения на страницы может быть выделена из определенного сегмента. Диспетчер памяти видео выделяет память для пейджингового буфера из сегмента, указанного в элементе PagingBufferSegmentIdDXGK_QUERYSEGMENTOUT или DXGK_QUERYSEGMENTOUT3. Драйвер указывает идентификатор сегмента буфера разбиения по страницам во втором вызове DxgkDdiQueryAdapterInfo. Драйвер также должен указать размер в байтах, которые должны быть выделены для буфера разбиения на страницы в элементе PagingBufferSizeDXGK_QUERYSEGMENTOUT или DXGK_QUERYSEGMENTOUT3.

Дополнительные сведения о сегментах памяти и работе с пейджинговыми буферами см. в разделе "Обработка сегментов памяти и Пейджинговые ресурсы видеопамяти.