PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [S]: "Custom resolutions" für Radeons


zeckensack
2004-12-20, 10:55:49
Können rTool oder aTuner das? Wenn nein, kann man das eventuell einbauen? :naughty:

Hier (http://www.forum-3dcenter.org/vbulletin/showthread.php?t=192003) die Problematik. Ich suche ein kleines, einfach zu bedienendes, nicht das System zumüllendes Freeware-Tool, das das Hinzufügen beliebiger Auflösungen erlaubt. Das ganze sollte natürlich den passenden Registry-Schlüssel für die aktuell aktive Graka kennen, und nicht stumpf in \0000 rumfuhrwerken.

aTuner und rTool haben die Problematik des korrekten Registry-Schlüssels schon gelöst, und erfüllen die anderen Kriterien :)

zeckensack
2004-12-20, 11:08:23
Oops :redface:
Falsches Forum. Bitte in "3DCenter-Tools" verschieben :usweet:

Gohan
2004-12-20, 11:49:07
Bitteschön :)

aths
2004-12-21, 00:36:48
Wenn du mir genau sagst, in welchem Subkey da was eingetragen werden muss, könnte ich den aTuner entsprechend ergänzen. Allerdings habe ich kaum Platz, um den Button zum entsprechenden Panel unterzukriegen. Deshalb könnte ich den aTuner in einem Zweitprojekt so umbauen, dass der Nutzer von der normalen Oberfläche nichts sieht. Das Programm würde aber alle möglichen aTuner-Ressourcen ungenutzt mitsich schleppen. Da das Programm nur mal kurz gestartet würde und sich nicht laufend im System befände, wäre das aber sicher kein Problem.

zeckensack
2004-12-21, 02:01:44
Eine Anleitung wurde bereits im verlinkten Thread gegeben. Ich würde lediglich eineinhalb kleine Änderungen vorschlagen:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4D36E968-E325-11CE-BFC1-08002BE10318}\nnnn\Settings
Jedenfalls ist das der Schlüssel, in dem die interessanten Werte liegen. Alle anderen für den aTuner relevanten Sachen (AA, Aniso etc) sind auch dort. Die Logik um diesen Schlüssel zu identifizieren sollte also bereits vorhanden sein.

In diesem Schlüssel liegen HEX-Werte mit Namen "DALNonStandardModesBCDx". Das x zählt dabei von 1 hoch. Eine jungfräuliche Catalyst 4.12-Installation hat zB die HEX-Werte
DALNonStandardModesBCD1
DALNonStandardModesBCD2
DALNonStandardModesBCD3
DALNonStandardModesBCD4

Diese Werte können (und sollen, in diesem Fall) genutzt werden, um nicht VESA-konforme Modi freizuschalten. Es gibt mehrere Werte, weil jeder einzelne Wert höchstens acht solcher Modi speichern darf.

Jede Auflösung belegt acht Bytes. Pro Auflösung zuerst die Breite in Pixeln (zwei Bytes), dann die Höhe in Pixeln (wieder zwei Bytes), dann zwei Bytes die immer Null sind (?) und danach die Wiederholrate (zwei Bytes). Letztere kann als Null angegeben werden. Der Treiber macht dann irgendwas sinnvolles daraus (dh ich würde für einen solchen Tweak empfehlen, die Wiederholrate auf Null zu setzen).

Die Werte sind BCD-kodiert und "big endian". Hier beispielhaft ein Original-Schlüssel:DALNonStandardModesBCD1
=
07 20 04 80 00 00 00 60
07 20 04 80 00 00 00 75
07 20 04 80 00 00 00 85
07 20 05 76 00 00 00 00
08 48 04 80 00 00 00 60
08 48 04 80 00 00 00 75
08 48 04 80 00 00 00 85
12 80 07 20 00 00 00 60Dies sind HEX-Zahlen, in exakt der Reihenfolge wie sie im "Ändern"-Fenster von Regedit auftauchen. Sie sind wegen der BCD-Kodierung quasi im Klartext lesbar:
Die ersten drei Zeilen schalten die 720x480er-Auflösung frei, und zwar in 60Hz, 75Hz und 85Hz.

