2016-09-01 1 views
0

glClientWaitSync 기능을 사용하여 오해가 있습니다. 펜싱과의 동기화

내가 그 같은 것을 사용하고 인정 :

glDraw(...); 
sync = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0); 
glDraw(...); 
glClientWaitSync(sync, GL_SYNC_FLUSH_COMMANDS_BIT, 1000000000); 
glDeleteSync(sync); 

내가 잘 OpenGL을 위키를 이해한다면, 우리는 이가지 경우

첫 번째 경우 : OpenGL을 4.5 :이 경우, glClientWaitSync 후에, 우리는 위키에 쓰기 때문에 첫 번째 그리기 만 수행됩니다.

OpenGL 4.5에서는이 플러시가 특별하게 이루어집니다. 처음으로 특정 동기화 객체를 기다리고 있고 동기화 객체를 만든 것과 동일한 컨텍스트에 대기 시간이있는 경우 플러시는 동기화 객체 바로 다음에 실행 한 것처럼 동작합니다. 따라서 동기화 객체를 만든 후에 다른 OpenGL 명령을 실행 한 경우 플러시되지 않습니다.

두 번째 경우 : OpenGL 4.4 또는 하위 :이 함수는 glFlush 함수와 "전역 적으로"동일한 동작을하기 때문에 두 그리기가 모두 수행되었음을 확신 할 수 있습니까? 그런 식으로 모든 명령 버퍼가 플러시 된 경우 OpenGL 4.4에서 라운드 로빈 방식을 사용하여 영구 매핑을 실제로 사용하는 방법은 무엇입니까?

답변

1

"Flush"은 "완료되었습니다"는 의미가 아닙니다. 이는 단순히 "GPU에 의해 실행될 것이며 OpenGL의 추가 호출 없이는"의미 할뿐입니다.

4.4 동작은 glClientWaitSync 명령까지 모든 내용을 플러시합니다. 4.5 동작은 glFenceSync 호출까지 모든 것을 플러시합니다. 시간 초과 또는 erroring없이

그러나 두 경우 모두

, glClientWaitSync 경우 반환, 당신은 GPU의 상태에 대해 알고 유일한 것은 glFenceSync 호출하기 전에 모든 명령이 완료 한 것입니다.

그런 식으로 모든 명령 버퍼가 플러시 된 경우 OpenGL 4.4에서 라운드 로빈 방식을 사용하여 영구 매핑을 실제로 사용하는 방법은 무엇입니까?

울타리 동기화를 그냥 플러시하려면 4.4에서 수행해야합니다. 즉 울타리를 만든 직후 glFlush이지만, glClientWaitSync을 사용할 때는 플러시하지 마십시오. 이것은 당신에게 4.5 행동의 효과를 줄 것입니다.

+0

그래서 잘 이해했다면, 4.4 패션으로 플러시를하는 것은 펜스가 끝나기 전에 모든 명령이 끝나고 어떤 것이 시작될지를 보장 할 것입니다. 4.5 방법으로, 이후의 것들은 의무적으로 시작할 필요가 없습니까? –