Compartilhar via


Dispositivos perdidos (Direct3D 9)

Um dispositivo Direct3D pode estar em um estado operacional ou em um estado perdido. O estado operacional é o estado normal do dispositivo no qual o dispositivo é executado e apresenta toda a renderização conforme o esperado. O dispositivo faz uma transição para o estado perdido quando um evento, como a perda de foco do teclado em um aplicativo de tela inteira, faz com que a renderização se torne impossível. O estado perdido é caracterizado pela falha silenciosa de todas as operações de renderização, o que significa que os métodos de renderização podem retornar códigos de êxito mesmo que as operações de renderização falhem. Nessa situação, o código de erro D3DERR_DEVICELOST é retornado por IDirect3DDevice9::P resent.

Por design, o conjunto completo de cenários que podem fazer com que um dispositivo seja perdido não é especificado. Alguns exemplos típicos incluem perda de foco, como quando o usuário pressiona ALT+TAB ou quando uma caixa de diálogo do sistema é inicializada. Os dispositivos também podem ser perdidos devido a um evento de gerenciamento de energia ou quando outro aplicativo assume a operação de tela inteira. Além disso, qualquer falha de IDirect3DDevice9::Reset coloca o dispositivo em um estado perdido.

Todos os métodos que derivam de IUnknown têm a garantia de funcionar depois que um dispositivo é perdido. Após a perda do dispositivo, cada função geralmente tem as três opções a seguir:

  • Falha com D3DERR_DEVICELOST - Isso significa que o aplicativo precisa reconhecer que o dispositivo foi perdido, para que o aplicativo identifique que algo não está acontecendo conforme o esperado.
  • Falha silenciosamente, retornando S_OK ou quaisquer outros códigos de retorno – se uma função falhar silenciosamente, o aplicativo geralmente não poderá distinguir entre o resultado de "êxito" e uma "falha silenciosa".
  • A função retorna um código de retorno.
Diferenças entre Direct3D 9 e Direct3D 9Ex:
Um dispositivo Direct3D 9 retorna D3DERR_DEVICELOST. Depois que ele tiver sido retornado do IDirect3DDevice9::P resent, o comportamento de emulação não funcionará mais e todas as chamadas futuras falharão até que o dispositivo seja redefinido com êxito.
Um dispositivo Direct3D 9Ex nunca retorna D3DERR_DEVICELOST, mas pode retornar novas mensagens de status (consulte alterações de comportamento do dispositivo).

 

Respondendo a um dispositivo perdido

Um dispositivo perdido deve recriar recursos (incluindo recursos de memória de vídeo) após a redefinição. Se um dispositivo for perdido, o aplicativo consultará o dispositivo para ver se ele pode ser restaurado para o estado operacional. Caso contrário, o aplicativo aguarda até que o dispositivo possa ser restaurado.

Se o dispositivo puder ser restaurado, o aplicativo preparará o dispositivo destruindo todos os recursos de memória de vídeo e quaisquer cadeias de troca. Em seguida, o aplicativo chama o método IDirect3DDevice9::Reset. Redefinir é o único método que tem um efeito quando um dispositivo é perdido e é o único método pelo qual um aplicativo pode alterar o dispositivo de um estado perdido para um estado operacional. A redefinição falhará a menos que o aplicativo libere todos os recursos alocados em D3DPOOL_DEFAULT, incluindo aqueles criados pelos métodos IDirect3DDevice9::CreateRenderTarget e IDirect3DDevice9::CreateDepthStencilSurface.

Na maioria das vezes, as chamadas de alta frequência do Direct3D não retornam nenhuma informação sobre se o dispositivo foi perdido. O aplicativo pode continuar a chamar métodos de renderização, como IDirect3DDevice9::D rawPrimitive, sem receber notificação de um dispositivo perdido. Internamente, essas operações são descartadas até que o dispositivo seja redefinido para o estado operacional.

