2015-02-05 5 views
2

벤치마킹 목적으로는 PBO Read-back code을 사용하십시오.PBO가 제대로 작동하지 않습니다. 통합 GPU가 올바르게 작동합니다.

문제 : PBO 내 PC에 아무런 영향이없는되어 사용

  1. . 심지어 최신 드라이버 업데이트 & 올바른 픽셀 형식 BGRA.

업데이트 1 : 나는 또한 3 개의 PBO로 동일한 예를 시도했습니다. 그러나 그때에도 차이점은 없습니다.

참고 : 인텔 (R) 코어 (TM) i5-3470S CPU의 @의 2.90GHz, 2901 MHz의, 4 코어 (들), 비디오 카드 : 인텔 (R) HD 그래픽 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 : 인텔 i-7 시리즈의 외부 GPU &에서도 PBO가 올바르게 작동합니다.

PC가 설정 : 인텔 (R) 코어 (TM) i7-3770 CPU의 @의 3.40GHz, 3400 MHz의, 4 코어 (들), 8 논리 프로세서 (들), 비디오 카드 : 지포스 210은 그래서집니다 out GPU 통합 문제 & 외부 GPU. 나는 이것이 그들의 코드가 왜 작동하지 않는지 궁금해하는 많은 사람들에게 유용한 힌트 일 것이라고 믿는다. link에서

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) 
+0

시도해 봤어을? 나는 공세감을 느끼고 싶지는 않지만 다른 사람들의 능력에 의문을 제기하고있는 것처럼 들리지만 자신의 연구를 기꺼이하지 않을 것입니다. 자신의 벤치 마크가 있다면 추가하십시오. 사실, 이것은 stackoverflow에 다소 적합하지 않기 때문에 벤치 마크에 관한 기사를 작성하고 어딘가에 온라인에 올려 놓은 다음 여기에 인용하십시오. –

+0

@Marcus 여러분은 또한이 질문을 개선하여 더 좋게 만들 수 있습니다! –

+0

별도의 GPU/VRAM과 통합되어있을 가능성이 있습니다. 인텔 GPU에서 매우 가까운 결과를 볼 수 있습니다. 몇 시간 후에 별도의 NVIDIA 카드를 확인합니다. – keltar

답변

1

:

매핑 PBO ... GPU는 여전히 버퍼 오브젝트와 작동하는지, glMapBufferARB()는 GPU 때까지 반환하지 않습니다

참고가 작업을 완료 해당하는 버퍼 개체. 이 스톨 (대기)을 피하려면 glMapBufferARB() 바로 전에 NULL 포인터가있는 glBufferDataARB()를 호출하십시오. 그런 다음 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); 
+0

ok 추가 –

관련 문제