Comment utiliser une application OpenGL multi-thread pour mettre à jour les VBO et les utiliser en même temps?

11

J'ai une application simple. Il a deux threads, chacun avec son propre contexte de rendu, mais ils partagent un VBO (cela fonctionne, je l'ai testé).

Maintenant, ce que je veux: un thread rend certaines données de la première moitié du VBO et le deuxième thread met à jour la deuxième partie du VBO.

Quand je ne mets pas à jour le VBO, ça fonctionne bien.

Mais j'ai des problèmes étranges lors de la mise à jour. Lorsque j'utilise glMapBufferpour mettre à jour le VBO (dans le deuxième fil), dans le premier fil, la plupart du temps, cela ne rend rien - tout l'écran est clair (après un glClearappel). Il semble qu'il ne puisse pas toucher aux données du VBO (cela est compréhensible, car tout le tampon est mappé et peut donc être verrouillé d'une manière ou d'une autre).

J'ai essayé d'utiliser glMapBufferRange, qui utilise GL_MAP_UNSYNCHRONIZED_BIT. Cela devrait signifier "n'attendez pas et utilisez le VBO comme vous le souhaitez, je (le programme) le synchroniserai par moi-même". De plus, lorsque je mappe une gamme de VBO et rend des données d'une autre partie, cela ne devrait pas attendre, mais je rencontre les mêmes problèmes que moi glMapBuffer.

Quelqu'un peut-il m'aider à résoudre ce problème ou à expliquer pourquoi cela se produit?

zacharmarz
la source

Réponses:

6

Si quelqu'un est intéressé par ce problème, vous pouvez trouver une solution sur le forum OpenGL . Fondamentalement, les tampons ne sont pas accessibles par deux threads ou contextes simultanément, ni pour la lecture ni pour l'écriture. Par conséquent, un mécanisme de verrouillage similaire std::mutexest nécessaire.

zacharmarz
la source
Merci d'avoir indiqué la solution. J'ai édité votre réponse pour la résumer.
danijar