Notificação assíncrona (Direct3D 9)
Há várias consultas interessantes em um driver que um aplicativo pode fazer se não houver nenhum custo de desempenho. No Direct3D 7 e no Direct3D 8, um mecanismo de consulta síncrona, GetInfo, funcionou bem para itens como estatísticas, mas nenhuma consulta crítica ao desempenho foi adicionada. Há outras coisas (como cercas) que são inerentemente assíncronas. Essa é uma API simples para tornar consultas síncronas e assíncronas. GetInfo será desativado no Direct3D 9.
Crie uma consulta usando IDirect3DDevice9::CreateQuery. Esse método usa um D3DQUERYTYPE, que define que tipo de consulta fazer e retorna um ponteiro para um objeto IDirect3DQuery9 . Se não houver suporte para o tipo de consulta, a chamada retornará um erro D3DERR_NOTAVAILABLE. Usando o objeto de consulta, o aplicativo envia a consulta para o runtime usando IDirect3DQuery9::Issue e sonda a consulta status usando IDirect3DQuery9::GetData. Se o resultado da consulta estiver disponível, S_OK será retornado; caso contrário, S_FALSE será retornado. Espera-se que o aplicativo passe um buffer de tamanho apropriado para os resultados da consulta.
O aplicativo tem a opção de forçar o runtime a liberar a consulta para o driver usando D3DGETDATA_FLUSH com IDirect3DQuery9::GetData. Isso causa uma liberação, forçando o driver a ver a consulta. Nesse caso, D3DERR_DEVICELOST será retornado se o dispositivo for perdido.
Todas as consultas são perdidas quando o dispositivo é perdido, o aplicativo precisa recriá-las. Se o dispositivo não der suporte à consulta e o pQueryID for NULL, a criação da consulta falhará com D3DERR_INVALIDCALL.
A tabela a seguir resume informações importantes sobre cada tipo de consulta.
QuertyType | Sinalizador de problema válido | Buffer GetData | Runtime | Início implícito da consulta |
---|---|---|---|---|
D3DQUERYTYPE_VCACHE | D3DISSUE_END | D3DDEVINFO_VCACHE | Varejo/depuração | Createdevice |
D3DQUERYTYPE_ResourceManager | D3DISSUE_END | D3DDEVINFO_ResourceManager | Somente depuração | Presente |
D3DQUERYTYPE_VERTEXSTATS | D3DISSUE_END | D3DDEVINFO_D3DVERTEXSTATS | Somente depuração | Presente |
D3DQUERYTYPE_EVENT | D3DISSUE_END | BOOL | Varejo/depuração | Createdevice |
D3DQUERYTYPE_OCCLUSION | D3DISSUE_BEGIN,D3DISSUE_END | DWORD | Varejo/depuração | N/D |
Campo Flags para IDirect3DQuery9::Issue:
#define D3DISSUE_END (1 << 0)
// Tells the runtime to issue the end of a query, changing its state to
// "non-signaled"
#define D3DISSUE_BEGIN (1 << 1) // Tells the runtime to issue the
// beginning of a query.
Campo Flags para IDirect3DQuery9::GetData:
#define D3DGETDATA_FLUSH (1 << 0) // Tells the runtime to flush
// if the query is outstanding.
Tópicos relacionados