O aplicativo pode determinar o que fazer ao encontrar um dispositivo perdido consultando o valor retornado do método IDirect3DDevice9::TestCooperativeLevel.

Operações de bloqueio

Internamente, o Direct3D faz trabalho suficiente para garantir que uma operação de bloqueio seja bem-sucedida depois que um dispositivo for perdido. No entanto, não é garantido que os dados do recurso de memória de vídeo serão precisos durante a operação de bloqueio. É garantido que nenhum código de erro será retornado. Isso permite que os aplicativos sejam gravados sem preocupação com a perda de dispositivo durante uma operação de bloqueio.

Recursos

Os recursos podem consumir memória de vídeo. Como um dispositivo perdido é desconectado da memória de vídeo de propriedade do adaptador, não é possível garantir a alocação de memória de vídeo quando o dispositivo é perdido. Como resultado, todos os métodos de criação de recursos são implementados para ter êxito retornando D3D_OK, mas de fato alocam apenas memória fictícia do sistema. Como qualquer recurso de memória de vídeo deve ser destruído antes que o dispositivo seja redimensionado, não há nenhum problema de alocação excessiva de memória de vídeo. Essas superfícies fictícias permitem que as operações de bloqueio e cópia apareçam normalmente até que o aplicativo chame IDirect3DDevice9::P resent e descubra que o dispositivo foi perdido.

Toda a memória de vídeo deve ser liberada antes que um dispositivo possa ser redefinido de um estado perdido para um estado operacional. Isso significa que o aplicativo deve liberar quaisquer cadeias de troca criadas com IDirect3DDevice9::CreateAdditionalSwapChain e quaisquer recursos colocados na classe de memória D3DPOOL_DEFAULT. O aplicativo não precisa liberar recursos nas classes de memória D3DPOOL_MANAGED ou D3DPOOL_SYSTEMMEM. Outros dados de estado são destruídos automaticamente pela transição para um estado operacional.

Você é incentivado a desenvolver aplicativos com um único caminho de código para responder à perda de dispositivo. Esse caminho de código provavelmente será semelhante, se não idêntico, ao caminho de código usado para inicializar o dispositivo na inicialização.

Dados recuperados

O Direct3D permite que os aplicativos validem a textura e renderizem estados em relação à renderização de passagem única pelo hardware usando IDirect3DDevice9::ValidateDevice. Esse método, que normalmente é invocado durante a inicialização do aplicativo, retornará D3DERR_DEVICELOST se o dispositivo tiver sido perdido.

O Direct3D também permite que os aplicativos copiem imagens geradas ou gravadas anteriormente de recursos de memória de vídeo para recursos de memória do sistema não complicados. Como as imagens de origem dessas transferências podem ser perdidas a qualquer momento, o Direct3D permite que essas operações de cópia falhem quando o dispositivo é perdido.

Em relação a consultas assíncronas, IDirect3DQuery9::GetData retornará D3DERR_DEVICELOST se o sinalizador FLUSH for especificado, a fim de indicar ao aplicativo que IDirect3DQuery9::GetData nunca retornará S_OK.

A operação de cópia, IDirect3DDevice9::GetFrontBufferData, pode falhar com D3DERR_DEVICELOST, pois não há nenhuma superfície primária quando o dispositivo é perdido. IDirect3DDevice9::CreateAdditionalSwapChain também pode falhar com D3DERR_DEVICELOST porque um buffer de fundo não pode ser criado quando o dispositivo é perdido. Observe que esses casos são a única instância de D3DERR_DEVICELOST fora do IDirect3DDevice9::P resent, IDirect3DDevice9::TestCooperativeLevele métodos IDirect3DDevice9::Reset.

Sombreadores programáveis

No Direct3D 9, sombreadores de vértice e sombreadores de pixel não precisam ser recriados após a redefinição. Eles serão lembrados. Nas versões anteriores do DirectX, um dispositivo perdido exigia que os sombreadores fossem recriados.

dispositivos Direct3D