Partilhar via


Dispositivos perdidos (Direct3D 9)

Um dispositivo Direct3D pode estar em um estado operacional ou 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 cheia, 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 sucesso mesmo que as operações de renderização falhem. Nessa situação, o código de erro D3DERR_DEVICELOST é retornado pelo IDirect3DDevice9::P resent.

Por design, o conjunto completo de cenários que podem fazer com que um dispositivo se perca 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 em tela cheia. Além disso, qualquer falha do IDirect3DDevice9::Reset coloca o dispositivo em um estado perdido.

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

  • 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 como esperado.
  • Falha silenciosa, retornando S_OK ou quaisquer outros códigos de retorno - Se uma função falhar silenciosamente, o aplicativo geralmente não consegue distinguir entre o resultado de "sucesso" e uma "falha silenciosa".
  • A função retorna um código de retorno.
Diferenças entre o Direct3D 9 e o Direct3D 9Ex:
Um dispositivo Direct3D 9 retorna D3DERR_DEVICELOST. Depois de ter sido retornado do IDirect3DDevice9::P resent, o comportamento de emulação não funciona 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).

 

Responder a um dispositivo perdido

Um dispositivo perdido deve recriar recursos (incluindo recursos de memória de vídeo) depois de ter sido redefinido. Se um dispositivo for perdido, o aplicativo consulta 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 prepara o dispositivo destruindo todos os recursos de memória de vídeo e quaisquer cadeias de permuta. Em seguida, o aplicativo chama o IDirect3DDevice9::Reset método. 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 no D3DPOOL_DEFAULT, incluindo aqueles criados pelos IDirect3DDevice9::CreateRenderTarget e IDirect3DDevice9::CreateDepthStencilSurface métodos.

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 de retorno do IDirect3DDevice9::TestCooperativeLevel método.

Operações de bloqueio

Internamente, o Direct3D faz trabalho suficiente para garantir que uma operação de bloqueio seja bem-sucedida após a perda de um dispositivo. 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 do 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 sucesso retornando D3D_OK, mas na verdade 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á 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 pareçam funcionar 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 todas as cadeias de permuta 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 automaticamente destruídos pela transição para um estado operacional.

Você é encorajado a desenvolver aplicativos com um único caminho de código para responder à perda de dispositivo. É provável que esse caminho de código seja 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 os estados de renderização em relação à renderização em uma única etapa 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 não voláteis de memória do sistema. 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 retorna D3DERR_DEVICELOST se o sinalizador FLUSH for especificado, para indicar ao aplicativo que IDirect3DQuery9::GetData nunca retornará S_OK.

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

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. Em versões anteriores do DirectX, um dispositivo perdido exigia que sombreadores fossem recriados.

dispositivos Direct3D