функция обратного вызова 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 в ответ на вызов функции Разблокировки или ResourceUnmap (или другие варианты ResourceUnmap, например DynamicIABufferUnmap) для разблокировки ресурса или поверхности в ресурсе. Прежде чем вернуться из вызова разблокировки или ResourceUn map, драйвер отображения пользовательского режима должен сначала сопоставить ресурс или поверхность с соответствующим выделением, а затем вызвать pfnUnlockCb, чтобы разблокировать выделение.
Драйвер отображения в пользовательском режиме также может вызывать pfnUnlockCb в ответ на вызов DestroyDevice или DestroyDevice(D3D10) функцию, чтобы освободить все ресурсы, выделенные для устройства. В течение всего времени существования устройства каждый вызов pfnLockCb для блокировки выделения необходимо связать с вызовом функции pfnUnlockCb для разблокировки выделения.
Драйвер отображения в пользовательском режиме может разблокировать несколько выделений в одном вызове pfnUnlockCb, задав элемент NumAllocations в составе структуры D3DDDICB_UNLOCK число выделений в массиве, заданном phAllocations элементом D3DDDICB_UNLOCK.
Драйвер отображения в пользовательском режиме должен вызывать pfnUnlockCb, чтобы разблокировать все выделения, указанные в потоке команд, перед вызовом функции pfnRenderCb. Драйвер может быть заблокирован для поддержки, например флаг NoOverwrite битового поля. Если драйвер не разблокирует все эти выделения, диспетчер памяти видео может потребоваться для размещения этих выделений в памяти AGP.
Драйвер отображения в пользовательском режиме не должен вызывать pfnUnlockCb, чтобы разблокировать выделение, которое может использовать приложение. Драйвер уведомляется о том, что приложение больше не считывает или записывает выделение, когда драйвер получает вызов разблокировки или 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 (include D3dumddi.h) |