Bonjour à vous.
Après une après-midi de recherches et de tests infructueux, je me tourne vers vous pour tenter de régler un problème.
Mise en situation : Je créer un moteur de rendu avec OpenGL en C++ pour Windows.
Je créer moi même mon context OpenGL ainsi que ma fenêtre. Je gère tout à la main, pas de SDL pas de SFML, donc ne me dites pas d'utiliser une de ces bibliothèques ce n'est pas ce que je recherche.
Pour l'input, je gère les messages en provenance de la fenêtre ( clavier/souris ) ainsi qu'une pile de message interne au moteur.
Je vérifie les messages de la fenêtre à chaque tour de boucle de rendu.
J'ai donc une Classe Input_Manager qui gère ces entrées.
Il est possible de lancer ce manager dans deux mode : Synchrone ( les inputs sont traitées directement dans le thread de rendu ) ou Asynchrone ( les inputs sont traitées dans des threads séparés ( un pour les messages internes, un pour le clavier et un pour la souris ).
Le Input est sencé servir à initialiser les menus et à les donner une fois préparer au renderer qui les affiches ( c'est un peu plus compliqué que ça mais globalement ça se résume à ça ).
Le mode asynchrone sert donc à ne pas bloquer la boucle de rendu pendant l'initialisation d'un menu/scène qui comporte donc le chargement de ressources, etc...
Pour ce qui est des threads du mode asynchrone, ils disposent chacun d'un context opengl qui leur permet d'appeler des commandes gl.
En ce qui concerne la création de context, on initialise dans un premier temps un context global qui sert de référence pour les autres. Enfin, chaque context créer après est partagé avec le context global ( ce qui permet que tous les contexts créés soient liés les uns aux autres ).
Comme sujet de test, je créer un VBO, un shader, un IBO et une texture.
Le but étant simplement d'afficher une image en 600x600 dans une fenêtre de la même taille.
Je dispose de deux cartes graphique ( une créant obligatoirement un context opengl 3.0 ) et une qui dispose de opengl 4.2.
TOUT se passe correctement et l'image s'affiche dans la fenêtre tant que je reste en mode synchrone avec les deux cartes graphique.
Le problème vient du mode asynchrone. Il fonctionne correctement avec la carte graphique disposant d'opengl 3.0, mais la carte en 4.2 n'affiche strictement rien même si elle ne lève aucune erreur opengl.
Tout semble fonctionner correctement, mais la fenêtre est désespérément noire.
Je ne vois plus d'où peut provenir le problème étant donné que la texture ( comme toutes les ressources cités plus haut ) est créer dans le thread de gestion des messages internes mais le thread de rendu réussit tout de même à en récupérer les données afin de l'écrire dans un fichier.
J'en déduis donc que le partage est un succès entre les contexts.
En fait je suis à cours d'idée pour testé plus de chose... j'ai tenté de mettre des récupérations d'erreur opengl un peu partout, aucune erreur n'est levée.
Si vous aviez une piste suplémentaire que je puisse explorer, un truc que j'ai raté sur opengl 4.2 qui change quelques choses dans le partage de context...
Merci de votre aide.
exkise
Edit : J'ai aussi testé en désactivant l'affichage de la texture, simplement la couleur, ca ne marche pas plus.
Edit 2 : Un test supplémentaire m'a permis d'isoler le problème au VBO et IBO ( buffer object ). Je continue mes recherches pour tenter d'isoler la fonction qui pose problème.
Partager