Como usar um aplicativo OpenGL multithread para atualizar VBOs e usá-los ao mesmo tempo?


11

Eu tenho uma aplicação simples. Ele tem dois threads, cada um com seu próprio contexto de renderização, mas eles compartilham um VBO (isso está funcionando, eu testei).

Agora o que eu quero: Um segmento está processando alguns dados da primeira metade do VBO e o segundo está atualizando a segunda parte do VBO.

Quando não atualizo o VBO, está funcionando bem.

Mas tenho alguns problemas estranhos ao atualizar. Quando uso glMapBufferpara atualizar o VBO (no segundo segmento), no primeiro segmento, na maioria das vezes, ele não processa nada - a tela inteira fica limpa (após uma glClearchamada). Parece que não pode tocar nos dados do VBO (isso é compreensível, porque todo o buffer é mapeado e, portanto, pode ser bloqueado de alguma forma).

Eu tentei usar glMapBufferRange, o que usa GL_MAP_UNSYNCHRONIZED_BIT. Isso deve significar: "não espere e use o VBO como quiser, eu (o programa) o sincronizarei sozinho". Além disso, quando mapeio um intervalo de VBOs e renderizo dados de outra parte, ele não deve estar esperando, mas estou enfrentando os mesmos problemas que tenho glMapBuffer.

Alguém pode me ajudar a corrigir isso ou explicar por que isso acontece?

Respostas:


6

Se alguém estiver interessado neste problema, você pode encontrar uma solução no fórum OpenGL . Basicamente, os buffers não podem ser acessados ​​por dois threads ou contextos simultaneamente, nem para leitura nem gravação. Portanto, std::mutexé necessário um mecanismo de bloqueio como .


Obrigado por apontar para a solução. Eu editei sua resposta para resumir.
319 danijar
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.