Die vierte Zeile schaltet die 720x576er-Auflösung frei. Hier wurde eine Null als Refresh-Rate gesetzt. Trotzdem bietet der Treiber eine Auswahl zwischen 59Hz(!?), 75Hz und 85Hz. Dh dass dies der Beweis sein könnte, dass die Null immer noch zu einer sinnvollen Auswahl an Refresh-Raten führt, und damit ausreichend ist. Mehrere Einträge pro Auflösung für die einzelnen Refresh-Raten scheinen nicht notwendig zu sein.

Die Zeilen fünf bis sieben sorgen für die 848x480er-Auflösung in 60/75/85Hz.
Die achte Zeile erlaubt die 1280x720er-Auflösung in 60Hz. Die Fortsetzung dessen findet sich im Wert "DALNonStandardModesBCD2". Dort geht es mit 1280x720@75/85Hz weiter.

Der erste freie Platz nach Standardinstallation ist im Wert "DALNonStandardModesBCD4". Dort sind nur zwei Auflösungen kodiert, also ist noch Platz für sechs weitere. Allerdings wäre es IMO empfehlenswert, sich nicht darauf zu verlassen. Die Regel ist AFAICS und wie bereits gesagt maximal acht Auflösungen pro Wert.

Es wäre echt fantabulös, wenn du da was drehen könntest :)

aths
2004-12-23, 09:44:52
Es wäre echt fantabulös, wenn du da was drehen könntest :)Ich hab keine Radeon zum testen hier. Je nach dem wie ich über den Jahreswechsel Zeit habe, kann ich trotzdem versuchen, das "blind" zu programmieren (zum Testen den aTuner "denken" lassen, es wäre eine Radeon drin.)

Einige Fragen noch:

- Pro DALNonStandardModesBCDx sind also bereits genau 8x8 Bytes vorhanden?

- Reicht es, wenn DALNonStandardModesBCD4 ausgewertet wird (die letzten 6 gespeicherten Modi)

- Sollen die hinzufügbaren Modi per Zahlenfeld je für Width und Height frei wählbar sein, oder soll angeboten werden, bestimmte Custom Resolutions hinzuzufügen? Oder soll das Tool 1x gestartet werden, welches automatisch 6 Custom Resolutions einfügt?

- aTuner unterstützt nur noch Win2000/XP. Muss das Tool auch unter Win98 laufen? (Die Regkey-Erkennung für Win98 scheint noch drin zu sein, nur müsste die Windowsversionsabfrage beim aTuner-Start raus.)


Falls ich es nicht schaffen sollte, würde es helfen wenn ich schreibe wie aTuner zum Regkey kommt? Wenn mir jemand erklärt wie man mit Delphis DLLs schreibt, könnte man vielleicht auch die Regkey-Erkennung kapseln. Eine Not-Möglichkeit wäre vielleicht auch, den aTuner mittels bestimmtem Parameter zu starten, wobei das Tool dann nur eine Datei auf Platte schreibt, welches den Regkey enthält (und auf Wunsch weitere Infos, die z. B. anhand des PCI-Identifiers in einer Tabelle nachgesehen werden.)

