Bienvenue, Invité. Merci de vous connecter ou de vous inscrire.
Avez-vous perdu votre e-mail d'activation ?

Auteur Sujet: Contextes OpenGL "internes" ?  (Lu 1939 fois)

0 Membres et 1 Invité sur ce sujet

Oragon Efreet

  • Newbie
  • *
  • Messages: 4
    • Voir le profil
    • E-mail
Contextes OpenGL "internes" ?
« le: Octobre 09, 2013, 08:24:52 pm »
Bonsoir,

Ce topic concerne une partie des sources de SFML.  :) Je suis très intéressé par le fonctionnement interne de la bibliothèque, dans un but purement pédagogique, et nous trouvons rarement des codes C++ aussi bien structurés que celui-ci ;)

Ainsi, Je sonde les entrailles de SFML-Window afin de comprendre la création et la manipulation de contextes OpenGL sous X, avec GLX. La plupart du travail est effectué entre les classes WindowImpl et GLContext et leurs version Unix.

Dans la classe GLContext, je vois que SFML garde en RAM plusieurs contextes.
  • Un context thread local ;
  • Un contexte partagé partout ;
  • Un contexte interne thread local ;
  • Un ensemble de contextes internes

Histoire de les manipuler de l'un vers l'autre, ce sont tous des pointeurs (ou des sf::ThreadLocalPtr).

De ce que j'ai compris, c'est que si l'application est multi-thread, il faut s'assurer que le contexte créé est local au thread. Si l'application tourne deux threads et que les deux ont besoin d'OpenGL, chaque thread va créer son propre contexte GLX. Ce qui explique le premier pointeur. A la création d'un contexte, on verifiera si la variable est nulle. Si c'est le cas, nous créons un nouveau contexte.

Le contexte partagé partout est moins clair pour moi. Apparement un contexte GLX unique, obligatoirement inactif et lié à une fenêtre cachée, est créé au début de l'application (du moins la première fois qu'un contexte OpenGL est demandé) et détruit à la fin (lorsque nous n'avons plus besoin d'aucun contexte OpenGL). Mais à quoi sert ce partage ? Je vois plus loin dans les sources qu'il est envoyé lors de l'appel à glXCreateContext afin de "partager les display list". Parle-t-on bien des display list de la terminologie OpenGL ? Ça partage seulement ça ou aussi les programmes de shader, les texture objects, VBO, VAO, ... ?

Et enfin, le moins clair pour moi, là, c'est les contextes internes. Je n'arrive pas à comprendre leur utilisation. On a un contexte interne par thread et un ensemble de contextes internes globaux. Je suppose que le contexte interne local au thread est aussi présent dans l'ensemble ? Combien y a-t-il de contexte internes en tout ? Un par thread ?
Tout ce que je vois, c'est que lorsqu'on utilise setActive avec false pour désactiver un contexte, un contexte interne est activé à la place. Est-ce le seul but ?

Si quelqu'un peut m'éclairer sur tout ça; ce serait super :)

En attendant, je félicite Laurent pour le travail remarquable qu'il a fait sur sa bibliothèque ;)

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : Contextes OpenGL "internes" ?
« Réponse #1 le: Octobre 09, 2013, 09:13:55 pm »
Citer
Mais à quoi sert ce partage ? Je vois plus loin dans les sources qu'il est envoyé lors de l'appel à glXCreateContext afin de "partager les display list". Parle-t-on bien des display list de la terminologie OpenGL ? Ça partage seulement ça ou aussi les programmes de shader, les texture objects, VBO, VAO, ... ?
Ca partage les ressources, oui. Textures, VBOs, shaders, mais pas VAO ni PBO par exemple (ce ne sont que des conteneurs de ressources, pas des ressources directes).

Citer
Et enfin, le moins clair pour moi, là, c'est les contextes internes. Je n'arrive pas à comprendre leur utilisation. On a un contexte interne par thread et un ensemble de contextes internes globaux. Je suppose que le contexte interne local au thread est aussi présent dans l'ensemble ? Combien y a-t-il de contexte internes en tout ? Un par thread ?
Tout ce que je vois, c'est que lorsqu'on utilise setActive avec false pour désactiver un contexte, un contexte interne est activé à la place. Est-ce le seul but ?
Oui. Il faut toujours avoir un contexte sous le coude pour ne pas laisser le thread courant "sans contexte", au cas où on aurait besoin d'appels OpenGL.

Mais sinon, je ne te conseille pas de t'attarder sur la gestion des contextes. En voulant à tout prix tout faire automatiquement pour que l'utilisateur ne se soucie de rien, j'ai fini avec un truc assez crade. A ne pas reproduire à la maison ;)
Laurent Gomila - SFML developer

Oragon Efreet

  • Newbie
  • *
  • Messages: 4
    • Voir le profil
    • E-mail
Re : Contextes OpenGL "internes" ?
« Réponse #2 le: Octobre 09, 2013, 09:16:24 pm »
Je vois, merci pour ces indications :)