¿Cómo usar una aplicación OpenGL multihilo para actualizar VBO y usarlos al mismo tiempo?

11

Tengo una aplicación simple. Tiene dos hilos, cada uno con su propio contexto de representación, pero comparten un VBO (esto está funcionando, lo probé).

Ahora lo que quiero: un hilo está procesando algunos datos de la primera mitad del VBO y el segundo hilo está actualizando la segunda parte del VBO.

Cuando no actualizo el VBO, funciona bien.

Pero tengo algunos problemas extraños al actualizar. Cuando uso glMapBufferpara actualizar el VBO (en el segundo hilo), en el primer hilo, la mayoría de las veces, no muestra nada: toda la pantalla está clara (después de una glClearllamada). Parece que no puede tocar los datos del VBO (esto es comprensible, porque todo el búfer está asignado y, por lo tanto, puede bloquearse de alguna manera).

Traté de usar glMapBufferRange, que usa GL_MAP_UNSYNCHRONIZED_BIT. Esto debería significar, "no esperes y usa el VBO como quieras, yo (el programa) lo sincronizaré por mí mismo". Además, cuando mapeo un rango de VBO y renderizo datos de otra parte, no debería estar esperando, pero estoy experimentando los mismos problemas que tengo glMapBuffer.

¿Alguien puede ayudarme a arreglar esto o explicar por qué sucede?

zacharmarz
fuente

Respuestas:

6

Si alguien está interesado en este problema, puede encontrar una solución en el foro OpenGL . Básicamente, dos hilos o contextos no pueden acceder a los buffers simultáneamente, ni para leer ni para escribir. Por lo tanto, std::mutexse necesita un mecanismo de bloqueo como .

zacharmarz
fuente
Gracias por señalar la solución. Edité tu respuesta para resumirla.
danijar