Странности загрузки текстур OpenGL PBO

Я основываю свои тесты на этом популярном примере PBO (см. PboUnpack.zip из http://www.songho.ca/opengl/gl_pbo.html). Тесты проводятся в режиме PBO 1 в соответствии с примером.

Запустив оригинальный образец, я обнаружил, что на моем NVIDIA 560GTX PCIe x16 (драйвер v334.89 Win7 PRO x64 Core i5 Ivy Bridge 3,6 ГГц), glMapBufferARB() блоки на 15 мс, даже когда glBufferDataARB() Предшествующее было предназначено для предотвращения его блокирования (то есть отменить PBO).

Затем я изменил размер изображения с исходного 1024 * 1024 на 400 * 400, полагая, что это сократит время блокировки. К моему удивлению, он остался на 15 мс! Загрузка процессора оставалась высокой.

Продолжая эксперименты, я увеличил размер изображения до 4000 * 4000, и снова удивился — glBufferDataARB сократился с 15 мс до 0,1 мс, а загрузка ЦП в то же время значительно снизилась.

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

Код интереса:

// bind PBO to update pixel values
glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, pboIds[nextIndex]);

// map the buffer object into client's memory
// Note that glMapBufferARB() causes sync issue.
// If GPU is working with this buffer, glMapBufferARB() will wait(stall)
// for GPU to finish its job. To avoid waiting (stall), you can call
// first glBufferDataARB() with NULL pointer before glMapBufferARB().
// If you do that, the previous data in PBO will be discarded and
// glMapBufferARB() returns a new allocated pointer immediately
// even if GPU is still working with the previous data.
glBufferDataARB(GL_PIXEL_UNPACK_BUFFER_ARB, DATA_SIZE, 0, GL_STREAM_DRAW_ARB);
GLubyte* ptr = (GLubyte*)glMapBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, GL_WRITE_ONLY_ARB);
if(ptr)
{
// update data directly on the mapped buffer
updatePixels(ptr, DATA_SIZE);
glUnmapBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB); // release pointer to mapping buffer
}

1

Решение

Задача ещё не решена.

Другие решения


По вопросам рекламы [email protected]