функция обратного вызова 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) |