Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Диспетчер памяти видео обеспечивает специальную поддержку прямого доступа ЦП к свиззленным выделениям (т. е. выделениям, в которых функция DxgkDdiCreateAllocation драйвера минипорта задает флаг Swizzled в элементе Flags члене структуры DXGK_ALLOCATIONINFO).
Когда диспетчер видеопамяти вытесняет из сегмента памяти выделения, доступные для ЦП, которые драйвером не помечены как свертки, драйвер минипорта дисплея всегда должен хранить их в линейном формате. Таким образом, такие выделения не могут быть развёрнуты во время их размещения в сегменте апертуры, и они всегда должны быть развёрнуты или развернуты функцией драйвера DxgkDdiBuildPagingBuffer.
С другой стороны, размещения, помеченные как swizzled, не обязаны всегда храниться в линейном формате при вытеснении из сегмента памяти. Для таких выделений диспетчер видеопамяти отслеживает состояние свертывания этих выделений и требует от функции драйвера DxgkDdiBuildPagingBuffer выполнить процесс развёртывания при конкретных операциях передачи.
Когда драйвер отображения в пользовательском режиме вызывает функцию среды выполнения Microsoft Direct3D pfnLockCb, диспетчер памяти видео и драйвер минипорта отображения ведут себя следующим образом в зависимости от состояния выделения:
Выделение в сегменте памяти
Диспетчер видеопамяти пытается получить область доступа ЦП для обеспечения линейного доступа к выделенной памяти. Если диспетчер видеопамяти не может получить диафрагму, диспетчер видеопамяти перемещает выделение обратно в системную память (если драйвер не устанавливает DonotEvict член структуры D3DDDICB_LOCKFLAGS). Когда диспетчер памяти видео вызывает функцию драйвера минипорта дисплея DxgkDdiBuildPagingBuffer для передачи выделения, драйвер минипорта дисплея должен отменить выделение.
Выделение вытесняется (перемешанное) или находится в сегменте апертуры.
Выделение должно быть распакучено, прежде чем ЦП сможет получить к нему доступ. Поэтому диспетчер памяти видео сначала пытается загрузить выделение в сегмент памяти. После размещения в сегменте памяти диспетчер видео-памяти и драйвер мини-порта дисплея работают так же, как описано в пункте 1.
Выделение вытесненных (невзруженных)
Если выделение уже не включено в системную память, диспетчер памяти видео возвращает существующий указатель выделения без дополнительной обработки.
Чтобы GPU использовал выделение, которое ранее было расшито, это выделение должно быть перешито перед тем, как его использует GPU. Таким образом, при сбое на поверхности диспетчер памяти видео и драйвер мини-порта отображения ведут себя следующим образом:
Выделение в сегменте памяти (распутывается на лету посредством апертуры ЦП)
Выделение уже находится в взбитом формате, который может обрабатывать GPU. Поэтому диспетчеру видео памяти не требуется дополнительная обработка.
Выделение памяти, вытесненное в системную память (неупорядоченные)
Страницы выделения содержат несмеченные данные и не могут быть сопоставлены с сегментом диафрагмы. Таким образом, выделение должно быть размещено постранично в сегменте памяти. Когда диспетчер памяти видео вызывает функцию DxgkDdiBuildPagingBuffer драйвера минипорта дисплея для подкачки выделения, он запрашивает, чтобы драйвер минипорта сменил порядок в выделении.
Примечание После того, как перестроенное выделение находится под доступом к ЦП через интерфейс ЦП, оно по-прежнему может быть вытеснено до того, как драйвер отображения в пользовательском режиме завершит доступ к ЦП. Этот случай обрабатывается как в случае 2. Вытеснение выполняется таким образом, чтобы быть невидимым для драйвера отображения приложения и пользовательского режима. Кроме того, блокировка без перезаписи (т. е. блокировка, полученная путем установки IgnoreSync члена D3DDDICB_LOCKFLAGS) не допускается при использовании измененной (swizzled) выделенной памяти. Доступ к такому выделению может получить только ЦП или GPU в любое время.