PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Erkennung von VS 2.a, PS 2.a und 2.b


Neomi
2005-11-09, 19:17:06
Wie kann ich ohne den Einsatz von D3DX (die inzwischen nötige DLL ist ja nicht auf dem System, wenn eine ältere (aber kompatible) Version von DirectX 9.0c installiert ist) am elegantesten erkennen, ob ein Direct3D9-Device VS 2.a bzw. PS 2.a oder PS 2.b übterstützt? Mangels entsprechender Hardware kann ich das hier nicht selbst testen, ansonsten wäre das wohl recht schnell rauszufinden.

Reicht es schon, nach 2.x zu prüfen und dann abhängig von der VendorID sich für 2.a oder 2.b zu entscheiden, oder gibt es da noch Fallstricke? Wie macht sich überhaupt 2.x in den Caps bemerkbar? Als 2.1, 2.x mit einem bestimmten Wert für x oder 2.x mit x ungleich 0? Oder ganz anders?

Coda
2005-11-09, 21:31:19
Bei 2.x sind einfach die entsprechenden Caps gesetzt in D3DPSHADERCAPS2_0.

Wenn du das maximale HLSL-Profil willst dann hilft dir D3DXGetPixelShaderProfile.

Neomi
2005-11-09, 23:05:20
Bei 2.x sind einfach die entsprechenden Caps gesetzt in D3DPSHADERCAPS2_0.

Hoppla, die hatte ich komplett übersehen (obwohl mehrfach drübergeschaut), Unterstrukturen in den Caps hatte ich nicht erwartet (bin wegen der XBox lange Zeit bei DX8 hängengeblieben, bei DX9 bin ich erst in der Entdeckungsphase). Auf einmal erschließt sich alles... danke für den Schubser in die richtige Richtung!

Demirug
2005-11-10, 20:34:15
Du prüfst übrigens nicht auf 2.x sondern auf 2.0. Das 2.X wird nur im Assemblercode der Shader verwendet.

Ohne D3DX ist die Kenntniss des Profiles aber recht nutzloss weil es eigentlich nur der HLSL Compiler verwendet und der ist ja auch in der DLL.

Neomi
2005-11-10, 21:33:17
Ohne D3DX ist die Kenntniss des Profiles aber recht nutzloss weil es eigentlich nur der HLSL Compiler verwendet und der ist ja auch in der DLL.

Das Profil brauche ich ja nicht als String, sondern zur Auswahl des passenden Shaders. Ich habe mir ein kleines Kommandozeilen-Compilertool gebastelt, das einen Shader in alle 4 (VS) bzw. 8 (PS) Profile übersetzt, die Tokenarrays in eine Headerdatei schreibt und gleich noch in einem Array die Adressen der Tokenarrays hinterlegt.

Ich muß soweit nur noch die ausgeworfene Headerdatei einbinden und das Array mit den Tokenarray-Adressen mit einer Zeile in einem anderen Array vermerken, den Rest erledigt eine simple Automatik. Damit die Automatik den passenden Shader aus den fertigen Tokenarrays herauspickt, muß ich wissen, welchen ich nehmen soll. Hier zwei Ausschnitte:


// VertexShader profiles:
// 0 = "vs_1_1"
// 1 = "vs_2_0"
// 2 = "vs_2_a"
// 3 = "vs_3_0"

// get profile for VertexShaders

switch ((d3dCaps.VertexShaderVersion & 0xFF00) >> 8)
{
case 1:
iProfile = 0;
break;

case 2:
if ((d3dCaps.VS20Caps.NumTemps >= 13) &&
(d3dCaps.VS20Caps.DynamicFlowControlDepth > 0) &&
((d3dCaps.VS20Caps.Caps & D3DVS20CAPS_PREDICATION) != 0))
iProfile = 2;
else
iProfile = 1;

break;

case 3:
iProfile = 3;
break;

default:
iProfile = -1;
break;
}



// PixelShader profiles:
// 0 = "ps_1_1"
// 1 = "ps_1_2"
// 2 = "ps_1_3"
// 3 = "ps_1_4"
// 4 = "ps_2_0"
// 5 = "ps_2_a"
// 6 = "ps_2_b"
// 7 = "ps_3_0"

// get profile for PixelShaders

