e_comp_wl_renderer_init();
_e_comp_wl_move_resize_init();
e_presentation_time_init();
+ e_single_pixel_buffer_manager_init();
if (!e_foreign_global_init(e_comp_wl->wl.disp))
ELOGF("COMP", "Failed to initialize the e_foreign global", NULL);
E_FREE_LIST(hooks, e_client_hook_del);
_e_comp_wl_gl_shutdown();
+ e_single_pixel_buffer_manager_shutdown();
e_presentation_time_shutdown();
e_comp_wl_renderer_shutdown();
e_comp_wl_capture_shutdown();
E_Comp_Wl_Buffer *buffer = NULL;
struct wl_listener *listener;
struct wl_shm_buffer *shmbuff;
+ E_Single_Pixel_Buffer *single_pixel_buffer;
Eina_Bool res;
listener =
buffer->format = wl_shm_buffer_get_format(shmbuff);
buffer->shm_buffer = shmbuff;
}
- else
+
+ if (!buffer->type)
+ {
+ single_pixel_buffer = e_single_pixel_buffer_manager_buffer_get(resource);
+ if (single_pixel_buffer)
+ {
+ buffer->type = E_COMP_WL_BUFFER_TYPE_SINGLE_PIXEL;
+ buffer->w = 1;
+ buffer->h = 1;
+ buffer->format = WL_SHM_FORMAT_ARGB8888;
+ buffer->single_pixel_buffer = single_pixel_buffer;
+ }
+ }
+
+ if (!buffer->type)
{
/* TODO: This option is temporarily. It will be removed later. */
/* prefer to use native buffer(wl_buffer) */
--- /dev/null
+#include "e.h"
+#include <single-pixel-buffer-v1-server-protocol.h>
+
+static E_Single_Pixel_Buffer_Manager *_single_pixel_buffer_mgr = NULL;
+
+static void
+_single_pixel_buffer_manager_destroy(struct wl_client *client, struct wl_resource *resource)
+{
+ wl_resource_destroy(resource);
+}
+
+static void
+_single_pixel_buffer_cb_resource_destroy(struct wl_resource *resource)
+{
+ E_Single_Pixel_Buffer *single_pixel_buffer;
+
+ single_pixel_buffer = wl_resource_get_user_data(resource);
+ if (!single_pixel_buffer) return;
+
+ free(single_pixel_buffer);
+}
+
+static void
+_single_pixel_buffer_destroy(struct wl_client *client, struct wl_resource *resource)
+{
+ wl_resource_destroy(resource);
+}
+
+static const struct wl_buffer_interface single_pixel_buffer_implementation = {
+ _single_pixel_buffer_destroy,
+};
+
+static void
+_single_pixel_buffer_manager_create_u32_rgba_buffer(struct wl_client *client,
+ struct wl_resource *resource,
+ uint32_t id,
+ uint32_t r,
+ uint32_t g,
+ uint32_t b,
+ uint32_t a)
+{
+ E_Single_Pixel_Buffer *single_pixel_buffer;
+
+ single_pixel_buffer = E_NEW(E_Single_Pixel_Buffer, 1);
+ if (!single_pixel_buffer)
+ {
+ wl_client_post_no_memory(client);
+ return;
+ }
+
+ single_pixel_buffer->buffer = wl_resource_create(client, &wl_buffer_interface, 1, id);
+ if (!single_pixel_buffer->buffer)
+ {
+ free(single_pixel_buffer);
+ wl_client_post_no_memory(client);
+ return;
+ }
+
+ wl_resource_set_implementation(single_pixel_buffer->buffer, &single_pixel_buffer_implementation,
+ single_pixel_buffer, _single_pixel_buffer_cb_resource_destroy);
+
+ single_pixel_buffer->r = r;
+ single_pixel_buffer->g = g;
+ single_pixel_buffer->b = b;
+ single_pixel_buffer->a = a;
+
+ single_pixel_buffer->data = (((uint32_t)((a / (double)0xffffffff) * 255)) << 24) |
+ (((uint32_t)((r / (double)0xffffffff) * 255)) << 16) |
+ (((uint32_t)((g / (double)0xffffffff) * 255)) << 8) |
+ ((uint32_t)((b / (double)0xffffffff) * 255));
+
+ ELOGF("SPBUF", "Create Single Pixel Buffer:%p r(%x) g(%x) b(%x) a(%x) data(%x)",
+ NULL, single_pixel_buffer, r, g, b, a, single_pixel_buffer->data);
+}
+
+static const struct wp_single_pixel_buffer_manager_v1_interface single_pixel_buffer_manager_implementation = {
+ _single_pixel_buffer_manager_destroy,
+ _single_pixel_buffer_manager_create_u32_rgba_buffer
+};
+
+static void
+_single_pixel_buffer_manager_cb_bind(struct wl_client *client, void *data, uint32_t version, uint32_t id)
+{
+ struct wl_resource *resource;
+
+ resource = wl_resource_create(client, &wp_single_pixel_buffer_manager_v1_interface, version, id);
+ if (!resource)
+ {
+ wl_client_post_no_memory(client);
+ return;
+ }
+
+ wl_resource_set_implementation(resource, &single_pixel_buffer_manager_implementation,
+ NULL, NULL);
+}
+
+EINTERN Eina_Bool
+e_single_pixel_buffer_manager_init(void)
+{
+ E_Single_Pixel_Buffer_Manager *single_pixel_buffer_mgr;
+
+ EINA_SAFETY_ON_NULL_RETURN_VAL(e_comp_wl, EINA_FALSE);
+ EINA_SAFETY_ON_NULL_RETURN_VAL(e_comp_wl->wl.disp, EINA_FALSE);
+
+ if (_single_pixel_buffer_mgr) return EINA_TRUE;
+
+ single_pixel_buffer_mgr = E_NEW(E_Single_Pixel_Buffer_Manager, 1);
+ EINA_SAFETY_ON_NULL_GOTO(single_pixel_buffer_mgr, fail);
+
+ single_pixel_buffer_mgr->global = wl_global_create(e_comp_wl->wl.disp,
+ &wp_single_pixel_buffer_manager_v1_interface,
+ 1,
+ NULL,
+ _single_pixel_buffer_manager_cb_bind);
+ EINA_SAFETY_ON_NULL_GOTO(single_pixel_buffer_mgr->global, fail);
+
+ _single_pixel_buffer_mgr = single_pixel_buffer_mgr;
+
+ return EINA_TRUE;
+
+fail:
+ if (single_pixel_buffer_mgr)
+ free(single_pixel_buffer_mgr);
+
+ return EINA_FALSE;
+}
+
+EINTERN void
+e_single_pixel_buffer_manager_shutdown(void)
+{
+ E_Single_Pixel_Buffer_Manager *single_pixel_buffer_mgr;
+
+ single_pixel_buffer_mgr = _single_pixel_buffer_mgr;
+ if (!single_pixel_buffer_mgr) return;
+
+ wl_global_destroy(single_pixel_buffer_mgr->global);
+ free(single_pixel_buffer_mgr);
+
+ _single_pixel_buffer_mgr = NULL;
+}
+
+EINTERN E_Single_Pixel_Buffer *
+e_single_pixel_buffer_manager_buffer_get(struct wl_resource *resource)
+{
+ EINA_SAFETY_ON_NULL_RETURN_VAL(resource, NULL);
+
+ if (wl_resource_instance_of(resource, &wl_buffer_interface,
+ &single_pixel_buffer_implementation))
+ return wl_resource_get_user_data(resource);
+ else
+ return NULL;
+}