devilhorns pushed a commit to branch master. http://git.enlightenment.org/core/efl.git/commit/?id=3aaa9f2f9f2c998207eb3ad13876d70532e6bd0c
commit 3aaa9f2f9f2c998207eb3ad13876d70532e6bd0c Author: Chris Michael <cp.mich...@samsung.com> Date: Wed May 13 10:19:32 2015 -0400 ecore-drm: Fix purpose of ecore_drm_output_enable/disable functions Summary: These API functions should be used for enable/disable of a given output. They were previously being misused to stop/start rendering on an output when we VT switch away so now we add an internal function we can call to disable/enable rendering. @fix Signed-off-by: Chris Michael <cp.mich...@samsung.com> --- src/lib/ecore_drm/Ecore_Drm.h | 4 +- src/lib/ecore_drm/ecore_drm_logind.c | 4 +- src/lib/ecore_drm/ecore_drm_output.c | 88 +++++++++++++++++++++-------------- src/lib/ecore_drm/ecore_drm_private.h | 2 + 4 files changed, 60 insertions(+), 38 deletions(-) diff --git a/src/lib/ecore_drm/Ecore_Drm.h b/src/lib/ecore_drm/Ecore_Drm.h index 0a8b7d4..b26efa1 100644 --- a/src/lib/ecore_drm/Ecore_Drm.h +++ b/src/lib/ecore_drm/Ecore_Drm.h @@ -482,7 +482,7 @@ EAPI void ecore_drm_output_cursor_size_set(Ecore_Drm_Output *output, int handle, /** * Enable a Ecore_Drm_Output * - * This function will enable rendering on an Ecore_Drm_Output + * This function will enable an Ecore_Drm_Output * * @param output The Ecore_Drm_Output to enable * @@ -494,7 +494,7 @@ EAPI Eina_Bool ecore_drm_output_enable(Ecore_Drm_Output *output); /** * Disable a Ecore_Drm_Output * - * This function will disable rendering on an Ecore_Drm_Output + * This function will disable an Ecore_Drm_Output * * @param output The Ecore_Drm_Output to disable * diff --git a/src/lib/ecore_drm/ecore_drm_logind.c b/src/lib/ecore_drm/ecore_drm_logind.c index 3fd0f20..1b64d0a 100644 --- a/src/lib/ecore_drm/ecore_drm_logind.c +++ b/src/lib/ecore_drm/ecore_drm_logind.c @@ -150,7 +150,7 @@ _ecore_drm_logind_cb_activate(void *data, int type EINA_UNUSED, void *event) { /* set output mode */ EINA_LIST_FOREACH(dev->outputs, l, output) - ecore_drm_output_enable(output); + _ecore_drm_output_render_enable(output); /* enable inputs */ EINA_LIST_FOREACH(dev->inputs, l, input) @@ -166,7 +166,7 @@ _ecore_drm_logind_cb_activate(void *data, int type EINA_UNUSED, void *event) /* disable hardware cursor */ EINA_LIST_FOREACH(dev->outputs, l, output) - ecore_drm_output_disable(output); + _ecore_drm_output_render_disable(output); /* disable sprites */ EINA_LIST_FOREACH(dev->sprites, l, sprite) diff --git a/src/lib/ecore_drm/ecore_drm_output.c b/src/lib/ecore_drm/ecore_drm_output.c index 5af5bf4..e893ce9 100644 --- a/src/lib/ecore_drm/ecore_drm_output.c +++ b/src/lib/ecore_drm/ecore_drm_output.c @@ -717,6 +717,57 @@ next: } } +void +_ecore_drm_output_render_enable(Ecore_Drm_Output *output) +{ + Ecore_Drm_Device *dev; + Ecore_Drm_Output_Mode *mode; + /* int x = 0, y = 0; */ + + EINA_SAFETY_ON_NULL_RETURN(output); + EINA_SAFETY_ON_NULL_RETURN(output->dev); + EINA_SAFETY_ON_NULL_RETURN(output->current_mode); + + if (!output->enabled) return; + + dev = output->dev; + + if (!dev->current) + { + /* schedule repaint */ + /* NB: this will trigger a redraw at next idle */ + output->need_repaint = EINA_TRUE; + return; + } + + ecore_drm_output_dpms_set(output, DRM_MODE_DPMS_ON); + + /* if (!output->cloned) */ + /* { */ + /* x = output->x; */ + /* y = output->y; */ + /* } */ + + mode = output->current_mode; + if (drmModeSetCrtc(dev->drm.fd, output->crtc_id, dev->current->id, + output->x, output->y, + &output->conn_id, 1, &mode->info) < 0) + { + ERR("Failed to set Mode %dx%d for Output %s: %m", + mode->width, mode->height, output->name); + } +} + +void +_ecore_drm_output_render_disable(Ecore_Drm_Output *output) +{ + EINA_SAFETY_ON_NULL_RETURN(output); + + output->need_repaint = EINA_FALSE; + ecore_drm_output_cursor_size_set(output, 0, 0, 0); + ecore_drm_output_dpms_set(output, DRM_MODE_DPMS_OFF); +} + static void _ecore_drm_output_planes_get(Ecore_Drm_Device *dev) { @@ -907,41 +958,11 @@ ecore_drm_output_cursor_size_set(Ecore_Drm_Output *output, int handle, int w, in EAPI Eina_Bool ecore_drm_output_enable(Ecore_Drm_Output *output) { - Ecore_Drm_Device *dev; - Ecore_Drm_Output_Mode *mode; - int x = 0, y = 0; - EINA_SAFETY_ON_NULL_RETURN_VAL(output, EINA_FALSE); - EINA_SAFETY_ON_NULL_RETURN_VAL(output->dev, EINA_FALSE); - EINA_SAFETY_ON_NULL_RETURN_VAL(output->current_mode, EINA_FALSE); - dev = output->dev; + if (output->enabled) return EINA_TRUE; output->enabled = EINA_TRUE; - if (!dev->current) - { - /* schedule repaint */ - /* NB: this will trigger a redraw at next idle */ - output->need_repaint = EINA_TRUE; - return EINA_TRUE; - } - - ecore_drm_output_dpms_set(output, DRM_MODE_DPMS_ON); - - if (!output->cloned) - { - x = output->x; - y = output->y; - } - - mode = output->current_mode; - if (drmModeSetCrtc(dev->drm.fd, output->crtc_id, dev->current->id, x, y, - &output->conn_id, 1, &mode->info) < 0) - { - ERR("Failed to set Mode %dx%d for Output %s: %m", - mode->width, mode->height, output->name); - return EINA_FALSE; - } return EINA_TRUE; } @@ -951,10 +972,9 @@ ecore_drm_output_disable(Ecore_Drm_Output *output) { EINA_SAFETY_ON_NULL_RETURN(output); + if (!output->enabled) return; + output->enabled = EINA_FALSE; - output->need_repaint = EINA_FALSE; - ecore_drm_output_cursor_size_set(output, 0, 0, 0); - ecore_drm_output_dpms_set(output, DRM_MODE_DPMS_OFF); } EAPI void diff --git a/src/lib/ecore_drm/ecore_drm_private.h b/src/lib/ecore_drm/ecore_drm_private.h index fc32801..679e908 100644 --- a/src/lib/ecore_drm/ecore_drm_private.h +++ b/src/lib/ecore_drm/ecore_drm_private.h @@ -265,6 +265,8 @@ void _ecore_drm_output_fb_release(Ecore_Drm_Output *output, Ecore_Drm_Fb *fb); void _ecore_drm_output_repaint_start(Ecore_Drm_Output *output); void _ecore_drm_output_frame_finish(Ecore_Drm_Output *output); void _ecore_drm_outputs_update(Ecore_Drm_Device *dev); +void _ecore_drm_output_render_enable(Ecore_Drm_Output *output); +void _ecore_drm_output_render_disable(Ecore_Drm_Output *output); Eina_Bool _ecore_drm_logind_connect(Ecore_Drm_Device *dev); void _ecore_drm_logind_disconnect(Ecore_Drm_Device *dev); --