Ioseph Martinez Pelayo

OpenVG not-synchronized buffer options

Discussion created by Ioseph Martinez Pelayo Employee on Aug 6, 2013

Two options are available to draw into a surface without being synchronized with the DCU frame rate:

- Using pBuffer

- Using FBWS

 

eglSwapInteval is not supported from 0.4.0 to 0.6.0 so setting eglSwapInterval to 0 achieve this will not help. And if the user uses Pbuffer surface, the eglSwapInterval would not work even if it's supported, because in Pbuffer surface case the video sync is controlled by the application separately itself.

 

So, pBuffer can be used because is not linked to the windowing system (ie DCU) so they don't need to use eglSwapBuffers or eglSwapInterval.

Synchronization is done manually. This allows a lot of customization. For example:

(assume pBuffer are used, egl, openvg context and surfaces already initialized

draw()

{

     eglMakeCurrent(dsp, surf[current], surf[current], ctx[current]);

     //do all draw operations

     vgFinish()

     eglGetPbufferDimFSL(&pbd, dsp, surf[current]);

     bufferAdress = pbd.pByte;

     current = (current+1) % NUM_BUFFERS

     (you need to update the DCU layers now... or wait for vsync...)

}

 

In 0.6.0 release, you can configure FBWS to be single buffered to imitate the behavior of "interval = 0". See the example in tests/image/ovgmain.c.

FbdevInfo fb_info = {

        1,                           /* buf_count */

        FBDEV_VALUE_NOT_SPECIFIED,   /* x */

        FBDEV_VALUE_NOT_SPECIFIED,   /* y */

        FBDEV_VALUE_NOT_SPECIFIED,   /* width */

        FBDEV_VALUE_NOT_SPECIFIED,   /* height */

        FBDEV_VALUE_NOT_SPECIFIED,   /* stride */

        FBDEV_COLOR_ARGB8888         /* format */

    };

Outcomes