1
Fenêtrage / 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.
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
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