switch ((d3dCaps.PixelShaderVersion & 0xFF00) >> 8)
{
case 1:
iProfile = (d3dCaps.PixelShaderVersion & 0x00FF) - 1;
break;

case 2:
iProfile = 4;

if (d3dCaps.PS20Caps.NumInstructionSlots >= 96)
{
if ((d3dCaps.PS20Caps.NumTemps >= 22) &&
((d3dCaps.PS20Caps.Caps & D3DPS20CAPS_ARBITRARYSWIZZLE) != 0) &&
((d3dCaps.PS20Caps.Caps & D3DPS20CAPS_GRADIENTINSTRUCTIONS) != 0) &&
((d3dCaps.PS20Caps.Caps & D3DPS20CAPS_PREDICATION) != 0) &&
((d3dCaps.PS20Caps.Caps & D3DPS20CAPS_NODEPENDENTREADLIMIT) != 0) &&
((d3dCaps.PS20Caps.Caps & D3DPS20CAPS_NOTEXINSTRUCTIONLIMIT) != 0))
iProfile = 5;
else if ((d3dCaps.PS20Caps.NumTemps >= 32) &&
((d3dCaps.PS20Caps.Caps & D3DPS20CAPS_NOTEXINSTRUCTIONLIMIT) != 0))
iProfile = 6;
}

break;

case 3:
iProfile = 7;
break;

default:
iProfile = -1;
break;
}


Mangels passender Hardware kann ich zwar nicht alle Pfade testen, aber das sollte soweit funktionieren.

Demirug
2005-11-10, 22:32:13
Im Prinzip eine gute Idee aber IMHO zu kurz gedacht. OK ich habe den gleichen Kremple vor kurzem erst selbst programmiert und bin vielleicht deswegen nicht ganz objektiv.

Zum Testen fake ich BTW immer die Caps meiner Karte nach unten.

Neomi
2005-11-10, 23:09:30
Im Prinzip eine gute Idee aber IMHO zu kurz gedacht.

Wo siehst du denn da noch Spielraum nach oben oder Änderungsbedarf? Der Teil des Codes ist erst zwei Tage alt, für Verbesserungsvorschläge bin ich immer offen.

Demirug
2005-11-10, 23:18:22
Ich habe 3 Dinge dabei anders gemacht.

- Meine Profile haben Namen keinen Nummern (OK das ist letzten Endes aber egal).

- Ich prüfe das gesamte Capsfeld + Fähigkeiten der Textureformat. So unterscheidet sich ja ein SM3 Profil von einem SM3 HDR Profil in der Regel dadurch das man bei den FP16 Texturen auch Alphablending nutzen kann.

- Meine Defintionen was zu einem Profile gehört sind nicht statisch im Code sondern werden als Daten geladen. Diese Profile Beschreibungen werden dann am Ende automatisch aus den Effektbeschreibungen erzeugt. Das wird der Effekteditor machen ist aber noch nicht ganz fertig.

Neomi
2005-11-11, 00:03:04
- Meine Profile haben Namen keinen Nummern (OK das ist letzten Endes aber egal).

- Ich prüfe das gesamte Capsfeld + Fähigkeiten der Textureformat. So unterscheidet sich ja ein SM3 Profil von einem SM3 HDR Profil in der Regel dadurch das man bei den FP16 Texturen auch Alphablending nutzen kann.

Was ich da eben gepostet habe, war nur dazu gedacht, die Performancevorteile höherer Shaderversionen mitzunehmen. An der Stelle benötige ich erstmal nicht mehr als die aktuell spezifizierten Shaderprofile. An verschiedene Alternativshader, die je nach den Fähigkeiten der Hardware (oder Qualitäts-/Performanceoptionen) zum Einsatz kommen, habe ich auch gedacht. Das wird dann eine Ebene höher abgefrühstückt. Also kein wirklicher Unterschied, sondern nur an anderer Stelle behandelt.

- Meine Defintionen was zu einem Profile gehört sind nicht statisch im Code sondern werden als Daten geladen. Diese Profile Beschreibungen werden dann am Ende automatisch aus den Effektbeschreibungen erzeugt. Das wird der Effekteditor machen ist aber noch nicht ganz fertig.

Über sowas habe ich auch schonmal nachgedacht, aber aus Zeitgründen habe ich das vorerst verworfen. Das wird dann bei Gelegenheit nachgerüstet.