Я работаю над приложением GPGPU, которое передает данные между процессором и процессором, используя PBO. Одно из требований моего приложения состоит в том, что поток рендеринга OpenGL должен блокировать как можно меньше, а обработка должна иметь как можно меньшую задержку.
У меня вопрос: нужно ли добавить задержку между вызовом glTexSubImage2D (который запускает преобразование с хоста на устройство) и фактическим использованием / рендерингом с текстурой? Насколько большой должна быть такая задержка для текстуры, например размер 1024x1024?
for(auto texture: textures)
{
glBindTexture(GL_TEXTURE_2D, texture.id());
glBindBuffer(GL_PIXEL_UNPACK_BUFFER_ARB, ...);
glBufferData(GL_PIXEL_UNPACK_BUFFER_ARB, ..., NULL, GL_STREAM_DRAW);
void* mem = glMapBuffer(GL_PIXEL_UNPACK_BUFFER_ARB, GL_WRITE_ONLY);
copy(mem, data);
glUnmapBuffer(GL_PIXEL_UNPACK_BUFFER_ARB);
glTexSubImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, 0, 0, ..., NULL);
glBindBuffer(GL_PIXEL_UNPACK_BUFFER_ARB, 0);
glBindTexture(GL_TEXTURE_2D, 0);
}
do_other_cpu_stuff_while_data_is_transferring(); // Is this needed to avoid blocking calls while rendering? If so, what strategy can I use to estimate the minimum amount of time needed to transfer the data.
for(auto texture: textures)
{
render(texture);
}