"Context activation failed" bei Glscene und Multithreading

Rund um die LCL und andere Komponenten
Antworten
Scotty
Beiträge: 768
Registriert: Mo 4. Mai 2009, 13:24
OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4
CPU-Target: x86_64-linux-qt/gtk2
Kontaktdaten:

"Context activation failed" bei Glscene und Multithreading

Beitrag von Scotty »

Wenn ich irgendwas an der Szene ändere, auch Zoomen oder Rotieren, dann kommt dieser Fehler. In den Sourcen steht unter GLLinGTKContext.pas

Code: Alles auswählen

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 :roll:

Traude
Beiträge: 29
Registriert: Mo 18. Aug 2008, 11:59
OS, Lazarus, FPC: Ubuntu 8.04 + XP SP2 DualBoot, Lazarus 0.9.28, FPC 2.2.4
CPU-Target: 32Bit
Wohnort: Wien

Re: "Context activation failed" bei Glscene und Multithreading

Beitrag von Traude »

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.

Viele Grüße,
Traude

Scotty
Beiträge: 768
Registriert: Mo 4. Mai 2009, 13:24
OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4
CPU-Target: x86_64-linux-qt/gtk2
Kontaktdaten:

Re: "Context activation failed" bei Glscene und Multithreading

Beitrag von Scotty »

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 :D

Traude
Beiträge: 29
Registriert: Mo 18. Aug 2008, 11:59
OS, Lazarus, FPC: Ubuntu 8.04 + XP SP2 DualBoot, Lazarus 0.9.28, FPC 2.2.4
CPU-Target: 32Bit
Wohnort: Wien

Re: "Context activation failed" bei Glscene und Multithreading

Beitrag von Traude »

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.

Sorry, aber viel mehr fällt mir dazu nicht ein.

Scotty
Beiträge: 768
Registriert: Mo 4. Mai 2009, 13:24
OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4
CPU-Target: x86_64-linux-qt/gtk2
Kontaktdaten:

Re: "Context activation failed" bei Glscene und Multithreading

Beitrag von Scotty »

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 :roll:

Scotty
Beiträge: 768
Registriert: Mo 4. Mai 2009, 13:24
OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4
CPU-Target: x86_64-linux-qt/gtk2
Kontaktdaten:

Re: "Context activation failed" bei Glscene und Multithreading

Beitrag von Scotty »

http://bugs.freepascal.org/view.php?id=14391" onclick="window.open(this.href);return false;

Antworten