add mesa buffer release support to evas gl engine.
This commit is contained in:
parent
3cdd10e070
commit
92398f4f47
|
@ -6,6 +6,8 @@
|
||||||
|
|
||||||
* Evas: Add glx buffer age support for automatic partial
|
* Evas: Add glx buffer age support for automatic partial
|
||||||
redraw in glx.
|
redraw in glx.
|
||||||
|
* Evas: Support GLX_MESA_release_buffers extension to release
|
||||||
|
unused aux buffers.
|
||||||
|
|
||||||
2013-04-09 Jérémy Zurcher (jeyzu)
|
2013-04-09 Jérémy Zurcher (jeyzu)
|
||||||
|
|
||||||
|
|
1
NEWS
1
NEWS
|
@ -72,6 +72,7 @@ Additions:
|
||||||
- Add engine specific alpha_get.
|
- Add engine specific alpha_get.
|
||||||
- Add multiple output support API.
|
- Add multiple output support API.
|
||||||
- Add buffer age support to gl for automatic partial redraws.
|
- Add buffer age support to gl for automatic partial redraws.
|
||||||
|
- Add GLX_MESA_release_buffers suppport to release unused buffers.
|
||||||
* Add ecore_audio API
|
* Add ecore_audio API
|
||||||
* Add eet_mmap.
|
* Add eet_mmap.
|
||||||
* added eet_data_descriptor_name_get()
|
* added eet_data_descriptor_name_get()
|
||||||
|
|
|
@ -2,6 +2,12 @@
|
||||||
#include "evas_engine.h"
|
#include "evas_engine.h"
|
||||||
#include "evas_gl_core_private.h"
|
#include "evas_gl_core_private.h"
|
||||||
|
|
||||||
|
//#define TIMDBG 1
|
||||||
|
#ifdef TIMDBG
|
||||||
|
# include <sys/time.h>
|
||||||
|
# include <unistd.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef HAVE_DLSYM
|
#ifdef HAVE_DLSYM
|
||||||
# include <dlfcn.h> /* dlopen,dlclose,etc */
|
# include <dlfcn.h> /* dlopen,dlclose,etc */
|
||||||
#else
|
#else
|
||||||
|
@ -89,9 +95,55 @@ void (*glsym_glXQueryDrawable) (Display *a, XID b, int c, unsigned int *d)
|
||||||
int (*glsym_glXSwapIntervalSGI) (int a) = NULL;
|
int (*glsym_glXSwapIntervalSGI) (int a) = NULL;
|
||||||
void (*glsym_glXSwapIntervalEXT) (Display *s, GLXDrawable b, int c) = NULL;
|
void (*glsym_glXSwapIntervalEXT) (Display *s, GLXDrawable b, int c) = NULL;
|
||||||
const char *(*glsym_glXQueryExtensionsString) (Display *a, int screen) = NULL;
|
const char *(*glsym_glXQueryExtensionsString) (Display *a, int screen) = NULL;
|
||||||
|
void (*glsym_glXReleaseBuffersMESA) (Display *a, XID b) = NULL;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef TIMDBG
|
||||||
|
static double
|
||||||
|
gettime(void)
|
||||||
|
{
|
||||||
|
struct timeval timev;
|
||||||
|
|
||||||
|
gettimeofday(&timev, NULL);
|
||||||
|
return (double)timev.tv_sec + (((double)timev.tv_usec) / 1000000);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
measure(int end, const char *name)
|
||||||
|
{
|
||||||
|
FILE *fs;
|
||||||
|
static unsigned long user = 0, kern = 0, user2 = 0, kern2 = 0;
|
||||||
|
static double t = 0.0, t2 = 0.0;
|
||||||
|
unsigned long u = 0, k = 0;
|
||||||
|
|
||||||
|
fs = fopen("/proc/self/stat", "rb");
|
||||||
|
if (fs) {
|
||||||
|
fscanf(fs, "%*s %*s %*s %*s %*s %*s %*s %*s %*s %*s %*s %*s %*s "
|
||||||
|
"%lu %lu %*s", &u, &k);
|
||||||
|
fclose(fs);
|
||||||
|
}
|
||||||
|
if (end)
|
||||||
|
{
|
||||||
|
long hz;
|
||||||
|
|
||||||
|
t2 = gettime();
|
||||||
|
user2 = u;
|
||||||
|
kern2 = k;
|
||||||
|
hz = sysconf(_SC_CLK_TCK);
|
||||||
|
fprintf(stderr, "(%8lu %8lu) k=%4lu u=%4lu == tot=%4lu@%4li in=%3.5f < %s\n",
|
||||||
|
user, kern, kern2 - kern, user2 - user,
|
||||||
|
(kern2 - kern) + (user2 - user), hz, t2 - t, name);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
user = u;
|
||||||
|
kern = k;
|
||||||
|
t = gettime();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
//----------------------------------------------------------//
|
//----------------------------------------------------------//
|
||||||
// NEW_EVAS_GL Engine Functions
|
// NEW_EVAS_GL Engine Functions
|
||||||
static void *
|
static void *
|
||||||
|
@ -156,8 +208,8 @@ evgl_eng_make_current(void *data, void *surface, void *context, int flush)
|
||||||
EGLSurface sfc = (EGLSurface)surface;
|
EGLSurface sfc = (EGLSurface)surface;
|
||||||
EGLDisplay dpy = re->win->egl_disp; //eglGetCurrentDisplay();
|
EGLDisplay dpy = re->win->egl_disp; //eglGetCurrentDisplay();
|
||||||
|
|
||||||
if ((context==NULL) && (surface==NULL))
|
if ((!context) && (!surface))
|
||||||
{
|
{
|
||||||
ret = eglMakeCurrent(dpy, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
|
ret = eglMakeCurrent(dpy, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
|
||||||
if (!ret)
|
if (!ret)
|
||||||
{
|
{
|
||||||
|
@ -165,7 +217,7 @@ evgl_eng_make_current(void *data, void *surface, void *context, int flush)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((eglGetCurrentContext() != ctx) ||
|
if ((eglGetCurrentContext() != ctx) ||
|
||||||
(eglGetCurrentSurface(EGL_READ) != sfc) ||
|
(eglGetCurrentSurface(EGL_READ) != sfc) ||
|
||||||
|
@ -191,7 +243,7 @@ evgl_eng_make_current(void *data, void *surface, void *context, int flush)
|
||||||
GLXContext ctx = (GLXContext)context;
|
GLXContext ctx = (GLXContext)context;
|
||||||
Window sfc = (Window)surface;
|
Window sfc = (Window)surface;
|
||||||
|
|
||||||
if ((context==NULL) && (surface==NULL))
|
if ((!context) && (!surface))
|
||||||
{
|
{
|
||||||
ret = glXMakeCurrent(re->info->info.display, None, NULL);
|
ret = glXMakeCurrent(re->info->info.display, None, NULL);
|
||||||
if (!ret)
|
if (!ret)
|
||||||
|
@ -601,11 +653,17 @@ gl_symbols(void)
|
||||||
FINDSYM(glsym_glXQueryDrawable, "glXQueryDrawableARB", glsym_func_void);
|
FINDSYM(glsym_glXQueryDrawable, "glXQueryDrawableARB", glsym_func_void);
|
||||||
FINDSYM(glsym_glXQueryDrawable, "glXQueryDrawable", glsym_func_void);
|
FINDSYM(glsym_glXQueryDrawable, "glXQueryDrawable", glsym_func_void);
|
||||||
|
|
||||||
|
FINDSYM(glsym_glXQueryExtensionsString, "glXQueryExtensionsStringEXT", glsym_func_const_char_ptr);
|
||||||
|
FINDSYM(glsym_glXQueryExtensionsString, "glXQueryExtensionsStringARB", glsym_func_const_char_ptr);
|
||||||
|
FINDSYM(glsym_glXQueryExtensionsString, "glXQueryExtensionsString", glsym_func_const_char_ptr);
|
||||||
|
|
||||||
FINDSYM(glsym_glXSwapIntervalSGI, "glXSwapIntervalMESA", glsym_func_int);
|
FINDSYM(glsym_glXSwapIntervalSGI, "glXSwapIntervalMESA", glsym_func_int);
|
||||||
FINDSYM(glsym_glXSwapIntervalSGI, "glXSwapIntervalSGI", glsym_func_int);
|
FINDSYM(glsym_glXSwapIntervalSGI, "glXSwapIntervalSGI", glsym_func_int);
|
||||||
|
|
||||||
FINDSYM(glsym_glXSwapIntervalEXT, "glXSwapIntervalEXT", glsym_func_void);
|
FINDSYM(glsym_glXSwapIntervalEXT, "glXSwapIntervalEXT", glsym_func_void);
|
||||||
|
|
||||||
|
FINDSYM(glsym_glXReleaseBuffersMESA, "glXReleaseBuffersMESA", glsym_func_void);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
done = 1;
|
done = 1;
|
||||||
|
@ -626,9 +684,12 @@ gl_extn_veto(Render_Engine *re)
|
||||||
{
|
{
|
||||||
extn_have_buffer_age = 0;
|
extn_have_buffer_age = 0;
|
||||||
}
|
}
|
||||||
// if (!strstr(str, ""))
|
}
|
||||||
// {
|
else
|
||||||
// }
|
{
|
||||||
|
if (getenv("EVAS_GL_INFO"))
|
||||||
|
printf("NO EGL EXTN!\n");
|
||||||
|
extn_have_buffer_age = 0;
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
if (glsym_glXQueryExtensionsString)
|
if (glsym_glXQueryExtensionsString)
|
||||||
|
@ -652,6 +713,31 @@ gl_extn_veto(Render_Engine *re)
|
||||||
{
|
{
|
||||||
extn_have_buffer_age = 0;
|
extn_have_buffer_age = 0;
|
||||||
}
|
}
|
||||||
|
if (!strstr(str, "GLX_EXT_swap_control"))
|
||||||
|
{
|
||||||
|
glsym_glXSwapIntervalEXT = NULL;
|
||||||
|
}
|
||||||
|
if (!strstr(str, "GLX_SGI_swap_control"))
|
||||||
|
{
|
||||||
|
glsym_glXSwapIntervalSGI = NULL;
|
||||||
|
}
|
||||||
|
if (!strstr(str, "GLX_MESA_release_buffers"))
|
||||||
|
{
|
||||||
|
glsym_glXReleaseBuffersMESA = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (getenv("EVAS_GL_INFO"))
|
||||||
|
printf("NO GLX EXTN!\n");
|
||||||
|
glsym_glXBindTexImage = NULL;
|
||||||
|
glsym_glXReleaseTexImage = NULL;
|
||||||
|
glsym_glXGetVideoSync = NULL;
|
||||||
|
glsym_glXWaitVideoSync = NULL;
|
||||||
|
extn_have_buffer_age = 0;
|
||||||
|
glsym_glXSwapIntervalEXT = NULL;
|
||||||
|
glsym_glXSwapIntervalSGI = NULL;
|
||||||
|
glsym_glXReleaseBuffersMESA = NULL;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
@ -932,13 +1018,22 @@ eng_output_free(void *data)
|
||||||
#endif
|
#endif
|
||||||
if (re->win)
|
if (re->win)
|
||||||
{
|
{
|
||||||
|
#ifdef GL_GLES
|
||||||
eng_window_free(re->win);
|
eng_window_free(re->win);
|
||||||
|
#else
|
||||||
|
Display *disp = re->win->disp;
|
||||||
|
Window win = re->win->win;
|
||||||
|
eng_window_free(re->win);
|
||||||
|
if (glsym_glXReleaseBuffersMESA)
|
||||||
|
glsym_glXReleaseBuffersMESA(disp, win);
|
||||||
|
#endif
|
||||||
gl_wins--;
|
gl_wins--;
|
||||||
|
|
||||||
// NEW_EVAS_GL
|
// NEW_EVAS_GL
|
||||||
if (gl_wins==0)
|
if (gl_wins == 0)
|
||||||
evgl_engine_destroy(re->evgl_engine);
|
evgl_engine_destroy(re->evgl_engine);
|
||||||
}
|
}
|
||||||
|
|
||||||
evas_common_tilebuf_free(re->tb);
|
evas_common_tilebuf_free(re->tb);
|
||||||
if (re->rects) evas_common_tilebuf_free_render_rects(re->rects);
|
if (re->rects) evas_common_tilebuf_free_render_rects(re->rects);
|
||||||
if (re->rects_prev[0]) evas_common_tilebuf_free_render_rects(re->rects_prev[0]);
|
if (re->rects_prev[0]) evas_common_tilebuf_free_render_rects(re->rects_prev[0]);
|
||||||
|
@ -1109,7 +1204,7 @@ eng_output_redraws_next_update_get(void *data, int *x, int *y, int *w, int *h, i
|
||||||
unsigned int age = 0;
|
unsigned int age = 0;
|
||||||
|
|
||||||
if (glsym_glXQueryDrawable)
|
if (glsym_glXQueryDrawable)
|
||||||
glsym_glXQueryDrawable(re->win->disp, re->win->win,
|
glsym_glXQueryDrawable(re->win->disp, re->win->glxwin,
|
||||||
GLX_BACK_BUFFER_AGE_EXT, &age);
|
GLX_BACK_BUFFER_AGE_EXT, &age);
|
||||||
#endif
|
#endif
|
||||||
if (extn_have_buffer_age)
|
if (extn_have_buffer_age)
|
||||||
|
@ -1118,10 +1213,9 @@ eng_output_redraws_next_update_get(void *data, int *x, int *y, int *w, int *h, i
|
||||||
else if (age == 2) re->mode = MODE_DOUBLE;
|
else if (age == 2) re->mode = MODE_DOUBLE;
|
||||||
else if (age == 3) re->mode = MODE_TRIPLE;
|
else if (age == 3) re->mode = MODE_TRIPLE;
|
||||||
else re->mode = MODE_FULL;
|
else re->mode = MODE_FULL;
|
||||||
if (age != re->prev_age) re->mode = MODE_FULL;
|
if ((int)age != re->prev_age) re->mode = MODE_FULL;
|
||||||
re->prev_age = age;
|
re->prev_age = age;
|
||||||
}
|
}
|
||||||
else re->mode = MODE_FULL;
|
|
||||||
}
|
}
|
||||||
if (re->lost_back)
|
if (re->lost_back)
|
||||||
{
|
{
|
||||||
|
@ -1337,7 +1431,7 @@ eng_output_flush(void *data, Evas_Render_Mode render_mode)
|
||||||
re->vsync = 1;
|
re->vsync = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (glsym_glXSwapIntervalSGI)
|
else if (glsym_glXSwapIntervalSGI)
|
||||||
{
|
{
|
||||||
if (!re->vsync)
|
if (!re->vsync)
|
||||||
{
|
{
|
||||||
|
@ -1363,7 +1457,9 @@ eng_output_flush(void *data, Evas_Render_Mode render_mode)
|
||||||
re->info->callback.pre_swap(re->info->callback.data, re->evas);
|
re->info->callback.pre_swap(re->info->callback.data, re->evas);
|
||||||
}
|
}
|
||||||
// XXX: if partial swaps can be done use re->rects
|
// XXX: if partial swaps can be done use re->rects
|
||||||
|
// measure(0, "swap");
|
||||||
glXSwapBuffers(re->win->disp, re->win->win);
|
glXSwapBuffers(re->win->disp, re->win->win);
|
||||||
|
// measure(1, "swap");
|
||||||
if (re->info->callback.post_swap)
|
if (re->info->callback.post_swap)
|
||||||
{
|
{
|
||||||
re->info->callback.post_swap(re->info->callback.data, re->evas);
|
re->info->callback.post_swap(re->info->callback.data, re->evas);
|
||||||
|
|
Loading…
Reference in New Issue