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