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


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

pfnMakeResidentCb используется для указания ОПЕРАЦИОННОй системе добавить ресурс в список расположения устройств и увеличить число ссылок на место расположения при этом выделении.

Синтаксис

PFND3DDDI_MAKERESIDENTCB Pfnd3dddiMakeresidentcb;

HRESULT Pfnd3dddiMakeresidentcb(
  HANDLE hDevice,
  D3DDDI_MAKERESIDENT *unnamedParam2
)
{...}

Параметры

hDevice

Дескриптор устройства отображения.

unnamedParam2

pData [in, out]

Указатель на структуру D3DDDI_MAKERESIDENT , которая описывает страницы памяти, которые нужно сделать резидентными.

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

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

Код возврата Описание
S_OK Все выделения были выделены на GPU после выхода из этой функции и готовы к немедленному доступу.
E_PENDING Выделения были добавлены в список требований к месту расположения устройств, но по-прежнему имеют ожидающие операции разбиения по страницам, прежде чем они будут успешно доступны. В этом случае драйвер пользовательского режима должен дождаться сигнала PagingFenceValue в объекте синхронизации отслеживаемого ограждения, связанном с hPagingQueue, прежде чем отправлять буферы команд, которые ссылаются на выделения или сбой страницы GPU.
E_OUTOFMEMORY Диспетчер видеопамяти не может сделать каждый запрошенный резидент выделения. В этом случае количество мест проживания не изменится. Другими словами, это атомарная операция, в которой либо все выделения получают увеличение количества мест проживания, либо ни один из них. Кроме того, NumBytesToTrim указывает драйверу, сколько байтов необходимо обрезать из списка требований к месту расположения устройства, вызывая pfnEvictCb, прежде чем пытаться снова сделать невыполненные выделения резидентными.
Бюджет памяти, связанный с приложением, может асинхронно изменяться при выполнении приложения. Как следствие, усечение запрошенного числа байтов не гарантирует, что следующая попытка сделать набор выделенных ресурсов будет успешной, так как бюджет памяти для приложения может сократиться. По этой причине драйвер должен убедиться, что он пытается получить запрос на место расположения в цикле, обрезая между каждой итерацией, пока запрос не будет выполнен успешно или драйвер не обрезает все возможное, чтобы добиться прогресса в одной операции и использовать необходимый ресурс для этой последней попытки. Если эта последняя попытка завершится неудачей, базовое устройство будет помещено в ошибку, и драйвер пользовательского режима должен прервать запрос и вернуться к приложению. Ядро не разрешает дальнейшие отправки в какой-либо контекст, принадлежащий устройству по ошибке.
Для драйвера режима пользователя DirectX 12.0 pfnMakeResidentCb ведет себя немного иначе, так как он больше не отвечает за обрезку или разбиение по страницам в выделениях. Это делается для того, чтобы состояние всех выделений после возвращения из вызова оставалось таким же, как и до вызова. Это означает, что если E_OUTOFMEMORY возвращается из функции:
— Все выделения остаются в исходном состоянии.
- Выделения не были сделаны резидентами.
— Значение PagingFenceValue следует игнорировать.
Если драйверу необходимо выполнять вызовы pfnMakeResidentCb в нескольких пакетах для преобразования ресурсов в выделение, драйвер должен отменить все предыдущие вызовы pfnMakeResidentCb с эквивалентными вызовами pfnEvictCb и распространить код ошибки обратно в среду выполнения.

Требования

Требование Значение
Минимальная версия клиента Windows 10
Минимальная версия сервера Windows Server 2016
Целевая платформа Персональный компьютер
Верхняя часть d3dumddi.h (включая D3dumddi.h)

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

D3DDDI_MAKERESIDENT

pfnEvictCb