jag skriver ett litet verktyg som rapporterar systemfunktioner. En är den högsta shader-modellen som stöds av det installerade grafikkortet, och jag upptäcker för närvarande detta med Direct3D 9.0 c: s enhetsfunktioner och kontrollerar fälten VertexShaderVersion
och PixelShaderVersion
i D3DCAPS9
– strukturen.
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);
båda dessa värden returnerar dock shader model 3 även för kort som stöder högre modeller. Här är vad GPU-Z returnerar för samma kort, till exempel:
denna fråga indikerar att DX9 aldrig kommer att rapportera mer än SM3 även på kort som stöder en högre modell, men nämner inte hur man löser det.
Hur får jag exakt shader-modellen som stöds av det installerade kortet? Det vill säga kortfunktionerna, inte de installerade DirectX-drivrutinsfunktionerna.
verktyget måste köras på Windows 2000 och senare och arbeta på system där ett grafikkort och till och med DirectX inte är installerade. Jag laddar för närvarande dynamiskt DX9, så på dessa system misslyckas kontrollen graciöst (vilket är ok.) Men jag söker en liknande lösning: något som fortfarande körs på alla system och fungerar korrekt (detektera SM-versionen) på de flesta system.
Edit-purpose: jag använder inte den här koden för att dynamiskt ändra funktioner i ett program, dvs välj shaders. Jag använder den för att rapportera hårdvara kapacitet som en ’ping’ till en server, som används för att vi har en god uppfattning om typiska hårdvara som våra kunder använder, som kan informera framtida produktbeslut. (Exempelvis: hur många kunder har SM4 eller högre? Hur många använder ett 64-bitars operativsystem? Osv.) Det är därför antingen (a) graciöst misslyckas, så vi vet att det misslyckades, eller (b) att få ett exakt shader-modellnummer är de två föredragna lägena.
redigera-svar hittills: svaret nedan av SigTerm föreslår instantiating DirectX 11, 10.1, 10 och 9.0 c i ordning och basera den rapporterade shader-modellen på vilken version instansieras utan fel (shader model 5, 4.1, 4 och DXCAPS i den ordningen.) Om möjligt skulle jag uppskatta ett kodexempel på DX11 och 10 sätt att göra detta.
detta kanske inte är en tillförlitlig lösning. Till exempel kör jag Windows på en VMware Fusion virtuell maskin på OSX. Fusion-drivrutinerna rapporterar DX11 i DxDiag, men jag vet från Fusion tech specs att den bara stöder DX9.0C och shader model 3. Ändå, med detta undantag, verkar denna metod det bästa sättet hittills.