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


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

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

D3DDDICB_UNLOCK

D3DDDI_DEVICECALLBACKS

DestroyDevice

DestroyDevice(D3D10)

ResourceUnmap

Unlock

pfnLockCb

pfnRenderCb