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 [in, out]
Um ponteiro para uma estrutura D3DDDIARG_LOCKASYNC que descreve o recurso ou a superfície dentro do recurso a ser bloqueado.
Retornar valor
LockAsync retorna um dos seguintes valores:
Código de retorno | Descrição |
---|---|
S_OK | O recurso foi 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 que a estrutura D3DDDIARG_LOCKASYNC especifica. 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 a LockAsync para o recurso especificado. |
Comentários
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 do aplicativo main. 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; O runtime do Direct3D chamará LockAsync somente se o driver implementar as funções LockAsync, UnlockAsync e Rename . No entanto, um driver de exibição no modo de usuário deve implementar as funções LockAsync e UnlockAsync e Rename , pois os aplicativos que bloqueiam recursos dinâmicos com frequência 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, o runtime chama LockAsync no thread de main 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 de 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 Descartar campo de bits estiver definido no membro Flags 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 Descartar campo de bits no membro Flags da estrutura D3DDDICB_LOCK quando o driver chamar pfnLockCb. O driver deve definir o sinalizador de campo de bits NoExistingReference de D3DDDICB_LOCK quando o driver chamar pfnLockCb somente se o sinalizador de campo de bits NoExistingReferences estiver definido como TRUE no membro Flags do D3DDDIARG_LOCKASYNC e o driver não tiver referências internas enfileiradas ao recurso.
Se o driver não renomear a alocação, a função LockAsync do driver deverá retornar a falha de volta para o runtime e o driver não deverá liberar o buffer de comando. Se a renomeação for bem-sucedida, o driver deverá retornar ponteiros para a memória do recurso, a inclinação 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 retornado pelo pfnLockCb . Em vez disso, o driver deve aguardar até que sua função Rename seja chamada.
Se o sinalizador de campo de bits NoOverwrite estiver definido no membro Flags do D3DDDIARG_LOCKASYNC, o driver deverá bloquear a alocação correspondente sem semântica sem substituição. O driver deve chamar pfnLockCb com o sinalizador de campo de bits IgnoreSync definido no membro Flags do D3DDDICB_LOCK e, em seguida, deve retornar ponteiros para a memória do recurso, a inclinação e a segmentação de dados para o runtime do Direct3D nos membros do D3DDDIARG_LOCKASYNC. Se o driver retornar êxito (S_OK) de uma chamada para seu LockAsync com o sinalizador de campo de bits NoOverwrite definido, 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 exige que as alocações que correspondem às superfícies devem ter suporte em segmentos de AGP ou de abertura; caso contrário, as chamadas para a função pfnRenderCb falharão quando o buffer de comando referenciar uma alocação bloqueada.
Em resumo, o driver deve falhar nas chamadas para sua função LockAsync se a renomeação falhar ou se não houver suporte para a semântica 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 |
---|---|
Cliente mínimo com suporte | Disponível no Windows Vista e versões posteriores dos sistemas operacionais Windows. |
Plataforma de Destino | Área de Trabalho |
Cabeçalho | d3dumddi.h (inclua D3dumddi.h) |