From 63dbf061a993a3a81c03bc79806b646003c85e4e Mon Sep 17 00:00:00 2001 From: Derek Foreman Date: Thu, 27 Apr 2017 16:02:59 -0500 Subject: [PATCH] ecore_drm2: Move atomic state into an output state struct This should make it easier to share code paths between atomic and non atomic operations. --- src/lib/ecore_drm2/ecore_drm2_fb.c | 13 +++++++------ src/lib/ecore_drm2/ecore_drm2_outputs.c | 4 ++-- src/lib/ecore_drm2/ecore_drm2_private.h | 20 +++++++++++++++++--- 3 files changed, 26 insertions(+), 11 deletions(-) diff --git a/src/lib/ecore_drm2/ecore_drm2_fb.c b/src/lib/ecore_drm2/ecore_drm2_fb.c index 452e302daf..52cf55af9a 100644 --- a/src/lib/ecore_drm2/ecore_drm2_fb.c +++ b/src/lib/ecore_drm2/ecore_drm2_fb.c @@ -321,16 +321,16 @@ _fb_atomic_flip_test(Ecore_Drm2_Output *output) if (res) { - if (output->atomic_req) + if (output->prep.atomic_req) { /* clear any previous request */ - sym_drmModeAtomicFree(output->atomic_req); + sym_drmModeAtomicFree(output->prep.atomic_req); /* just use the new request */ - output->atomic_req = req; + output->prep.atomic_req = req; } else - output->atomic_req = req; + output->prep.atomic_req = req; } return res; @@ -351,10 +351,11 @@ _fb_atomic_flip(Ecore_Drm2_Output *output) DRM_MODE_ATOMIC_NONBLOCK | DRM_MODE_PAGE_FLIP_EVENT | DRM_MODE_ATOMIC_ALLOW_MODESET; - if (!output->atomic_req) return -1; + if (!output->prep.atomic_req) return -1; res = - sym_drmModeAtomicCommit(output->fd, output->atomic_req, flags, NULL); + sym_drmModeAtomicCommit(output->fd, + output->prep.atomic_req, flags, NULL); if (res < 0) { ERR("Failed Atomic Commit: %m"); diff --git a/src/lib/ecore_drm2/ecore_drm2_outputs.c b/src/lib/ecore_drm2/ecore_drm2_outputs.c index 27c0031ee7..fa7d223d94 100644 --- a/src/lib/ecore_drm2/ecore_drm2_outputs.c +++ b/src/lib/ecore_drm2/ecore_drm2_outputs.c @@ -898,8 +898,8 @@ _output_destroy(Ecore_Drm2_Device *dev, Ecore_Drm2_Output *output) #ifdef HAVE_ATOMIC_DRM if (_ecore_drm2_use_atomic) { - if (output->atomic_req) - sym_drmModeAtomicFree(output->atomic_req); + if (output->prep.atomic_req) + sym_drmModeAtomicFree(output->prep.atomic_req); } #endif diff --git a/src/lib/ecore_drm2/ecore_drm2_private.h b/src/lib/ecore_drm2/ecore_drm2_private.h index 09a9c46ee8..d97b7cddef 100644 --- a/src/lib/ecore_drm2/ecore_drm2_private.h +++ b/src/lib/ecore_drm2/ecore_drm2_private.h @@ -723,6 +723,19 @@ struct _Ecore_Drm2_Output_Mode drmModeModeInfo info; }; +/* A half step - we still keep an fb for the canvas + * and an atomic_req for all atomic state (including + * the canvas fb). + * The non atomic code only uses the canvas fb. + */ +typedef struct _Ecore_Drm2_Output_State +{ + Ecore_Drm2_Fb *fb; +# ifdef HAVE_ATOMIC_DRM + drmModeAtomicReq *atomic_req; +# endif +} Ecore_Drm2_Output_State; + struct _Ecore_Drm2_Output { Eina_Stringshare *name; @@ -755,6 +768,10 @@ struct _Ecore_Drm2_Output drmModeCrtcPtr ocrtc; + /* prep is for state we're preparing and have never + * attempted to commit */ + Ecore_Drm2_Output_State prep; + Ecore_Drm2_Fb *current, *next, *pending; Eina_Matrix4 matrix, inverse; @@ -776,9 +793,6 @@ struct _Ecore_Drm2_Output Eina_List *plane_states; Eina_List *planes; -# ifdef HAVE_ATOMIC_DRM - drmModeAtomicReq *atomic_req; -# endif Eina_Bool connected : 1; Eina_Bool primary : 1;