#include <tizen-extension-server-protocol.h>
#include <wayland-tbm-server.h>
+#include <gbm.h>
#include <Evas_GL.h>
/* handle include for printing uint64_t */
/* 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);
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.
*
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);
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);