PFND3DDDI_LOCKASYNC função de retorno de chamada (d3dumddi.h)
A função LockAsync bloqueia o recurso especificado ou uma superfície dentro do recurso.
Sintaxe
PFND3DDDI_LOCKASYNC Pfnd3dddiLockasync;
HRESULT Pfnd3dddiLockasync(
HANDLE hDevice,
D3DDDIARG_LOCKASYNC *unnamedParam2
)
{...}
Parâmetros
hDevice
Um identificador para o dispositivo de exibição (contexto gráfico).
unnamedParam2
pData [dentro, fora]
Um ponteiro para uma estrutura de D3DDDIARG_LOCKASYNC que descreve o recurso ou a superfície dentro do recurso a ser bloqueado.
Valor de retorno
LockAsync retorna um dos seguintes valores:
Código de retorno | descrição |
---|---|
S_OK | O recurso é bloqueado com êxito. |
E_OUTOFMEMORY | LockAsync não pôde alocar a memória necessária para que ela fosse concluída. |
D3DDDIERR_WASSTILLDRAWING | Falha ao renomear a alocação que corresponde ao recurso especificado pela estrutura de D3DDDIARG_LOCKASYNC. O driver retornará esse valor somente se o sinalizador descartar campo de bits tiver sido definido no membro Flags do D3DDDIARG_LOCKASYNC. |
E_NOTIMPL | O driver de exibição do modo de usuário não dá suporte ao LockAsync para o recurso especificado. |
Observações
Em computadores com vários processadores, o runtime do Microsoft Direct3D pode chamar a maioria das funções do driver de exibição do modo de usuário de um thread de trabalho em vez do thread principal do aplicativo. Essa otimização de vários processadores é transparente para o driver de exibição no modo de usuário. Quando o runtime usa a otimização de vários processadores, ele pode chamar LockAsync em vez da função Lock para bloquear um recurso.
Opcionalmente, um driver de exibição no modo de usuário implementa LockAsync; as chamadas de runtime do Direct3D LockAsync somente se o driver implementar as funções LockAsync, UnlockAsynce Renomear. No entanto, um driver de exibição no modo de usuário deve implementar LockAsync e o UnlockAsync e Renomear funções porque aplicativos que frequentemente bloqueiam recursos dinâmicos podem obter um desempenho mais alto.
Quando o runtime do Direct3D usa a otimização de vários processadores, ele chama a maioria das funções de driver de exibição do modo de usuário de um thread de trabalho que o runtime gerencia; no entanto, as chamadas de runtime LockAsync no thread principal do aplicativo.
Se um driver de exibição no modo de usuário expor uma versão DDI de 0x0000000B ou superior (o driver retornará esse valor no membro DriverVersion da estrutura D3D10DDIARG_OPENADAPTER em uma chamada para a função OpenAdapter do driver), o runtime do Direct3D chamará LockAsync de maneira reentrante. Quando o runtime chama LockAsync de maneira reentrante, um thread pode ser executado dentro do LockAsync, enquanto outro thread que faz referência ao mesmo dispositivo de exibição é executado dentro de outra função de driver de exibição no modo de usuário. Além disso, nesse tipo de driver, o runtime chamará LockAsync para superfícies de memória do sistema. Se o sinalizador de Descartar campo de bits estiver definido no de sinalizadores membro do D3DDDIARG_LOCKASYNC, o driver deverá tentar renomear a alocação que corresponde ao recurso. Normalmente, para renomear uma alocação, o driver chama a função pfnLockCb com o identificador de alocação que corresponde ao recurso a ser bloqueado.
O driver deve definir o sinalizador de Descartar campo de bits no membro sinalizadores da estrutura de D3DDDICB_LOCK quando o driver chamar pfnLockCb. O driver deve definir o sinalizador NoExistingReference bit-field de D3DDDICB_LOCK quando o driver chamar pfnLockCb somente se o sinalizador NoExistingReferences campo de bits estiver definido como TRUE no Flags membro do D3DDDIARG_LOCKASYNC, e o driver não tem referências enfileiradas internamente para o recurso.
Se o driver não renomear a alocação, a função LockAsync do driver deverá retornar a falha de volta ao runtime e o driver não deverá liberar seu buffer de comando. Se a renomeação for bem-sucedida, o driver deverá retornar ponteiros para a memória do recurso, o tom e a fatia e um identificador para o recurso que representa a alocação renomeada nos membros do D3DDDIARG_LOCKASYNC. O driver não deve atualizar suas estruturas de acompanhamento internas com o novo identificador de alocação que pfnLockCb retorna. Em vez disso, o driver deve aguardar até que sua função Renomear seja chamada.
Se o NoOverwrite sinalizador de campo de bits for definido no Flags membro do D3DDDIARG_LOCKASYNC, o driver deverá bloquear a alocação correspondente com semântica sem substituição. O driver deve chamar pfnLockCb com a IgnoreSync sinalizador de campo de bits definido no Flags membro do D3DDDICB_LOCK e, em seguida, deve retornar ponteiros para a memória do recurso, o pitch e o campo de fatia para o runtime do Direct3D nos membros do D3DDDIARG_LOCKASYNC. Se o driver retornar êxito (S_OK) de uma chamada ao LockAsync com o noOverwrite conjunto de sinalizadores de campo de bits, ele poderá ser chamado para renderizar com uma superfície bloqueada. O driver deve retornar êxito de uma chamada para seu LockAsync com NoOverwrite definido apenas para superfícies que podem ser renderizadas enquanto bloqueadas. O gerenciador de memória de vídeo requer que as alocações que correspondem às superfícies devem ter suporte em segmentos de AGP ou abertura; caso contrário, as chamadas para a função pfnRenderCb falham quando o buffer de comando faz referência a uma alocação bloqueada.
Em resumo, o driver deve falhar nas chamadas para sua função de LockAsync se a renomeação falhar ou se não houver suporte para semântica sem substituição para o recurso. No entanto, o runtime do Direct3D se recuperará dessas falhas. Para todas as outras situações, os drivers devem retornar êxito do lockAsync para melhorar o desempenho em computadores com vários processadores.
Requisitos
Requisito | Valor |
---|---|
de cliente com suporte mínimo | Disponível no Windows Vista e versões posteriores dos sistemas operacionais Windows. |
da Plataforma de Destino | Área de trabalho |
cabeçalho | d3dumddi.h (inclua D3dumddi.h) |