функция обратного вызова PFND3DDDI_LOCKASYNC (d3dumddi.h)
Функция LockAsync блокирует указанный ресурс или поверхность в ресурсе.
Синтаксис
PFND3DDDI_LOCKASYNC Pfnd3dddiLockasync;
HRESULT Pfnd3dddiLockasync(
HANDLE hDevice,
D3DDDIARG_LOCKASYNC *unnamedParam2
)
{...}
Параметры
hDevice
Дескриптор устройства отображения (графический контекст).
unnamedParam2
pData [in, out]
Указатель на структуру D3DDDIARG_LOCKASYNC , описывающую ресурс или поверхность в ресурсе для блокировки.
Возвращаемое значение
LockAsync возвращает одно из следующих значений:
Код возврата | Описание |
---|---|
S_OK | Ресурс успешно заблокирован. |
E_OUTOFMEMORY | LockAsync не удалось выделить необходимую память для ее завершения. |
D3DDDIERR_WASSTILLDRAWING | Не удалось переименовать выделение, соответствующее ресурсу, заданному D3DDDIARG_LOCKASYNC структурой. Драйвер возвращает это значение только в том случае, если в элементе Flags D3DDDIARG_LOCKASYNC был установлен флаг Отменить битовое поле. |
E_NOTIMPL | Драйвер отображения пользовательского режима не поддерживает LockAsync для указанного ресурса. |
Комментарии
На компьютерах с несколькими процессорами среда выполнения Microsoft Direct3D может вызывать большинство функций драйвера отображения пользовательского режима из рабочего потока, а не из потока приложения main. Эта многопроцессорная оптимизация является прозрачной для драйвера дисплея в пользовательском режиме. Когда среда выполнения использует многопроцессорную оптимизацию, она может вызвать LockAsync , а не функцию Lock для блокировки ресурса.
Драйвер отображения пользовательского режима при необходимости реализует LockAsync; Среда выполнения Direct3D вызывает LockAsync , только если драйвер реализует функции LockAsync, UnlockAsync и Rename . Однако драйвер отображения пользовательского режима должен реализовывать функции LockAsync и UnlockAsync и Rename , так как приложения, которые часто блокируют динамические ресурсы, могут достичь более высокой производительности.
Если среда выполнения Direct3D использует многопроцессорную оптимизацию, она вызывает большинство функций драйвера отображения пользовательского режима из рабочего потока, которым управляет среда выполнения. однако среда выполнения вызывает LockAsync в потоке main приложения.
Если драйвер отображения пользовательского режима предоставляет версию DDI 0x0000000B или более поздней версии (драйвер возвращает это значение в элементе DriverVersion структуры D3D10DDIARG_OPENADAPTER при вызове функции OpenAdapter драйвера), среда выполнения Direct3D вызывает LockAsync повторно. Когда среда выполнения вызывает LockAsync повторно, один поток может выполняться внутри LockAsync, а другой поток, ссылающийся на то же устройство отображения, выполняется внутри другой функции драйвера отображения пользовательского режима. Кроме того, для этого типа драйвера среда выполнения будет вызывать LockAsync для поверхностей системной памяти. Если флаг отменить битовое поле установлен в элементе FlagsD3DDDIARG_LOCKASYNC, драйвер должен попытаться переименовать выделение, соответствующее ресурсу. Как правило, чтобы переименовать выделение, драйвер вызывает функцию pfnLockCb с дескриптором выделения, соответствующим заблокированным ресурсу.
Драйвер должен установить флаг Отменить битовое поле в элементе Flags структуры D3DDDICB_LOCK , когда драйвер вызывает pfnLockCb. Драйвер должен установить флаг битового поля NoExistingReference D3DDDICB_LOCK, когда драйвер вызывает pfnLockCb только в том случае, если флаг битового поля NoExistingReferences имеет значение TRUE в элементе Flags D3DDDIARG_LOCKASYNC и драйвер не имеет внутренних очередей ссылок на ресурс.
Если драйверу не удается переименовать выделение, функция LockAsync драйвера должна вернуть сбой обратно в среду выполнения, а драйвер не должен очищать свой буфер команд. Если переименование выполнено успешно, драйвер должен вернуть указатели на память ресурса, шаг и шаг среза, а также дескриптор ресурса, который представляет переименованное выделение в членах D3DDDIARG_LOCKASYNC. Драйвер не должен обновлять свои внутренние структуры отслеживания с помощью нового дескриптора выделения, возвращаемого pfnLockCb . Вместо этого драйвер должен подождать, пока не будет вызвана его функция Rename .
Если флаг битового поля NoOverwrite установлен в элементе Flags D3DDDIARG_LOCKASYNC, драйвер должен заблокировать соответствующее выделение семантикой без перезаписи. Драйвер должен вызывать pfnLockCb с флагом bit-field IgnoreSync , установленным в элементе FlagsD3DDDICB_LOCK а затем возвращать указатели на память ресурса, шаг и шаг среза для среды выполнения Direct3D в членах D3DDDIARG_LOCKASYNC. Если драйвер возвращает успешное выполнение (S_OK) из вызова lockAsync с установленным флагом битового поля NoOverwrite , его можно вызвать для отрисовки с заблокированной поверхностью. Драйвер должен возвращать успешное выполнение вызова lockAsync с параметром NoOverwrite , установленным только для поверхностей, которые могут быть отрисованы во время блокировки. Диспетчер видеопамяти требует, чтобы выделения, соответствующие поверхностям, поддерживались в сегментах AGP или диафрагмы; В противном случае вызовы функции pfnRenderCb завершаются ошибкой, если буфер команд ссылается на заблокированное выделение.
Таким образом, драйвер должен не вызывать свою функцию LockAsync в случае сбоя переименования или если для ресурса не поддерживается семантика без перезаписи. Однако среда выполнения Direct3D будет восстановлена после этих сбоев. Во всех остальных ситуациях драйверы должны возвращать успешное выполнение из LockAsync , чтобы повысить производительность на компьютерах с несколькими процессорами.
Требования
Требование | Значение |
---|---|
Минимальная версия клиента | Доступно в Windows Vista и более поздних версиях операционных систем Windows. |
Целевая платформа | Персональный компьютер |
Верхняя часть | d3dumddi.h (включая D3dumddi.h) |