From ba2fb909edd8d7c90d4ce6e813668e6e42170ba3 Mon Sep 17 00:00:00 2001 From: Changyeon Lee Date: Wed, 23 Jun 2021 16:29:11 +0900 Subject: [PATCH] e_comp_wl: Create E_Comp_Wl_Buffer with gbm_bo Convert wl_buffer to gbm_bo and gbm_bo to tbm_surface E_Comp_Wl_Buffer is created with tbm_surface and set by tbm type Change-Id: I93f06aeba0544f6981cae60228cb4add14904c74 --- src/bin/e_comp_screen.h | 1 + src/bin/e_comp_wl.c | 243 ++++++++++++++++++++++-------------------------- 2 files changed, 114 insertions(+), 130 deletions(-) diff --git a/src/bin/e_comp_screen.h b/src/bin/e_comp_screen.h index 98e66cd..8236d30 100644 --- a/src/bin/e_comp_screen.h +++ b/src/bin/e_comp_screen.h @@ -20,6 +20,7 @@ struct _E_Comp_Screen int num_outputs; tdm_display *tdisplay; tbm_bufmgr bufmgr; + void *gdevice; /* for sw compositing */ const Eina_List *devices; diff --git a/src/bin/e_comp_wl.c b/src/bin/e_comp_wl.c index d36cea2..fc6c315 100644 --- a/src/bin/e_comp_wl.c +++ b/src/bin/e_comp_wl.c @@ -3,6 +3,7 @@ #include #include +#include #include /* handle include for printing uint64_t */ @@ -2010,6 +2011,8 @@ _e_comp_wl_buffer_cb_destroy(struct wl_listener *listener, void *data EINA_UNUSE /* remove debug info */ eina_stringshare_del(buffer->debug_info.owner_name); + if (buffer->tbm_surface) tbm_surface_internal_unref(buffer->tbm_surface); + if (buffer->buffer_release) e_explicit_sync_buffer_release_destroy(buffer->buffer_release); @@ -4526,6 +4529,92 @@ e_comp_wl_buffer_reference(E_Comp_Wl_Buffer_Ref *ref, E_Comp_Wl_Buffer *buffer) ref->destroy_listener.notify = _e_comp_wl_buffer_reference_cb_destroy; } +static Eina_Bool +_e_comp_wl_buffer_tbm_type_get(E_Comp_Wl_Buffer *buffer, struct wl_resource *resource, + E_Client *ec) +{ + tbm_surface_h tsurface; + struct gbm_bo *gbo; + + if (!buffer || !resource || !ec) return EINA_FALSE; + + tsurface = wayland_tbm_server_get_surface(e_comp_wl->tbm.server, resource); + if (tsurface) + { + tbm_surface_internal_ref(tsurface); + } + else + { + if (!e_comp->e_comp_screen->gdevice) return EINA_FALSE; + + gbo = gbm_bo_import(e_comp->e_comp_screen->gdevice, GBM_BO_IMPORT_WL_BUFFER, + resource, GBM_BO_USE_RENDERING); + if (!gbo) return EINA_FALSE; + + tsurface = e_comp_wl_tbm_import_gbm_bo(gbo); + if (!tsurface) + { + gbm_bo_destroy(gbo); + return EINA_FALSE; + } + + gbm_bo_destroy(gbo); + } + + if ((ec) && (ec->comp_data->video_client)) + { + buffer->type = E_COMP_WL_BUFFER_TYPE_VIDEO; + buffer->w = buffer->h = 1; + buffer->format = 0; + } + else if ((ec) && (e_client_video_hw_composition_check(ec))) + { + buffer->type = E_COMP_WL_BUFFER_TYPE_VIDEO; + buffer->w = tbm_surface_get_width(tsurface); + buffer->h = tbm_surface_get_height(tsurface); + buffer->format = tbm_surface_get_format(tsurface); + } + else + { + buffer->type = E_COMP_WL_BUFFER_TYPE_TBM; + buffer->w = tbm_surface_get_width(tsurface); + buffer->h = tbm_surface_get_height(tsurface); + buffer->format = tbm_surface_get_format(tsurface); + } + + buffer->tbm_surface = tsurface; + + return EINA_TRUE; +} + +static Eina_Bool +_e_comp_wl_buffer_native_type_get(E_Comp_Wl_Buffer *buffer, struct wl_resource *resource, + E_Client *ec) +{ + Eina_Bool res; + + if (!buffer || !resource || !ec) return EINA_FALSE; + + buffer->type = E_COMP_WL_BUFFER_TYPE_NATIVE; + res = e_comp_wl->evas_gl->glapi->evasglQueryWaylandBuffer(e_comp_wl->evas_gl->gl, + resource, + EVAS_GL_WIDTH, + &buffer->w); + EINA_SAFETY_ON_FALSE_RETURN_VAL(res, EINA_FALSE); + res = e_comp_wl->evas_gl->glapi->evasglQueryWaylandBuffer(e_comp_wl->evas_gl->gl, + resource, + EVAS_GL_HEIGHT, + &buffer->h); + EINA_SAFETY_ON_FALSE_RETURN_VAL(res, EINA_FALSE); + res = e_comp_wl->evas_gl->glapi->evasglQueryWaylandBuffer(e_comp_wl->evas_gl->gl, + resource, + EVAS_GL_TEXTURE_FORMAT, + &buffer->format); + EINA_SAFETY_ON_FALSE_RETURN_VAL(res, EINA_FALSE); + + return EINA_TRUE; +} + /** * Get the buffer for a given resource. * @@ -4543,7 +4632,6 @@ e_comp_wl_buffer_get(struct wl_resource *resource, E_Client *ec) struct wl_listener *listener; struct wl_shm_buffer *shmbuff; Eina_Bool res; - tbm_surface_h tbm_surf; listener = wl_resource_get_destroy_listener(resource, _e_comp_wl_buffer_cb_destroy); @@ -4556,145 +4644,40 @@ e_comp_wl_buffer_get(struct wl_resource *resource, E_Client *ec) if (!(buffer = E_NEW(E_Comp_Wl_Buffer, 1))) return NULL; shmbuff = wl_shm_buffer_get(resource); - - /* TODO: This option is temporarily. It will be removed later. */ - /* prefer to use native buffer(wl_buffer) */ - if (e_comp->use_native_type_buffer) + if (shmbuff) { - if (shmbuff) - { - buffer->type = E_COMP_WL_BUFFER_TYPE_SHM; - - buffer->w = wl_shm_buffer_get_width(shmbuff); - buffer->h = wl_shm_buffer_get_height(shmbuff); - buffer->format = wl_shm_buffer_get_format(shmbuff); - } - else + buffer->type = E_COMP_WL_BUFFER_TYPE_SHM; + buffer->w = wl_shm_buffer_get_width(shmbuff); + buffer->h = wl_shm_buffer_get_height(shmbuff); + buffer->format = wl_shm_buffer_get_format(shmbuff); + buffer->shm_buffer = shmbuff; + } + else + { + /* TODO: This option is temporarily. It will be removed later. */ + /* prefer to use native buffer(wl_buffer) */ + if (e_comp->use_native_type_buffer) { - if ((ec) && (ec->comp_data->video_client)) - { - buffer->type = E_COMP_WL_BUFFER_TYPE_VIDEO; - buffer->w = buffer->h = 1; - buffer->format = 0; - } - else if ((ec) && (e_client_video_hw_composition_check(ec))) - { - tbm_surf = wayland_tbm_server_get_surface(e_comp_wl->tbm.server, resource); - if (!tbm_surf) - goto err; - - buffer->type = E_COMP_WL_BUFFER_TYPE_VIDEO; - buffer->w = tbm_surface_get_width(tbm_surf); - buffer->h = tbm_surface_get_height(tbm_surf); - buffer->format = tbm_surface_get_format(tbm_surf); - buffer->tbm_surface = tbm_surf; - } - else if (e_comp->gl) + if (e_comp->gl) { - buffer->type = E_COMP_WL_BUFFER_TYPE_NATIVE; - - res = e_comp_wl->evas_gl->glapi->evasglQueryWaylandBuffer(e_comp_wl->evas_gl->gl, - resource, - EVAS_GL_WIDTH, - &buffer->w); - EINA_SAFETY_ON_FALSE_GOTO(res, err); - - res = e_comp_wl->evas_gl->glapi->evasglQueryWaylandBuffer(e_comp_wl->evas_gl->gl, - resource, - EVAS_GL_HEIGHT, - &buffer->h); - EINA_SAFETY_ON_FALSE_GOTO(res, err); - - res = e_comp_wl->evas_gl->glapi->evasglQueryWaylandBuffer(e_comp_wl->evas_gl->gl, - resource, - EVAS_GL_TEXTURE_FORMAT, - &buffer->format); + res = _e_comp_wl_buffer_native_type_get(buffer, resource, ec); EINA_SAFETY_ON_FALSE_GOTO(res, err); } else { - tbm_surf = wayland_tbm_server_get_surface(e_comp_wl->tbm.server, resource); - if (!tbm_surf) - goto err; - - buffer->type = E_COMP_WL_BUFFER_TYPE_NATIVE; - buffer->w = tbm_surface_get_width(tbm_surf); - buffer->h = tbm_surface_get_height(tbm_surf); - buffer->format = tbm_surface_get_format(tbm_surf); - buffer->tbm_surface = tbm_surf; + res = _e_comp_wl_buffer_tbm_type_get(buffer, resource, ec); + EINA_SAFETY_ON_FALSE_GOTO(res, err); } } - buffer->shm_buffer = shmbuff; - } - else - { - tbm_surf = wayland_tbm_server_get_surface(e_comp_wl->tbm.server, resource); - - if (shmbuff) - { - buffer->type = E_COMP_WL_BUFFER_TYPE_SHM; - - buffer->w = wl_shm_buffer_get_width(shmbuff); - buffer->h = wl_shm_buffer_get_height(shmbuff); - buffer->format = wl_shm_buffer_get_format(shmbuff); - } - else if (tbm_surf) - { - tbm_surf = wayland_tbm_server_get_surface(e_comp_wl->tbm.server, resource); - if (!tbm_surf) - goto err; - - if ((ec) && (ec->comp_data->video_client)) - { - buffer->type = E_COMP_WL_BUFFER_TYPE_VIDEO; - buffer->w = buffer->h = 1; - buffer->format = 0; - } - else if ((ec) && (e_client_video_hw_composition_check(ec))) - { - buffer->type = E_COMP_WL_BUFFER_TYPE_VIDEO; - buffer->w = tbm_surface_get_width(tbm_surf); - buffer->h = tbm_surface_get_height(tbm_surf); - buffer->format = tbm_surface_get_format(tbm_surf); - } - else - { - buffer->type = E_COMP_WL_BUFFER_TYPE_TBM; - buffer->w = tbm_surface_get_width(tbm_surf); - buffer->h = tbm_surface_get_height(tbm_surf); - buffer->format = tbm_surface_get_format(tbm_surf); - } - } - else if (e_comp->gl) - { - buffer->type = E_COMP_WL_BUFFER_TYPE_NATIVE; - - res = e_comp_wl->evas_gl->glapi->evasglQueryWaylandBuffer(e_comp_wl->evas_gl->gl, - resource, - EVAS_GL_WIDTH, - &buffer->w); - EINA_SAFETY_ON_FALSE_GOTO(res, err); - - res = e_comp_wl->evas_gl->glapi->evasglQueryWaylandBuffer(e_comp_wl->evas_gl->gl, - resource, - EVAS_GL_HEIGHT, - &buffer->h); - EINA_SAFETY_ON_FALSE_GOTO(res, err); - - res = e_comp_wl->evas_gl->glapi->evasglQueryWaylandBuffer(e_comp_wl->evas_gl->gl, - resource, - EVAS_GL_TEXTURE_FORMAT, - &buffer->format); - EINA_SAFETY_ON_FALSE_GOTO(res, err); - } - else - { - goto err; - } + else + { + res = _e_comp_wl_buffer_tbm_type_get(buffer, resource, ec); + if (!res && e_comp->gl) + res = _e_comp_wl_buffer_native_type_get(buffer,resource, ec); - buffer->shm_buffer = shmbuff; - buffer->tbm_surface = tbm_surf; - } + EINA_SAFETY_ON_FALSE_GOTO(res, err); + } + } buffer->resource = resource; wl_signal_init(&buffer->destroy_signal); -- 2.7.4