gl_drm_ee: Remove repulsive hack and do proper gbm buffer accounting

We no longer need this hack as we now have a way to properly handle the
buffer locking in the engine, and don't currently deal with multi-head.
This commit is contained in:
Derek Foreman 2016-09-09 13:35:22 -05:00
parent 21ad56aa32
commit 95bb942aa7
2 changed files with 23 additions and 17 deletions

View File

@ -103,7 +103,6 @@ struct _Outbuf
struct
{
struct gbm_bo *bo[2];
Ecore_Drm2_Output *output;
} priv;
@ -130,6 +129,7 @@ void *evas_outbuf_update_region_new(Outbuf *ob, int x, int y, int w, int h, int
void evas_outbuf_update_region_push(Outbuf *ob, RGBA_Image *update, int x, int y, int w, int h);
void evas_outbuf_update_region_free(Outbuf *ob, RGBA_Image *update);
void evas_outbuf_flush(Outbuf *ob, Tilebuf_Rect *rects, Evas_Render_Mode render_mode);
void evas_outbuf_release_fb(void *, void *);
Evas_Engine_GL_Context* evas_outbuf_gl_context_get(Outbuf *ob);
void *evas_outbuf_egl_display_get(Outbuf *ob);

View File

@ -76,29 +76,31 @@ _evas_outbuf_fb_get(Outbuf *ob, struct gbm_bo *bo)
return fb;
}
void
_evas_outbuf_release_fb(void *ob_v, Ecore_Drm2_Fb *fb)
{
struct gbm_bo *bo;
Outbuf *ob;
ob = ob_v;
bo = ecore_drm2_fb_bo_get(fb);
gbm_surface_release_buffer(ob->surface, bo);
}
static void
_evas_outbuf_buffer_swap(Outbuf *ob)
{
Ecore_Drm2_Fb *fb;
struct gbm_bo *bo;
Ecore_Drm2_Fb *fb = NULL;
/* Repulsive hack: Right now we don't actually have a proper way to retire
* buffers because the ticker and the flip handler are out of sync, the
* flip handler is per output, fbs are submit to multiple outputs and may
* be denied (and re-queued) by any output they're supposed to be on.
* This will all be magically fixed when evas supports multiple target
* regions, but until then we do this:
* always have 2 buffers locked
*/
if (ob->priv.bo[1]) gbm_surface_release_buffer(ob->surface, ob->priv.bo[1]);
ob->priv.bo[1] = ob->priv.bo[0];
ob->priv.bo[0] = gbm_surface_lock_front_buffer(ob->surface);
if (!ob->priv.bo[0])
bo = gbm_surface_lock_front_buffer(ob->surface);
if (!bo)
{
WRN("Could not lock front buffer: %m");
return;
ecore_drm2_output_fb_release(ob->priv.output);
bo = gbm_surface_lock_front_buffer(ob->surface);
}
if (bo) fb = _evas_outbuf_fb_get(ob, bo);
fb = _evas_outbuf_fb_get(ob, ob->priv.bo[0]);
if (fb)
{
ecore_drm2_fb_flip(fb, ob->priv.output);
@ -390,6 +392,10 @@ evas_outbuf_new(Evas_Engine_Info_GL_Drm *info, int w, int h, Render_Engine_Swap_
ob->format = info->info.format;
ob->priv.output = info->info.output;
ecore_drm2_output_release_handler_set(ob->priv.output,
_evas_outbuf_release_fb,
ob);
/* if ((num = getenv("EVAS_GL_DRM_VSYNC"))) */
/* ob->vsync = atoi(num); */