píšu malý nástroj, který hlásí možnosti systému. Jedním z nich je nejvyšší model shader podporovaný nainstalovanou grafickou kartou a v současné době to detekuji pomocí funkcí zařízení Direct3D 9.0 c a kontrolou polí VertexShaderVersion
a PixelShaderVersion
struktury 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);
obě tyto hodnoty však vracejí shader model 3 i pro karty, které podporují vyšší modely. Zde je to, co GPU-Z vrací pro stejnou kartu, například:
tato otázka naznačuje, že DX9 nikdy nehlásí více než SM3 ani na kartách, které podporují vyšší model, ale ve skutečnosti nezmiňuje, jak jej vyřešit.
jak přesně získám model shader podporovaný nainstalovanou kartou? To znamená Možnosti karty, nikoli nainstalované funkce ovladače DirectX.
nástroj musí běžet v systému Windows 2000 a vyšším a pracovat na systémech, kde není nainstalována grafická karta ani DirectX. V současné době dynamicky Načítám DX9, takže na těchto systémech kontrola elegantně selže (což je v pořádku.) Ale Hledám podobné řešení: něco, co bude stále běžet na všech systémech a bude fungovat správně (detekovat verzi SM) na většině systémů.
Edit – účel: tento kód nepoužívám k dynamické změně funkcí programu, tj. Používám jej k hlášení hardwarových schopností jako „ping“ serveru, který se používá k tomu, abychom měli dobrou představu o typickém hardwaru, který naši zákazníci používají, což může informovat o budoucích rozhodnutích o produktu. (Příklad: kolik zákazníků má SM4 nebo vyšší? Kolik z nich používá 64bitový operační systém? Atd.) To je důvod, proč buď (a) elegantně selhává, takže víme, že selhal, nebo (b) získání přesného čísla modelu shader jsou dva preferované režimy.
Edit – answers so far: odpověď níže SigTerm navrhuje vytvořit instanci DirectX 11, 10.1, 10 a 9.0 c v pořadí a založit nahlášený model shader, na kterém byla verze instantována bez selhání (shader model 5, 4.1, 4 a DXCAPS v tomto pořadí.) Pokud je to možné, ocenil bych příklad kódu DX11 a 10 způsobů, jak to udělat.
to nemusí být spolehlivé řešení. Například používám Windows na virtuálním stroji VMWare Fusion v OSX. Ovladače Fusion hlásí DX11 v DxDiag, přesto vím z technických specifikací Fusion, že podporuje pouze DX9. 0c a shader model 3. Přesto se s touto výjimkou zdá, že tato metoda je zatím nejlepší.