forked from enlightenment/efl
Evas: adding image dump debug feature for wayland_egl backend
Porting commit f10c108283d9b76708418ba172b9ff0b28a09cd6 to wayland engine. Added a feature to dump out a png image before calling SwapBuffers. To turn on the feature, use the following env vars. EVAS_GL_SWAP_BUFFER_DEBUG_DIR="dir_name" sets the name of the directory that the files will be output to and enables the debug mode. EVAS_GL_SWAP_BUFFER_DEBUG_ALWAYS=1 will enable the writing of the files every frame. This in effect turns on the swap_buffer_debug variable, which can be set on or off in gdb for debugging. This will allow dumping of certain frames without having to dump out a ton of files to track down one frame.
This commit is contained in:
parent
3074280217
commit
7aa516c01a
|
@ -41,6 +41,7 @@ struct _Render_Engine
|
|||
Eina_Bool lost_back : 1;
|
||||
Eina_Bool end : 1;
|
||||
Eina_Bool evgl_initted : 1;
|
||||
int frame_cnt;
|
||||
|
||||
struct
|
||||
{
|
||||
|
@ -103,6 +104,9 @@ static Eina_Bool extn_have_buffer_age = EINA_TRUE;
|
|||
static int safe_native = -1;
|
||||
static int partial_rect_union_mode = -1;
|
||||
|
||||
static int swap_buffer_debug_mode = -1;
|
||||
static int swap_buffer_debug = 0;
|
||||
|
||||
/* function tables - filled in later (func and parent func) */
|
||||
static Evas_Func func, pfunc;
|
||||
static EVGL_Interface evgl_funcs =
|
||||
|
@ -1188,6 +1192,7 @@ static void
|
|||
eng_output_flush(void *data, Evas_Render_Mode render_mode)
|
||||
{
|
||||
Render_Engine *re;
|
||||
static char *dname = NULL;
|
||||
|
||||
if (!(re = (Render_Engine *)data)) return;
|
||||
|
||||
|
@ -1201,6 +1206,41 @@ eng_output_flush(void *data, Evas_Render_Mode render_mode)
|
|||
|
||||
evas_gl_common_context_done(re->win->gl_context);
|
||||
|
||||
// Save contents of the framebuffer to a file
|
||||
if (swap_buffer_debug_mode == -1)
|
||||
{
|
||||
if ((dname = getenv("EVAS_GL_SWAP_BUFFER_DEBUG_DIR")))
|
||||
{
|
||||
int stat;
|
||||
// Create a directory with 0775 permission
|
||||
stat = mkdir(dname, S_IRWXU|S_IRGRP|S_IXGRP|S_IROTH|S_IXOTH);
|
||||
if ((!stat) || errno == EEXIST) swap_buffer_debug_mode = 1;
|
||||
}
|
||||
else
|
||||
swap_buffer_debug_mode = 0;
|
||||
}
|
||||
|
||||
if (swap_buffer_debug_mode == 1)
|
||||
{
|
||||
// Set this env var to dump files every frame
|
||||
// Or set the global var in gdb to 1|0 to turn it on and off
|
||||
if (getenv("EVAS_GL_SWAP_BUFFER_DEBUG_ALWAYS"))
|
||||
swap_buffer_debug = 1;
|
||||
|
||||
if (swap_buffer_debug)
|
||||
{
|
||||
char fname[100];
|
||||
int ret = 0;
|
||||
sprintf(fname, "%p", (void*)re->win);
|
||||
|
||||
ret = evas_gl_common_buffer_dump(re->win->gl_context,
|
||||
(const char*)dname,
|
||||
(const char*)fname,
|
||||
re->frame_cnt);
|
||||
if (!ret) swap_buffer_debug_mode = 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (!re->vsync)
|
||||
{
|
||||
if (re->info->vsync) eglSwapInterval(re->win->egl_disp, 1);
|
||||
|
@ -1278,6 +1318,9 @@ eng_output_flush(void *data, Evas_Render_Mode render_mode)
|
|||
evas_common_tilebuf_free_render_rects(re->rects);
|
||||
re->rects = NULL;
|
||||
}
|
||||
|
||||
re->frame_cnt++;
|
||||
|
||||
end:
|
||||
evas_gl_preload_render_unlock(eng_gl_preload_make_current, re);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue