Jak korzystać z wielowątkowej aplikacji OpenGL, aby aktualizować VBO i używać ich jednocześnie?

11

Mam prostą aplikację. Ma dwa wątki, każdy z własnym kontekstem renderowania, ale mają one jeden VBO (to działa, przetestowałem to).

Teraz chcę: jeden wątek wyświetla niektóre dane z pierwszej połowy VBO, a drugi wątek aktualizuje drugą część VBO.

Kiedy nie aktualizuję VBO, działa dobrze.

Ale mam kilka dziwnych problemów podczas aktualizacji. Kiedy używam glMapBufferdo aktualizacji VBO (w drugim wątku), w pierwszym wątku przez większość czasu nic nie renderuje - cały ekran jest czysty (po glClearwywołaniu). Wygląda na to, że nie może dotknąć danych z VBO (jest to zrozumiałe, ponieważ cały bufor jest zmapowany, więc można go jakoś zablokować).

Próbowałem użyć glMapBufferRange, który wykorzystuje GL_MAP_UNSYNCHRONIZED_BIT. Powinno to oznaczać: „nie czekaj i używaj VBO tak, jak chcesz, ja (program) zsynchronizuję go sam”. Ponadto, kiedy mapuję zakres VBO i renderuję dane z innej części, nie powinno to czekać, ale mam te same problemy, co ja glMapBuffer.

Czy ktoś może mi pomóc to naprawić lub wyjaśnić, dlaczego tak się dzieje?

zacharmarz
źródło

Odpowiedzi:

6

Jeśli ktoś jest zainteresowany tym problemem, możesz znaleźć rozwiązanie na forum OpenGL . Zasadniczo do buforów nie można uzyskać dostępu przez dwa wątki lub konteksty jednocześnie, ani do odczytu, ani do pisania. Dlatego std::mutexpotrzebny jest podobny mechanizm blokujący .

zacharmarz
źródło
Dziękujemy za wskazanie rozwiązania. Zredagowałem twoją odpowiedź, aby ją streścić.
danijar