DGL
https://delphigl.com/forum/

[Header] dglOpenGL und 64bit Linux+FPC Bug?
https://delphigl.com/forum/viewtopic.php?f=21&t=6766
Seite 1 von 1

Autor:  Kyro [ So Jul 22, 2007 14:38 ]
Betreff des Beitrags:  [Header] dglOpenGL und 64bit Linux+FPC Bug?

Hiho,

Ein relativ simples Problem: InitOpenGL liefert eine Access Violation. Den Grund kenne ich denke ich auch: in GetProcAddress wird ein THandle zu einem Pointer gecastet. Ich selbst bin schon darüber gestolpert, einen Pointer durch casten nach Integer hochzuzählen und danach Exceptions zu kassieren. Das lag daran, dass die Pointer zumindest im 64bit-FPC eine Größe von 64bit statt 32bit haben, und somit eine ganze Menge beim Casten und Rückcasten abgeschnitten wurde.

Beim Zurückverfolgen ende ich bei der Funktion LoadLibrary. Sie ruft die externe Funktion LoadLibrary auf, die als Rückgabewert einen Pointer hat. Diesen Pointer castet sie zu THandle (Bingo :) ). Meine erste provisorische Lösung für das Problem ist relativ einfach: anstatt THandle aus System zu ziehen, habe ich THandle im Type-Block der dglOpenGL einfach als Int64 deklariert, was auch (bis jetzt) funktioniert.

mfg Sebastian

edit: Nochwas: glGetString(GL_VERSION) scheint nicht zu funktionieren - Kommt ein leerer String zurück. Und in TrimAndSplitVersionString ruft dieses Abort eine Exception hervor. Hab das jetzt erstmal auskommentiert. Und nicht nur, dass diese schicken Extension-Bools nicht zugewiesen werden - zumindest glMapBufferARB gibt mir den glError "Invalid Operation" (Code hat unter Windows einwandfrei funktioniert).

Autor:  Lossy eX [ So Jul 22, 2007 18:39 ]
Betreff des Beitrags: 

Hallo Sebastian,

ich kenne mich mit 64 Bit System gar nicht aus aber theoretisch müssten ja dann alle Pointer 64 Bit groß sein. Und Int64 funktioniert dort ja eigentlich auch nur bedingt. Weil ein Int hat immer noch ein Vorzeichen wärend ein Pointer ja keines hat. Beim einfachen Weiterreichen ist das kein Problem. Delphi an sich kann auch gar keine vorzeichenlose 64 Bit Werte.

Das Problem würde ja unter Windows genau so bestehen wie jetzt unter Linux. Ich werde mich die Tage mal schlau machen, ob ich dazu in den MSDNs etwas finden kann. Und wenn ich es dann geschafft habe die Methoden anzupassen darfst du 64 Bit Versuchskaninchen spielen. ;)

Gibt es eigentlich ein Define was vom Compiler her gesetzt ist wenn es sich um ein 64 Bit System handelt?


glGetString(GL_VERSION): Also eine leere Version ist eigentlich nicht erlaubt oder zu mindest sehr suspekt. Ist zu dem Zeitpunkt denn OpenGL schon richtig initialisiert/aktiviert worden? Denn ansonsten kannst du natürlich keine Version abfragen. Oder was war das denn für ein Treiber?

Warum glMapBufferARB nicht geht darüber kann ich nicht mal spekulieren.

Autor:  LarsMiddendorf [ So Jul 22, 2007 18:52 ]
Betreff des Beitrags: 

Die Handles sind bei 64-Bit aber auch 64-Bit groß. Sind ja teilweise Zeiger. Daher müßte THandle eigentlich in den FP Units umdefiniert werden.

Autor:  Kyro [ So Jul 22, 2007 20:57 ]
Betreff des Beitrags: 

So hab mich mal ein bischen "umgeschaut".

1. Soweit ich das bisher gesehn habe, sind alle Pointer 64bit-Zahlen.
2. Das 64bit-Versuchskaninchen spiele ich doch gerne :)
3. Bei mir ist ein "cpux86_64" gesetzt. Ob das jetzt nur speziell von FPC kommt weiß ich nicht - das Equivalent ist "cpui386", müsstet ihr unter Delphi mal testen.
4. Habe die aktuellsten stable-Treiber von nvidia, v97.55. In diesem nvidia-settings teil sind auf jeden fall alle extensions usw. aufgelistet - muss aber ja nicht unbedingt was heißen.
5. Initialisation in der Reihenfolge: InitOpenGL; ReadExtensions; ReadImplemetationProperties. Die letzten beiden habe ich auch schonmal vertauscht. Im Prinzip sogar mehr, als ich sonst immer gemacht hab.
6. Habe mal die Definition von THandle zurückverfolgt. Ich komme bis zu einer IncludeDatei von system.pp. Dort wird es als THandle = System.THandle definiert. in system.pp selbst ist keine Definition von THandle. Wo das also genau herkommt weiß ich nicht. Muss also nicht unbedingt seitens FP fehlerhaft sein. Ich muss mir mal Kylix zum Vergleich zulegen.

Ein THandle generell als Int64 zu definieren ist natürlich auch nicht das wahre. Statt den Umweg über die Compilerdirektiven könnte man (wenn man so ne Extra-Definition macht) THandle vllt. auch direkt als Pointer deklarieren? dann würde es sozusagen automatisch von 32 auf 64bit wechseln...

Autor:  Kyro [ Di Jul 24, 2007 12:34 ]
Betreff des Beitrags: 

Ich habs ganz vergessen zu sagen:

Ich erstelle den RenderContext nicht mit dglOpenGL (sowas wie CreateRenderingContext usw. gibts ja nur für Windows), sondern mit einer vorgefertigten Klasse in der LCL über GTK1. Ich denke nicht unbedingt, dass das was bzgl. der Fehler bei glMapBufferARB usw. zu sagen hat, aber kann ja nicht schaden, das mal zu erwähnen.

BTW: Wer einen besseren Weg (vllt. sogar über den dgl-Header) zum erstellen eines Renderingcontextes weiß, bitte mir per PM mitteilen - so bin ich nämlich auf die hässliche GTK1-Anbindung beschränkt... Danke.

Autor:  TAK2004 [ Do Aug 09, 2007 12:18 ]
Betreff des Beitrags: 

Guck mal ins fpc dort ist bei demos/opengl ein linux beispiel für x11 drin.
Das ist ziemlich einfach und ich baue momentan die dglgui weiter aus und habe schon mit hilfe der demo ein cross fenster system realisiert.

Zu den pointer ist noch folgendes zu sagen, du solltest sowas ähnliches wie folgendes nutzen.
http://delphi.wikia.com/wiki/FreePascal_detection_and_versioning

Autor:  Kyro [ Sa Sep 08, 2007 00:34 ]
Betreff des Beitrags: 

Zumindest kann ich schonmal teilweise Entwarnung geben:

Mit FPC 2.0.4 habe ich KEINERLEI Probleme. Man muss auch dazu sagen, dass 2.1.5 eine Beta ist, trotzdem sollte man mal beim nächsten stable-Release von FPC drauf achten.

edit:
Mir fällt jetzt erst auf, dass ich noch garnichts davon gesagt hab, das ich FPC 2.1.5 verwendet hab. Trotz alledem bleibt es dabei - mal aufs nächste Release schauen.

Seite 1 von 1 Alle Zeiten sind UTC + 1 Stunde
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/