zeckensack
2004-12-23, 16:20:18
Ich hab keine Radeon zum testen hier.Ui, das ist natürlich unvorteilhaft. Ich dachte du hättest die 9600er noch ;(
Je nach dem wie ich über den Jahreswechsel Zeit habe, kann ich trotzdem versuchen, das "blind" zu programmieren (zum Testen den aTuner "denken" lassen, es wäre eine Radeon drin.)

Einige Fragen noch:

- Pro DALNonStandardModesBCDx sind also bereits genau 8x8 Bytes vorhanden?Jein. Ja, denn die Reg-Werte die mit 8 Auflösungen voll belegt sind, haben auch 8*8 Bytes. Nein, denn die Reg-Werte die weniger als 8 Auflösungen kodieren sind kürzer. ZB ist der 4er nur 2*8 Bytes lang, weil nur 2 Auflösungen dort kodiert sind. Der Rest ist leer im Sinne von "nicht vorhanden", und nicht nur mit Nullen aufgefüllt.
- Reicht es, wenn DALNonStandardModesBCD4 ausgewertet wird (die letzten 6 gespeicherten Modi)IMO nicht wirklich ;(
Da könnten schon "neue" Auflösungen drinstehen. ZB bei Usern die Omega-Treiber oä nutzen, und natürlich auch bei Leuten die schon (automatisiert oder von Hand) selbst welche hinzugefügt haben.
Wenn BCD4 voll ist, sollte es mit BCD5 versucht werden usw.
- Sollen die hinzufügbaren Modi per Zahlenfeld je für Width und Height frei wählbar sein, oder soll angeboten werden, bestimmte Custom Resolutions hinzuzufügen? Oder soll das Tool 1x gestartet werden, welches automatisch 6 Custom Resolutions einfügt?Frei wählbar wäre natürlich am besten. Die Funktionsweise des Forceware-CPs finde ich vorbildhaft. Das nachzuahmen sollte das Ziel sein :redface:
Als Sicherheitsmaßnahme sollten sowohl Höhe als auch Breite ganzzahlige Vielfache von 4 sein.
- aTuner unterstützt nur noch Win2000/XP. Muss das Tool auch unter Win98 laufen? (Die Regkey-Erkennung für Win98 scheint noch drin zu sein, nur müsste die Windowsversionsabfrage beim aTuner-Start raus.)Nee, dann lass das lieber bleiben. Ich kann im Moment auch nicht nachprüfen, ob sich da vielleicht in der Zwischenzeit (Cat4.3 => Cat4.7 => Beta-Cat 4.11) irgendwas verändert hat.
Falls ich es nicht schaffen sollte, würde es helfen wenn ich schreibe wie aTuner zum Regkey kommt? Wenn mir jemand erklärt wie man mit Delphis DLLs schreibt, könnte man vielleicht auch die Regkey-Erkennung kapseln. Eine Not-Möglichkeit wäre vielleicht auch, den aTuner mittels bestimmtem Parameter zu starten, wobei das Tool dann nur eine Datei auf Platte schreibt, welches den Regkey enthält (und auf Wunsch weitere Infos, die z. B. anhand des PCI-Identifiers in einer Tabelle nachgesehen werden.)Das würde alles helfen, insbesondere ersteres :)

Ehrlich gesagt hatte ich mich darauf verlassen, dass du noch eine Radeon hast, und du somit selbst hättest testen können. Sonst hätte ich nicht so frech gefragt. Wenn das so nicht geht, muss es eben jemand anders machen. ZB ich ;)

Es ist auch nicht so unglaublich dringend, als dass du deine Weihnachtsferien dafür opfern müsstest. Das hat auch noch Zeit bis nächstes Jahr. Mach dir erst mal ein paar schöne Tage.

aths
2004-12-23, 17:22:00
Ui, das ist natürlich unvorteilhaft. Ich dachte du hättest die 9600er noch ;(Die ist aktuell verliehen und soll verkauft werden, da bei ihr der DVI-Ausgang kaputt ist.

Wenn BCD4 voll ist, sollte es mit BCD5 versucht werden usw.Wenn der 4-er noch nicht voll ist, wird der 5-er dann schon akzeptiert? Muss so ein Programm erkennen, wenn der User mit anderweitigen Tools schon (im 4-er) Auflösungen hinzugefügt hat?

Das würde alles helfen, insbesondere ersteres :)Ich hoffe, dass folgende Anleitung stimmt.

edit: Pustekuchen, jetzt muss ich los. Die ganze Zeit ging drauf, den PC halbwegs stabil zu kriegen – mit Untertaktung scheint das Teil einigermaßen zu laufen. Montag oder Dienstag bin ich wieder da, hoffentlich funktioniert mein PC noch – den brauche ich fürs Studium.

aths
2004-12-28, 18:01:27
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/devcons_2303.asp

