функция обратного вызова PFND3DDDI_UNLOCKCB (d3dumddi.h)
Функция pfnUnlockCb разблокирует выделение, которое было заблокировано вызовом функции pfnLockCb .
Синтаксис
PFND3DDDI_UNLOCKCB Pfnd3dddiUnlockcb;
HRESULT Pfnd3dddiUnlockcb(
HANDLE hDevice,
const D3DDDICB_UNLOCK *unnamedParam2
)
{...}
Параметры
hDevice
Дескриптор устройства отображения (графический контекст).
unnamedParam2
pData [in]
Указатель на структуру D3DDDICB_UNLOCK , описывающую выделение для разблокировки.
Возвращаемое значение
pfnUnlockCb возвращает одно из следующих значений:
Код возврата | Описание |
---|---|
S_OK | Выделение было успешно разблокировано. |
E_OUTOFMEMORY | pfnUnlockCb не удалось завершить из-за нехватки памяти. (Эта ошибка возникает, когда система находится в крайней ситуации с нехваткой памяти и недостаточно места для выделения массива страниц.) |
E_INVALIDARG | Параметры были проверены и определены как неверные. |
Эта функция также может возвращать другие значения HRESULT.
Комментарии
Драйвер отображения пользовательского режима должен вызвать функцию pfnUnlockCb , чтобы разблокировать выделение, которое ранее было заблокировано при вызове функции pfnLockCb . Если драйвер не вызывает pfnUnlockCb, теряется координация между средой выполнения Microsoft Direct3D, драйвером дисплея в пользовательском режиме и драйвером мини-порта дисплея.
Драйвер отображения пользовательского режима обычно вызывает pfnUnlockCb в ответ на вызов его функции Unlock или ResourceUnmap (или других вариантов ResourceUnmap , таких как DynamicIABufferUnmap), чтобы разблокировать ресурс или поверхность внутри ресурса. Перед возвращением из вызова Unlock или ResourceUnmap драйвер отображения пользовательского режима должен сначала сопоставить ресурс или поверхность с соответствующим выделением, а затем вызвать pfnUnlockCb , чтобы разблокировать выделение.
Драйвер отображения пользовательского режима также может вызывать pfnUnlockCb в ответ на вызов функции DestroyDevice или DestroyDevice(D3D10), чтобы освободить все ресурсы, выделенные для устройства. Во время существования устройства каждый вызов pfnLockCb для блокировки выделения должен быть связан с вызовом функции pfnUnlockCb , чтобы разблокировать выделение.
Драйвер отображения пользовательского режима может разблокировать несколько выделений в одном вызове pfnUnlockCb , задав член NumAllocations структуры D3DDDICB_UNLOCK количество выделений в массиве, заданное членом phAllocations D3DDDICB_UNLOCK.
Драйвер отображения пользовательского режима должен вызвать pfnUnlockCb , чтобы разблокировать все выделения, на которые ссылается поток команд, перед вызовом функции pfnRenderCb . В драйвере могут быть заблокированы выделения для поддержки, например флаг битового поля NoOverwrite . Если драйвер не разблокирует все эти выделения, может потребоваться диспетчер видеопамяти для размещения этих выделений в памяти AGP.
Драйвер отображения пользовательского режима не должен вызывать pfnUnlockCb , чтобы разблокировать выделение, которое может использовать приложение. Драйвер получает уведомление о том, что приложение больше не считывает или не записывает данные в выделение, когда драйвер получает вызов функции Unlock или ResourceUnmap для соответствующего ресурса.
Примеры
В следующем примере кода показано, как разблокировать выделение.
HRESULT CD3DContext::SyncEnginesUsingLock(VOID) {
HRESULT hr;
D3DDDICB_LOCK lockCB;
D3DDDICB_UNLOCK Unlock;
memset(&lockCB, 0, sizeof(D3DDDICB_LOCK));
lockCB.hAllocation = m_HandleUsedInLastSubmit;
lockCB.PrivateDriverData = 0;
hr = m_d3dCallbacks.pfnLockCb(m_hD3D, &lockCB);
if (FAILED(hr)) {
DBG_BREAK;
return hr;
}
Unlock.NumAllocations = 1;
Unlock.phAllocations = &m_HandleUsedInLastSubmit;
m_d3dCallbacks.pfnUnlockCb(m_hD3D, &Unlock);
return hr;
}
Требования
Требование | Значение |
---|---|
Минимальная версия клиента | Доступно в Windows Vista и более поздних версиях операционных систем Windows. |
Целевая платформа | Персональный компьютер |
Верхняя часть | d3dumddi.h (включая D3dumddi.h) |