Bagaimana cara menggunakan aplikasi OpenGL multi-utas untuk memperbarui VBO dan menggunakannya secara bersamaan?

11

Saya punya aplikasi sederhana. Ini memiliki dua utas, masing-masing dengan konteks render sendiri, tetapi mereka berbagi satu VBO (ini berfungsi, saya mengujinya).

Sekarang yang saya inginkan: Satu utas membuat beberapa data dari paruh pertama VBO dan utas kedua memperbarui bagian kedua VBO.

Ketika saya tidak memperbarui VBO, itu berfungsi dengan baik.

Tapi saya punya beberapa masalah aneh saat memperbarui. Ketika saya gunakan glMapBufferuntuk memperbarui VBO (di utas kedua), di utas pertama, sebagian besar waktu, itu membuat apa-apa - seluruh layar jelas (setelah glClearpanggilan). Sepertinya tidak bisa menyentuh data dari VBO (ini bisa dimengerti, karena seluruh buffer dipetakan dan entah bagaimana bisa dikunci).

Saya mencoba menggunakan glMapBufferRange, yang menggunakan GL_MAP_UNSYNCHRONIZED_BIT. Ini harus berarti, "jangan menunggu dan menggunakan VBO seperti yang Anda inginkan, saya (program) akan menyinkronkannya sendiri". Juga, ketika saya memetakan berbagai VBO dan membuat data dari bagian lain, itu seharusnya tidak menunggu, tapi saya mengalami masalah yang sama dengan saya glMapBuffer.

Adakah yang bisa membantu saya memperbaiki ini atau menjelaskan mengapa itu terjadi?

zacharmarz
sumber

Jawaban:

6

Jika seseorang tertarik dengan masalah ini, Anda dapat menemukan solusinya di forum OpenGL . Pada dasarnya, buffer tidak dapat diakses oleh dua utas atau konteks secara bersamaan, baik untuk membaca maupun menulis. Karena itu, diperlukan mekanisme penguncian seperti std::mutex.

zacharmarz
sumber
Terima kasih telah menunjukkan solusinya. Saya mengedit jawaban Anda untuk meringkasnya.
danijar