PBO не работает должным образом в интегрированном графическом процессоре

Для целей бенчмаркинга давайте возьмем этот известный код повторного чтения PBO.

Проблема:

  1. Использование PBO не имеет никакого эффекта на моем компьютере. Даже с последним обновлением драйверов и правильным форматом пикселей BGRA.

Обновление 1: я также попробовал тот же пример с 3 PBO. Но нет никакой разницы даже тогда.

ПРИМЕЧАНИЕ. Процессор Intel® Core i5-3470S с частотой 2,90 ГГц, 2901 МГц, 4 ядра (-ей), видеокарта:Intel(R) HD Graphics 2500

PBO: off  
Read Time: 9 ms
Process Time: 2 ms
Transfer Rate: 39.5 Mpixels/s. (45.0 FPS)

PBO: on 
Read Time: 7 ms
Process Time: 2 ms
PBO: on Transfer Rate: 38.8 Mpixels/s. (44.2 FPS)

ОБНОВЛЕНИЕ 2: PBO работает правильно во внешнем графическом процессоре, а также в серии Intel i-7.

Конфигурация ПК:Intel® R Core(TM) i7-3770 CPU @ 3,40 ГГц, 3400 МГц, 4 ядра (-ей), 8 логических процессоров, видеокарта: Geforce 210. Таким образом, возникает проблема с Интегрированный графический процессор и внешний графический процессор. Я считаю, что это будет полезный совет для многих людей, которые задаются вопросом, почему их код не работает!

PBO: on 
PBO: on Read Time: 0.06 ms
Process Time: 2 ms
Transfer Rate: 112.4 Mpixels/s. (127.9 FPS)

PBO: off 
Read Time: 4 ms
Process Time: 2 ms
Transfer Rate: 93.3 Mpixels/s. (106.1 FPS)

1 ответ

В ссылке:

Картографирование ПБО...

Обратите внимание, что если графический процессор все еще работает с буферным объектом, glMapBufferARB() не вернется, пока графический процессор не завершит свою работу с соответствующим буферным объектом. Чтобы избежать этой задержки (wait), вызовите glBufferDataARB() с указателем NULL прямо перед glMapBufferARB(). Затем OpenGL отбросит старый буфер и выделит новое пространство памяти для объекта буфера.

Возможно, вам придется применить предложенное выше изменение к приведенному ниже коду:

// "index" is used to read pixels from framebuffer to a PBO
// "nextIndex" is used to update pixels in the other PBO
index = (index + 1) % 2;
nextIndex = (index + 1) % 2;

// set the target framebuffer to read
glReadBuffer(GL_FRONT);

// read pixels from framebuffer to PBO
// glReadPixels() should return immediately.
glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, pboIds[index]);
glReadPixels(0, 0, WIDTH, HEIGHT, GL_BGRA, GL_UNSIGNED_BYTE, 0);

// map the PBO to process its data by CPU
glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, pboIds[nextIndex]);
glBufferDataARB(GL_PIXEL_PACK_BUFFER_ARB, 0, NULL, GL_STATIC_DRAW_ARB);
GLubyte* ptr = (GLubyte*)glMapBufferARB(GL_PIXEL_PACK_BUFFER_ARB,
                                        GL_READ_ONLY_ARB);
if(ptr)
{
    processPixels(ptr, ...);
    glUnmapBufferARB(GL_PIXEL_PACK_BUFFER_ARB);
}

// back to conventional pixel operation
glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, 0);
Другие вопросы по тегам