const
cContextActivationFailed = 'Context activation failed: %X, %s';
//...
procedure TGLGTKContext.DoActivate;
begin
if not glXMakeCurrent(CurXDisplay,CurXWindow,FRenderingContext) then
raise EGLContext.Create(cContextActivationFailed);
//...
Im Single-Thread-Modus kommt der Fehler nicht. Ich habe versucht, per Scene und SceneViewer.Enabled:=false das DoActivate zu blockieren, war aber erfolglos. Hat jemand eine Idee?
Edit: Unter XP32bit scheint es zu funktionieren. Obwohl ich mir nicht sicher bin, dass die Virtualbox auch die angegebenen zwei Prozessoren zur Verfügung stellt
Opengl ist nicht multithread-fähig. Wenn Du z.B. zwei verschiedene Fenster aufmachst, dann muss pro Fenster ein separater OpenGL-Rendering Context existieren. Man kann in einer OpenGL Anwendung schon Threads benutzen, zum Beispiel, wenn Daten in den Hauptspeicher geladen werden, können dazu Threads benutzt werden, aber wenn diese Daten dann an Grafikkarte geschickt werden, braucht man OpenGL. Und da muss man wieder in den Thread zurückkehren, in dem der RC erzeugt worden ist.
Man kann zwei RCs zusammenspannen (Stichwort: ""ShareLists"), damit sie auf die gleichen Daten zugreifen können. Aber es erfolgt dabei keine Verschmelzung, der beiden RC's, sie bleiben voneinander getrennt.
Was man also machen kann, ist zwei RC's zu erzeugen, mit wglShareLists (oder dem entsprechenden plattform-Pendant) zusammenzuspannen, dann kann man zwei Threads haben, die beide auf die gleichen Ressourcen (Texturen/Shader/VBO's) zugreifen können.
Das Repaint wird vom Hauptthread ausgeführt, mein Multithreading ist davon komplett getrennt und macht (kaum) etwas dort. Unter Windows (getestet mit XP in einer Virtualbox) kann ich während des Multithreadings die Szene ändern (zoomen) unter Linux nicht. Eigentlich würde ich gern wissen, wie ich DoActivate() verhindere, dann käme die Fehlermeldung nicht mehr. Mal abgesehen von Visible:=false
Ich habe Google angeworfen und gesucht, aber ich habe keinen ähnlichen Fehler gefunden.
Leider bin ich mit GLScene nicht vertraut.
Ist es Dir möglich dort zu debuggen? Wenn ja, würde ich Folgendes machen:
Dort, wo der Rendering Context erzeugt wird, mir die Werte von CurXDisplay,CurXWindow,FRenderingContext notieren und mit den Werten von CurXDisplay,CurXWindow,FRenderingContext vergleichen, wo das Problem auftritt. Diese Werte müssen ganz gleich sein, sonst klappt das Aktivieren nicht.
Verhindern würde ich das Aktivieren des Kontextes dort nicht. Wenn man Delphi oder Lazarus verwendet, hat man automatisch eine Multi-Window-Anwendung, und jedes Fenster hat seinen eigenen Thread. Daher ist es wichtig, den RC wieder herzustellen, wenn wieder ein OpenGL-Rendervorgang beginnt.
Im singlethread-Modus läuft alles (es gibt nur einen Thread und IMHO zeichnet glscene bei Idle). Auch gezeichnet wird unter Multithreading auch, aber sobald ich etwas verändere, gibt es eine Fehlermeldung. Einfach weg klicken geht