Dispositivos perdidos
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 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.
Por design, o conjunto completo de cenários que podem causar a perda de um dispositivo 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 na redefinição de um dispositivo coloca o dispositivo em um estado perdido.
Todos os métodos derivados de IUnknown têm 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 um erro de "dispositivo perdido" – 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 silenciosa, retornando S_OK ou qualquer outro código de retorno – se uma função falhar silenciosamente, o aplicativo geralmente não poderá distinguir entre o resultado de "sucesso" e uma "falha silenciosa".
- Retorna um código de retorno.
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 todas as cadeias de troca. A redefinição é o único procedimento que tem efeito quando um dispositivo é perdido e é a única maneira pela qual um aplicativo pode alterar o dispositivo de um estado perdido para um operacional. A redefinição falhará, a menos que o aplicativo libere todos os recursos alocados, incluindo destinos de renderização e superfícies de estêncil de profundidade.
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, 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.
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 sejam 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 serem bem-sucedidos, 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 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. 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. É 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 renderizem estados em relação à renderização de passagem única pelo hardware.
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 voláteis. 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.
As operações de cópia podem falhar, pois não há superfície primária quando o dispositivo é perdido. A criação de cadeias de troca também pode falhar porque um buffer traseiro não pode ser criado quando o dispositivo é perdido.
Tópicos relacionados