devilhorns pushed a commit to branch master. http://git.enlightenment.org/core/efl.git/commit/?id=443010b465fec213f9a1f084328cc285591586e6
commit 443010b465fec213f9a1f084328cc285591586e6 Author: Chris Michael <cp.mich...@samsung.com> Date: Wed May 13 14:33:08 2015 -0400 ecore-drm: Greatly improve drm rendering speed Summary: This greatly improves rendering speed in evas drm engine. Previously we would always call drmModeSetCrtc regardless if it was needed or not. These changes greatly improve rendering speed in drm as we now only call drmModeSetCrtc if it is needed. @fix Signed-off-by: Chris Michael <cp.mich...@samsung.com> --- src/lib/ecore_drm/ecore_drm_device.c | 3 +++ src/lib/ecore_drm/ecore_drm_fb.c | 36 +++++++++++++++++++++++++++++------ src/lib/ecore_drm/ecore_drm_private.h | 1 + 3 files changed, 34 insertions(+), 6 deletions(-) diff --git a/src/lib/ecore_drm/ecore_drm_device.c b/src/lib/ecore_drm/ecore_drm_device.c index b902c19..774234e 100644 --- a/src/lib/ecore_drm/ecore_drm_device.c +++ b/src/lib/ecore_drm/ecore_drm_device.c @@ -24,6 +24,9 @@ _ecore_drm_device_cb_page_flip(int fd EINA_UNUSED, unsigned int frame EINA_UNUSE flip_count++; if (flip_count < cb->count) return; + cb->dev->current = cb->dev->next; + cb->dev->next = NULL; + flip_count = 0; if (cb->func) cb->func(cb->data); /* free(cb); */ diff --git a/src/lib/ecore_drm/ecore_drm_fb.c b/src/lib/ecore_drm/ecore_drm_fb.c index 982f962..03a2a99 100644 --- a/src/lib/ecore_drm/ecore_drm_fb.c +++ b/src/lib/ecore_drm/ecore_drm_fb.c @@ -183,22 +183,39 @@ ecore_drm_fb_set(Ecore_Drm_Device *dev, Ecore_Drm_Fb *fb) return; } + if (!dev->next) dev->next = fb; + if (!dev->next) return; + EINA_LIST_FOREACH(dev->outputs, l, output) { int x = 0, y = 0; + if ((!output->enabled) || (!output->current_mode)) continue; + if (!output->cloned) { x = output->x; y = output->y; } - if (drmModeSetCrtc(dev->drm.fd, output->crtc_id, fb->id, x, y, - &output->conn_id, 1, &output->current_mode->info)) + if ((!dev->current) || + (dev->current->stride != dev->next->stride)) { - ERR("Failed to set Mode %dx%d for Output %s: %m", - output->current_mode->width, output->current_mode->height, - output->name); + DBG("Set Framebuffer %d For Output %s - %d %d", + dev->next->id, output->name, x, y); + DBG("\tOutput Geom: %d %d", output->x, output->y); + DBG("\tOutput Crtc Buffer: %d", output->crtc->buffer_id); + + if (drmModeSetCrtc(dev->drm.fd, output->crtc_id, dev->next->id, + x, y, &output->conn_id, 1, + &output->current_mode->info)) + { + ERR("Failed to set Mode %dx%d for Output %s: %m", + output->current_mode->width, output->current_mode->height, + output->name); + } + + /* TODO: set dpms on ?? */ } } } @@ -219,12 +236,19 @@ ecore_drm_fb_send(Ecore_Drm_Device *dev, Ecore_Drm_Fb *fb, Ecore_Drm_Pageflip_Cb if (!(cb = calloc(1, sizeof(Ecore_Drm_Pageflip_Callback)))) return; + cb->dev = dev; cb->func = func; cb->data = data; - cb->count = eina_list_count(dev->outputs); + + EINA_LIST_FOREACH(dev->outputs, l, output) + if (output->enabled) cb->count++; + + /* cb->count = eina_list_count(dev->outputs); */ EINA_LIST_FOREACH(dev->outputs, l, output) { + if ((!output->enabled) || (!output->current_mode)) continue; + if (drmModePageFlip(dev->drm.fd, output->crtc_id, fb->id, DRM_MODE_PAGE_FLIP_EVENT, cb) < 0) { diff --git a/src/lib/ecore_drm/ecore_drm_private.h b/src/lib/ecore_drm/ecore_drm_private.h index 679e908..7932ca4 100644 --- a/src/lib/ecore_drm/ecore_drm_private.h +++ b/src/lib/ecore_drm/ecore_drm_private.h @@ -82,6 +82,7 @@ extern int _ecore_drm_log_dom; typedef struct _Ecore_Drm_Pageflip_Callback { + Ecore_Drm_Device *dev; Ecore_Drm_Pageflip_Cb func; void *data; int count; --