Notificação assíncrona (Direct3D 9)
Há um número de consultas interessantes em um driver que um aplicativo pode fazer se não houver custo de desempenho. No Direct3D 7 e no Direct3D 8, um mecanismo de consulta síncrono, GetInfo, funcionou bem para coisas como estatísticas, mas nenhuma consulta crítica de desempenho foi adicionada. Há outras coisas (como cercas) que são inerentemente assíncronas. Essa é uma API simples para fazer 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::Issuee sonda o status da consulta usando IDirect3DQuery9::GetData. Se o resultado da consulta estiver disponível, S_OK será retornado; caso contrário, S_FALSE é retornado. Espera-se que o aplicativo passe um buffer de tamanho apropriado para os resultados da consulta.
O aplicativo tem uma opção para 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 criá-las novamente. 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/A |
Campo Sinalizadores 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 Sinalizadores para IDirect3DQuery9::GetData:
#define D3DGETDATA_FLUSH (1 << 0) // Tells the runtime to flush
// if the query is outstanding.
Tópicos relacionados