Мне интересно, могу ли я поймать событие vsync на экране любым файловым дескриптором и [select | опрос | Эволюция.Событие GLX Vsync
Обычно, если я прав, glXSwapBuffers() не блокирует процесс, так что я мог бы сделать что-то вроде:
int init() {
create epollfd;
add Xconnection number to it;
add some other fd like socket timer tty etc...
possibly add a vsync fd like dri/card0 or fb0 or other???
return epollfd;
}
main() {
int run = 1;
int epollfd = init();
while(run) {
epoll_wait(epollfd, ...) {
if(trigedfd = socket) {
do network computing;
}
if(trigedfd = timer) {
do physics computing;
}
if(trigedfd = tty) {
do electronic communications;
}
if(trigedfd = Xconnection number) {
switch(Xevent) {
case key event:
do key computing;
case mouse event:
do mouse computing;
case vsync???:
do GL computings;
glXSwapBuffers();
}
}
if(trigedfd = dri/card0 or fb0 or other???) {
do GL computings;
glXSwapBuffers();
}
}
}
Так что я мог тогда я мог бы аккуратный любое событие, независимо, когда VSync событие произойдет и избегайте эффекта разрыва в тот же момент, когда я использую только функцию рисования X и, возможно, GL для vsync.
Может ли libdrm помочь мне? тем более общий вопрос:
Так что же мне нужно использовать, чтобы поймать событие vsync и как сделать shure на этом fd, что событие, которое произошло, - это событие vsync?
Обратите внимание, что я хочу сделать это monothreaded. Я мог бы сделать отдельный процесс, который будет действовать как сервер, к которому я мог бы подключиться, и отправить запрос «разбудить меня, когда произошел vsync», этот процесс может блокироваться на glFinish, а затем отправлять что-то через сокет или канал или что угодно, я бы избегайте этого. –
Почему именно вы этого хотите? Это может быть случай [проблема XY] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)? – davmac
Я создаю свою собственную библиотеку/api, я хочу иметь только одну точку синхронизации для всех входящих событий процесса. –