Zunächst braucht man EnumDisplayDevices, um das primäre Display zu bestimmen. Hierzu wird diese Structure http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/devcons_6ynm.asp ausgewertet.

Man testet man in den StateFlags das dritte niederwertige Bit. (Kurz, if (StateFlags && 4 == 4), -> primäres Display.) Sofern man (per While-Schleife) beim primären Display ist, könnte man sich via DeviceID den PCI-Identifier besorgen. Den kürzt man am besten auf DEV_xxxx, und legt außerdem die passende .inf des ATI-Treibers in den Pfad. Das Programm könnte die .inf nach allen DEV_xxxx durchnudeln und testen, ob überhaupt eine bekannte ATI-Karte im System ist.

Eine einfachere, wenn auch nicht so sichere Möglichkeit ist, DeviceString auszuwerten (nach dem Substring "RADEON" suchen. Vorher am besten den DeviceString in Großbuchstaben umwandeln.)

Zum Key in der Registry weist DeviceKey. (Wie gesagt, dann auswerten wenn man beim primären Display ist.) Dieser String muss allerdings bearbeitet werden. Dazu muss zunächst die Windows-Version ermittelt werden. http://msdn.microsoft.com/library/default.asp?url=/library/en-us/sysinfo/base/getversionex.asp – aTuner wertet dies wie folgt aus:

if (majorversion=5) or (majorversion=6) then win98:=false else win98:=true;
if (minorversion>0) and (win98=false) then win2000:=false else win2000:=true;

Anhand dieser Variablen wird der Regkeystring, im Folgecode 's', so bearbeitet:

if win98=false then begin
if win2000=false then MainForm.edit1.text:=copy(s,18,2048)
else begin if whereis(ucase(s),'\NV\DEVICE')>1 then MainForm.edit1.text:=copy(s,18,whereis(ucase(s),'\NV\DEVICE')-6);
if whereis(ucase(s),'\ATI2MTAG\DEVICE')>1 then MainForm.edit1.text:=copy(s,18,whereis(ucase(s),'\ATI2MTAG\DEVICE')-1);
end;
end

(Dieser Code ist in der aTuner-Entwicklung so früh geschrieben, dass noch edit1.text genutzt wird anstatt eine Structure. Später wird das in die etwas neuere Statusstructure zurückgelesen, jedenfalls ist edit1.text der Ergebnis-String.)


'whereis' ist eine selbstgeschriebene function, und liefert die Position zurück, an der im String der Teilstring vorkommt. Besonderheit: Kommt der Teilstring mehrfach vor, wird mit whereis die letzte Position (die am weitesten rechts) genommen. In diesem Falle spielt das aber keine Rolle, so dass man auch die function 'pos' bemühen könnte. (Pos verlangt als Parameter jedoch zuerst den Teilstring, und dann den Suchstring.)

'Copy' schneidet einfach einen Substring raus: Ergebnis := copy (String, Startposition, Länge);



Es kann sein, dass für Win95/98/ME eigentlich auch eine Nachbehandlung erforderlich ist und ich den entsprechenden Code bereits gelöscht habe. Dieses Tool http://www.3dcenter.de/atuner/files/Devices08.exe zeigt, (wie aTuner in der Sys-Info auch,) den unverfälschen übergebenen Regkey an. Wahrscheinlich reicht es wenn du dir diesen Key auf einem Win98-System ansiehst um zu erkennen, wie dieser ggf. nachbehandelt werden muss.




Um den Regkey zum CP zu ermitteln, wird es etwas hässlich:

genaticpregkey:=copy(genregkey,whereis(genregkey,'{'),999);
genaticpregkey:=copy(genaticpregkey,1,whereis(genaticpregkey,'}')+1);
genaticpregkey:='\SOFTWARE\ATI Technologies\Desktop\'+genaticpregkey;
genaticpregkey:=copy(genaticpregkey,1,length(genaticpregkey)-1);


Alle Klarheiten sollten jetzt beseitigt sein :)

zeckensack
2004-12-28, 20:57:31
Dankö =)