estou escrevendo um pequeno utilitário que relata os recursos do sistema. Um é o modelo de sombreador mais alto suportado pela placa gráfica instalada, e atualmente estou detectando isso usando os recursos do dispositivo do Direct3D 9.0 c e verificando os campos VertexShaderVersion
e PixelShaderVersion
da estrutura D3DCAPS9
.
HRESULT hrDCaps = poD3D9->GetDeviceCaps(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &oCaps); if (!FAILED(hrDCaps)) { // Pixel and vertex shader model versions. Use the minimum number of each for "the" shader model version const int iVertexShaderModel = D3DSHADER_VERSION_MAJOR(oCaps.VertexShaderVersion); const int iPixelShaderModel = D3DSHADER_VERSION_MAJOR(oCaps.PixelShaderVersion);
no entanto, ambos os valores retornam shader model 3 mesmo para cartões que suportam modelos mais altos. Aqui está o que GPU-Z retorna para o mesmo cartão, por exemplo:
essa pergunta indica que o DX9 nunca relatará mais do que o SM3, mesmo em cartões que suportam um modelo mais alto, mas não menciona como resolvê-lo.
Como faço para obter com precisão o modelo shader suportado pela placa instalada? Ou seja, os recursos do cartão, não os recursos instalados do Driver DirectX.
o utilitário tem que ser executado no Windows 2000 e acima, e trabalhar em sistemas onde uma placa gráfica e até mesmo DirectX não estão instalados. Atualmente, estou carregando DX9 dinamicamente, portanto, nesses sistemas, a verificação falha graciosamente (o que está ok.) Mas estou procurando uma solução semelhante: algo que ainda será executado em todos os sistemas e funcionará corretamente (detectar a versão SM) na maioria dos sistemas.
Edit-purpose: não estou usando este código para alterar dinamicamente os recursos de um programa, ou seja, selecionar shaders. Estou usando-o para relatar recursos de hardware como um ‘ping’ para um servidor, que é usado para que tenhamos uma boa idéia do hardware típico que nossos clientes usam, o que pode informar futuras decisões de produtos. (Por exemplo: quantos clientes têm SM4 ou acima? Quantos estão usando um sistema operacional de 64 bits? Etc.) É por isso que (a) falha graciosamente, então sabemos que falhou, ou (b) obter um número de modelo de sombreador preciso são os dois modos preferidos.
Edit-answers so far: a resposta abaixo por SigTerm sugere instanciar DirectX 11, 10.1, 10 e 9.0 c em ordem, e basear o modelo shader relatado em qual versão instanciada sem falhas (shader model 5, 4.1, 4 e DXCAPS nessa ordem.) Se possível, eu apreciaria um exemplo de código do DX11 e 10 maneiras de fazer isso.
esta pode não ser uma solução confiável. Por exemplo, estou executando o Windows em uma máquina virtual VMWare Fusion no OSX. Os drivers Fusion relatam DX11 em DxDiag, mas sei pelas especificações Da Fusion tech que ele suporta apenas DX9.0c e shader model 3. Ainda assim, com essa exceção, esse método parece o melhor caminho até agora.