reuse existing render post callback for wayland clients

This commit is contained in:
Mike Blumenkrantz 2014-08-04 10:20:45 -04:00 committed by Chris Michael
parent d9cdcdbef4
commit 362a9b6cce
4 changed files with 50 additions and 68 deletions

View File

@ -328,10 +328,10 @@ _e_comp_client_update(E_Client *ec)
//INF("PX DIRTY: PX(%dx%d) CLI(%dx%d)", pw, ph, ec->client.w, ec->client.h);
e_pixmap_image_refresh(ec->pixmap);
e_comp_object_dirty(ec->frame);
if (!ec->override)
if (e_pixmap_is_x(ec->pixmap) && (!ec->override))
evas_object_resize(ec->frame, ec->w, ec->h);
}
return post;
return post || (!e_pixmap_is_x(ec->pixmap));
}
static void

View File

@ -101,29 +101,6 @@ _e_comp_wl_buffer_reference_cb_destroy(struct wl_listener *listener, void *data
ref->buffer = NULL;
}
static void
_e_comp_wl_buffer_reference(E_Comp_Wl_Buffer_Ref *ref, E_Comp_Wl_Buffer *buffer)
{
if ((ref->buffer) && (buffer != ref->buffer))
{
ref->buffer->busy--;
if (ref->buffer->busy == 0)
wl_resource_queue_event(ref->buffer->resource, WL_BUFFER_RELEASE);
wl_list_remove(&ref->destroy_listener.link);
}
if ((buffer) && (buffer != ref->buffer))
{
buffer->busy++;
wl_signal_add(&buffer->destroy_signal, &ref->destroy_listener);
}
ref->buffer = buffer;
ref->destroy_listener.notify = _e_comp_wl_buffer_reference_cb_destroy;
}
static void
_e_comp_wl_surface_cb_destroy(struct wl_client *client EINA_UNUSED, struct wl_resource *resource)
{
@ -344,7 +321,7 @@ _e_comp_wl_subsurface_destroy_internal(E_Client *ec)
sub_cdata->parent = NULL;
}
_e_comp_wl_buffer_reference(&sub_cdata->cached.buffer_ref, NULL);
e_comp_wl_buffer_reference(&sub_cdata->cached.buffer_ref, NULL);
if (sub_cdata->cached.damage)
eina_tiler_free(sub_cdata->cached.damage);
@ -411,7 +388,7 @@ _e_comp_wl_subsurface_commit_to_cache(E_Client *ec)
if (cdata->pending.new_attach)
{
sub_cdata->cached.new_attach = EINA_TRUE;
_e_comp_wl_buffer_reference(&sub_cdata->cached.buffer_ref,
e_comp_wl_buffer_reference(&sub_cdata->cached.buffer_ref,
cdata->pending.buffer);
}
@ -444,7 +421,7 @@ _e_comp_wl_subsurface_commit_from_cache(E_Client *ec)
if (sub_cdata->cached.new_attach)
{
_e_comp_wl_buffer_reference(&cdata->buffer_ref,
e_comp_wl_buffer_reference(&cdata->buffer_ref,
sub_cdata->cached.buffer_ref.buffer);
e_pixmap_resource_set(cp, cdata->pending.buffer->resource);
e_pixmap_usable_set(cp, (cdata->pending.buffer != NULL));
@ -573,7 +550,7 @@ _e_comp_wl_surface_commit(E_Client *ec)
if (ec->comp_data->pending.new_attach)
{
_e_comp_wl_buffer_reference(&ec->comp_data->buffer_ref,
e_comp_wl_buffer_reference(&ec->comp_data->buffer_ref,
ec->comp_data->pending.buffer);
e_pixmap_resource_set(cp, ec->comp_data->pending.buffer->resource);
@ -1198,35 +1175,6 @@ _e_comp_wl_cb_bind_compositor(struct wl_client *client, void *data, uint32_t ver
wl_resource_set_implementation(res, &_e_comp_interface, comp, NULL);
}
static void
_e_comp_wl_cb_render_post(void *data EINA_UNUSED, Evas *evas EINA_UNUSED, void *event EINA_UNUSED)
{
Eina_Iterator *itr;
E_Client *ec;
if (!(itr = eina_hash_iterator_data_new(clients_win_hash))) return;
EINA_ITERATOR_FOREACH(itr, ec)
{
struct wl_resource *cb;
if (!ec->comp_data) continue;
EINA_LIST_FREE(ec->comp_data->frames, cb)
{
wl_callback_send_done(cb, (ecore_loop_time_get() * 1000));
wl_resource_destroy(cb);
}
/* post a buffer release */
/* TODO: FIXME: We need a way to determine if the client wants to
* keep the buffer or not. If so, then we should Not be setting NULL
* here as this will essentially release the buffer */
_e_comp_wl_buffer_reference(&ec->comp_data->buffer_ref, NULL);
}
eina_iterator_free(itr);
}
static void
_e_comp_wl_cb_del(E_Comp *comp)
{
@ -1237,10 +1185,6 @@ _e_comp_wl_cb_del(E_Comp *comp)
e_comp_wl_data_manager_shutdown(cdata);
e_comp_wl_input_shutdown(cdata);
/* remove render_post callback */
evas_event_callback_del_full(comp->evas, EVAS_CALLBACK_RENDER_POST,
_e_comp_wl_cb_render_post, NULL);
/* delete idler to flush clients */
if (cdata->idler) ecore_idler_del(cdata->idler);
@ -1759,10 +1703,6 @@ _e_comp_wl_compositor_create(void)
/* setup module idler to load shell module */
ecore_idler_add(_e_comp_wl_cb_module_idle, cdata);
/* add a render post callback so we can send frame_done to the surface */
evas_event_callback_add(comp->evas, EVAS_CALLBACK_RENDER_POST,
_e_comp_wl_cb_render_post, NULL);
return EINA_TRUE;
disp_err:
@ -3231,3 +3171,26 @@ e_comp_wl_surface_destroy(struct wl_resource *resource)
e_object_del(E_OBJECT(ec));
}
EINTERN void
e_comp_wl_buffer_reference(E_Comp_Wl_Buffer_Ref *ref, E_Comp_Wl_Buffer *buffer)
{
if ((ref->buffer) && (buffer != ref->buffer))
{
ref->buffer->busy--;
if (ref->buffer->busy == 0)
wl_resource_queue_event(ref->buffer->resource, WL_BUFFER_RELEASE);
wl_list_remove(&ref->destroy_listener.link);
}
if ((buffer) && (buffer != ref->buffer))
{
buffer->busy++;
wl_signal_add(&buffer->destroy_signal, &ref->destroy_listener);
}
ref->buffer = buffer;
ref->destroy_listener.notify = _e_comp_wl_buffer_reference_cb_destroy;
}

View File

@ -266,6 +266,7 @@ EINTERN void e_comp_wl_shutdown(void);
EINTERN struct wl_resource *e_comp_wl_surface_create(struct wl_client *client, int version, uint32_t id);
EINTERN void e_comp_wl_surface_destroy(struct wl_resource *resource);
EINTERN void e_comp_wl_buffer_reference(E_Comp_Wl_Buffer_Ref *ref, E_Comp_Wl_Buffer *buffer);
static inline uint64_t
e_comp_wl_id_get(uint32_t client, uint32_t surface)

View File

@ -605,8 +605,26 @@ e_pixmap_image_clear(E_Pixmap *cp, Eina_Bool cache)
#endif
break;
case E_PIXMAP_TYPE_WL:
/* NB: Nothing to do here. No-Op */
/* NB: Old code would memcpy here */
#if defined(HAVE_WAYLAND_CLIENTS) || defined(HAVE_WAYLAND_ONLY)
{
E_Comp_Wl_Client_Data *cd;
struct wl_resource *cb;
if ((!cp->client) || (!cp->client->comp_data)) return;
cd = (E_Comp_Wl_Client_Data*)cp->client->comp_data;
EINA_LIST_FREE(cd->frames, cb)
{
wl_callback_send_done(cb, (ecore_loop_time_get() * 1000));
wl_resource_destroy(cb);
}
/* post a buffer release */
/* TODO: FIXME: We need a way to determine if the client wants to
* keep the buffer or not. If so, then we should Not be setting NULL
* here as this will essentially release the buffer */
e_comp_wl_buffer_reference(&cd->buffer_ref, NULL);
}
#endif
break;
default:
break;