jeg skriver et lille værktøj, der rapporterer systemfunktioner. Den ene er den højeste shader-model, der understøttes af det installerede grafikkort, og jeg registrerer i øjeblikket dette ved hjælp af Direct3D 9.0 c ‘ s enhedsfunktioner og kontrollerer VertexShaderVersion
og PixelShaderVersion
felterne 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);
begge disse værdier returnerer dog shader model 3 selv for kort, der understøtter højere modeller. Her er hvad GPU-å vender tilbage til det samme kort, for eksempel:
dette spørgsmål indikerer, at DKS9 aldrig vil rapportere mere end SM3 selv på kort, der understøtter en højere model, men nævner faktisk ikke, hvordan man løser det.
Hvordan får jeg nøjagtigt shader-modellen understøttet af det installerede kort? Det vil sige kortfunktionerne, ikke de installerede Driverfunktioner.
værktøjet skal køre på vinduer 2000 og derover og arbejde på systemer, hvor et grafikkort og endda direkte ikke er installeret. Jeg indlæser i øjeblikket dynamisk DKS9, så på disse systemer fejler kontrollen yndefuldt (hvilket er ok.) Men jeg søger en lignende løsning: noget, der stadig vil køre på alle systemer og fungere korrekt (opdage SM-versionen) på de fleste systemer.
Rediger – formål: Jeg bruger ikke denne kode til dynamisk at ændre funktioner i et program, dvs.vælg shaders. Jeg bruger det til at rapportere udstyrsfunktioner som en ‘ping’ til en server, som er vant til, at vi har en god ide om typisk udstyr, som vores kunder bruger, som kan informere fremtidige produktbeslutninger. (Eksempel: hvor mange kunder har SM4 eller derover? Hvor mange bruger et 64-bit OS? Osv.) Dette er grunden til, at enten (a) yndefuldt fejler, så vi ved, at det mislykkedes, eller (b) at få et nøjagtigt shader-modelnummer er de to foretrukne tilstande.
Rediger – svar indtil videre: svaret nedenfor af SigTerm foreslår instantiering af Direct 11, 10.1, 10 og 9.0 c i rækkefølge og baserer den rapporterede shader-model på hvilken version instantieret uden fejl (shader model 5, 4.1, 4 og DCAPS i den rækkefølge.) Hvis det er muligt, vil jeg sætte pris på et kodeeksempel på DK11 og 10 måder at gøre dette på.
dette er muligvis ikke en pålidelig løsning. For eksempel kører jeg vinduer på en virtuel maskine. Fusion drivere rapporterer DK11 i Dkdiag, men jeg ved fra Fusion tech specs, at det kun understøtter DK9.0C og shader model 3. Alligevel synes denne metode med denne undtagelse den bedste måde hidtil.