Как проверить, завершена ли glBufferData с NULL и не заблокирует ли glMapBuffer? - PullRequest
0 голосов
/ 14 мая 2018

Мне нужно выделить довольно большой буфер (1 GB) для PBO при запуске приложения, и сделать это так:

glBufferData(GL_PIXEL_UNPACK_BUFFER, new_size, 0, GL_STREAM_DRAW);

Мне нужно сопоставить буфер (с glMapBuffer) вскоре после этого, чтобы начать запись данных в него. Проблема в том, что если я позвоню glMapBuffer сразу после glBufferData, , это блокирует , потому что он должен ждать завершения выделения. Таким образом, я хотел бы иметь возможность запросить, может ли glMapBuffer теперь вернуться немедленно или все еще заблокировать, чтобы мое приложение могло сделать что-то еще в это время.

Самое забавное, что объекты-ограждения, похоже, сразу же после вызова glBufferData сигнализируются, поэтому они, кажется, не говорят мне ничего полезного.

Даже если я сделаю

glBufferData(GL_PIXEL_UNPACK_BUFFER, new_size, 0, GL_STREAM_DRAW);
glFinish();
glMapBuffer(GL_PIXEL_UNPACK_BUFFER, GL_WRITE_ONLY);

Звонит glMapBuffer, а не glFinish. То же самое и в glFlush.

Как я узнаю, что буфер, для которого данные не были указаны, завершил выделение и готов к отображению?

1 Ответ

0 голосов
/ 14 мая 2018

Я не могу найти в спецификациях, когда glBufferData может вернуться. Я полагаю, это решение поставщика, основанное на заданных параметрах буфера.

Но я нахожу на OGL 4.6 спец. 6.3 Отображение ... :

Если ошибки не возникает, указатель на начало отображаемого диапазона возвращается после завершения всех ожидающих операций в этом буфере

Поскольку выделение необходимого размера, вероятно, является ожидающей операцией, тогда ЦП будет ждать, пока не вернется glMapBuffer.

Также в спецификации, 2.3.3 Flush and Finish:

Finish не возвращается, пока все эффекты от таких команд на GL состояние клиента и сервера и кадровый буфер полностью реализованы.

Обратите внимание, что он сообщает о состояниях и кадровом буфере, а не о каком-либо другом буфере. Таким образом, glFinish не заставляет ждать, пока будет выделен буфер.


Что бы я сделал в вашем случае, это поместил бы весь процесс создания и инициализации буфера в поток. В этой теме сразу после возврата glMapBuffer отправьте в приложение сообщение (или измените какой-либо флаг), означающее «Указатель на распаковку данных в GPU готов».
Загрузка данных может быть выполнена в другом потоке. Не забудьте установить gl-context как текущий для потока, который вызывает gl-команды.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...