Xlib / egl comment obtenir VSync/swapInterval sur eglSwapBuffers

je me demande comment activer correctement vsync avec eglSwapBuffers en utilisant xlib. Il semble que les appels à eglSwapInterval soient tout simplement ignorés.

j'exécute à la fois en mode fenêtré et plein écran. Est-il possible qu'il ne soit tout simplement pas supporté en mode fenêtré? Dans ce cas, quelle est la bonne façon de réduire la fréquence à laquelle je rends (le sommeil tend à causer un comportement errant car il n'y a aucune garantie quand il se réveille).

0
demandé sur edA-qa mort-ora-y 2012-08-15 19:09:16

1 réponses

finalement j'ai trouvé ceci après beaucoup de googling:

http://lists.freedesktop.org/archives/mesa-commit/2010-May/021020.html

egl: Implement EGL_NOK_swap_region

cette extension ajoute une nouvelle fonction qui offre une alternative à eglSwapBuffers. eglSwapBuffersRegionNOK accepte deux nouveaux paramètres dans en plus de ceux de eglSwapBuffers. Les nouveaux paramètres composé d'un pointer vers une liste de blocs de 4 entiers définissant des rectangles (x, y, largeur, hauteur) et un entier spécifiant le nombre de rectangles liste.

et/usr/include/EGL / eglmesaext.h déclare

EGLAPI EGLBoolean EGLAPIENTRY eglSwapBuffersRegionNOK(EGLDisplay dpy, EGLSurface surface, EGLint numRects, const EGLint* rects);

il y a aussi un exemple d'usage ici:

https://github.com/blazt/piglit/blob/master/tests/egl/egl-nok-swap-region.c

alors j'ai essayé en l'utilisant comme ceci:

EGLint dirtyRect[4] = { 0, 0, 0, 0 };
PFNEGLSWAPBUFFERSREGIONNOK swap_buffers_region = (PFNEGLSWAPBUFFERSREGIONNOK)
    eglGetProcAddress("eglSwapBuffersRegionNOK");

et dans mon redimensionnement de la fenêtre de rappel

dirtyRect[2] = windowWidth;
dirtyRect[3] = windowHeight;

et dans ma boucle principale

if (swap_buffers_region)
    swap_buffers_region(egl_dpy, egl_surf, 1, dirtyRect);
else
    eglSwapBuffers(egl_dpy, egl_surf);

il semble plus lisse et a ralenti le taux de cadre, mais seulement vers le bas de la gamme de 180-200 FPS; donc j'ai encore besoin de faire un sommeil entre les cadres. Peut-être qu'il bloque seulement l'échange de tampons pendant un court intervalle des opérations critiques de GPU? Ou peut-être que je ne suis pas en train de faire. Pas sûr.

1
répondu ecloud 2013-04-08 21:13:26