Sto scrivendo una piccola utility che riporta le funzionalità del sistema. Uno è il modello di shader più alto supportato dalla scheda grafica installata, e attualmente lo sto rilevando utilizzando le funzionalità del dispositivo di Direct3D 9.0 c e controllando i campi VertexShaderVersion
e PixelShaderVersion
della struttura 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);
Tuttavia, entrambi questi valori restituiscono shader model 3 anche per le schede che supportano modelli superiori. Ecco cosa restituisce GPU-Z per la stessa scheda, ad esempio:
Questa domanda indica che DX9 non segnalerà mai più di SM3 anche su schede che supportano un modello più alto, ma in realtà non menziona come risolverlo.
Come posso ottenere con precisione il modello di shader supportato dalla scheda installata? Cioè, le funzionalità della scheda, non le funzionalità del driver DirectX installate.
L’utilità deve essere eseguita su Windows 2000 e versioni successive e lavorare su sistemi in cui non sono installate una scheda grafica e persino DirectX. Attualmente sto caricando dinamicamente DX9, quindi su quei sistemi il controllo fallisce con grazia (che è ok.) Ma sto cercando una soluzione simile: qualcosa che funzionerà ancora su tutti i sistemi e funzionerà correttamente (rileva la versione SM) sulla maggior parte dei sistemi.
Edit – purpose: non sto usando questo codice per modificare dinamicamente le funzionalità di un programma, ovvero selezionare gli shader. Lo sto usando per segnalare le funzionalità hardware come un “ping” a un server, che viene utilizzato per avere una buona idea dell’hardware tipico utilizzato dai nostri clienti, che può informare le decisioni future sui prodotti. (Biru: quanti clienti hanno SM4 o superiore? Quanti stanno usando un sistema operativo a 64 bit? Ecc.) Questo è il motivo per cui (a) con grazia fallendo, quindi sappiamo che non è riuscito, o (b) ottenere un numero di modello shader accurato sono le due modalità preferite.
Modifica – risposte finora: la risposta di seguito di SigTerm suggerisce di istanziare DirectX 11, 10.1, 10 e 9.0 c in ordine e basando il modello di shader riportato su quale versione istanziata senza errori (shader model 5, 4.1, 4 e DXCAPS in quell’ordine.) Se possibile, apprezzerei un esempio di codice del DX11 e 10 modi per farlo.
Questa potrebbe non essere una soluzione affidabile. Ad esempio, sto eseguendo Windows su una macchina virtuale VMware Fusion su OSX. I driver Fusion riportano DX11 in DxDiag, ma so dalle specifiche tecniche Fusion che supporta solo DX9.0c e shader model 3. Tuttavia, con questa eccezione, questo metodo sembra il modo migliore finora.