#include <libds/xdg_shell.h>
#include <libds-tizen/allocator/tbm.h>
#include <libds-tizen/backend/tdm.h>
+#include <libds-tizen/tbm_server.h>
#define USE_TDM_BUFFER_QUEUE
#include <libds/swapchain.h>
#endif
-#include "tbm-server-helper.h"
#include "pixman-helper.h"
#define TINYDS_UNUSED __attribute__((unused))
struct tinyds_server
{
- struct tbm_server tbm_server;
+ struct ds_tbm_server *tbm_server;
struct wl_display *display;
res = init_server(server, display);
assert(res);
- res = tbm_server_init_display(&server->tbm_server, display);
- assert(res);
-
socket = wl_display_add_socket_auto(display);
assert(socket);
return false;
}
+ server->tbm_server = ds_tbm_server_create(display);
+ if (!server->tbm_server) {
+ ds_backend_destroy(server->backend);
+ return false;
+ }
+
server->xdg_shell = ds_xdg_shell_create(display);
if (!server->xdg_shell) {
ds_backend_destroy(server->backend);
wl_list_for_each(view, &output->server->views, link) {
struct ds_buffer *ds_buffer;
- struct tbm_client_buffer *buffer;
+ struct ds_tbm_client_buffer *tbm_buffer;
tbm_surface_h surface;
if (!view->mapped)
ds_buffer = ds_surface_get_buffer(
ds_xdg_surface_get_surface(view->xdg_surface));
- assert(buffer);
+ assert(ds_buffer);
- buffer = tbm_client_buffer_from_buffer(ds_buffer);
- assert(buffer);
+ tbm_buffer = ds_tbm_client_buffer_from_buffer(ds_buffer);
+ assert(tbm_buffer);
- surface = tbm_client_buffer_get_tbm_surface(buffer);
+ surface = ds_tbm_client_buffer_get_tbm_surface(tbm_buffer);
renderer_add_texture(&output->renderer, surface, view->x, view->y);
-#include "tbm-server-helper.h"
-
#include <assert.h>
#include <stdbool.h>
#include <stdlib.h>
-#include <drm_fourcc.h>
+
#include <tbm_bufmgr.h>
-#include <libds/log.h>
+
+#include "libds/log.h"
+#include "pixel_format.h"
+#include "tbm_server.h"
static const struct ds_buffer_resource_interface tbm_buffer_resource_iface;
static const struct ds_buffer_interface tbm_client_buffer_iface;
static void tbm_server_handle_display_destroy(struct wl_listener *listener,
void *data);
-static struct tbm_client_buffer *
-tbm_client_buffer_create(struct wl_resource *resource);
-bool
-tbm_server_init_display(struct tbm_server *tbm, struct wl_display *display)
+WL_EXPORT struct ds_tbm_server *
+ds_tbm_server_create(struct wl_display *display)
{
+ struct ds_tbm_server *tbm;
tbm_bufmgr bufmgr;
+ tbm = calloc(1, sizeof *tbm);
+ if (!tbm)
+ return NULL;
+
+ wl_signal_init(&tbm->events.destroy);
+
tbm->wl_tbm = wayland_tbm_server_init(display, NULL, -1, 0);
if (!tbm->wl_tbm) {
- return false;
+ goto err_wl_tbm;
}
bufmgr = wayland_tbm_server_get_bufmgr(tbm->wl_tbm);
if (!bufmgr) {
- wayland_tbm_server_deinit(tbm->wl_tbm);
- return false;
+ goto err_bind;
}
if (!tbm_bufmgr_bind_native_display(bufmgr, (void *)display)) {
- wayland_tbm_server_deinit(tbm->wl_tbm);
- return false;
+ goto err_bind;
}
- ds_buffer_register_resource_interface(&tbm_buffer_resource_iface);
-
tbm->display_destroy.notify = tbm_server_handle_display_destroy;
wl_display_add_destroy_listener(display, &tbm->display_destroy);
- return true;
+ ds_buffer_register_resource_interface(&tbm_buffer_resource_iface);
+
+ return tbm;
+
+err_bind:
+ wayland_tbm_server_deinit(tbm->wl_tbm);
+err_wl_tbm:
+ free(tbm);
+
+ return NULL;
}
-struct tbm_client_buffer *
-tbm_client_buffer_from_buffer(struct ds_buffer *ds_buffer)
+WL_EXPORT void
+ds_tbm_server_add_destroy_listener(struct ds_tbm_server *tbm,
+ struct wl_listener *listener)
{
- assert(ds_buffer->iface == &tbm_client_buffer_iface);
- return (struct tbm_client_buffer *)ds_buffer;
+ wl_signal_add(&tbm->events.destroy, listener);
+}
+
+WL_EXPORT struct ds_tbm_client_buffer *
+ds_tbm_client_buffer_from_buffer(struct ds_buffer *ds_buffer)
+{
+ if (ds_buffer->iface != &tbm_client_buffer_iface)
+ return NULL;
+ return (struct ds_tbm_client_buffer *)ds_buffer;
}
-tbm_surface_h
-tbm_client_buffer_get_tbm_surface(struct tbm_client_buffer *buffer)
+WL_EXPORT tbm_surface_h
+ds_tbm_client_buffer_get_tbm_surface(struct ds_tbm_client_buffer *buffer)
{
+ if (buffer->base.iface != &tbm_client_buffer_iface)
+ return NULL;
return buffer->surface;
}
static void
tbm_server_handle_display_destroy(struct wl_listener *listener, void *data)
{
- struct tbm_server *tbm;
+ struct ds_tbm_server *tbm;
tbm = wl_container_of(listener, tbm, display_destroy);
+
+ wl_signal_emit(&tbm->events.destroy, tbm);
+
wayland_tbm_server_deinit(tbm->wl_tbm);
+ free(tbm);
}
-static bool
-tbm_buffer_resource_iface_is_instance(struct wl_resource *resource)
+static void
+tbm_client_buffer_handle_release(struct wl_listener *listener, void *data)
{
- return !!wayland_tbm_server_get_surface(NULL, resource);
+ struct ds_tbm_client_buffer *buffer;
+
+ buffer = wl_container_of(listener, buffer, buffer_release);
+ if (buffer->resource)
+ wl_buffer_send_release(buffer->resource);
}
static void
tbm_client_buffer_handle_resource_destroy(struct wl_listener *listener,
void *data)
{
- struct tbm_client_buffer *buffer;
+ struct ds_tbm_client_buffer *buffer;
buffer = wl_container_of(listener, buffer, resource_destroy);
ds_buffer_drop(&buffer->base);
}
-static struct tbm_client_buffer *
-tbm_client_buffer_get_or_create(struct wl_resource *resource)
-{
- struct tbm_client_buffer *buffer;
- struct wl_listener *resource_destroy_listener;
-
- resource_destroy_listener = wl_resource_get_destroy_listener(resource,
- tbm_client_buffer_handle_resource_destroy);;
- if (resource_destroy_listener) {
- buffer = wl_container_of(resource_destroy_listener,
- buffer, resource_destroy);
- return buffer;
- }
-
- return tbm_client_buffer_create(resource);
-}
-
-static struct ds_buffer *
-tbm_buffer_resource_iface_from_resource(struct wl_resource *resource)
+static struct ds_tbm_client_buffer *
+tbm_client_buffer_from_buffer(struct ds_buffer *ds_buffer)
{
- struct tbm_client_buffer *buffer;
-
- buffer = tbm_client_buffer_get_or_create(resource);
- assert(buffer);
-
- return &buffer->base;
+ assert(ds_buffer->iface == &tbm_client_buffer_iface);
+ return (struct ds_tbm_client_buffer *)ds_buffer;
}
-static const struct ds_buffer_resource_interface tbm_buffer_resource_iface = {
- .name = "tbm",
- .is_instance = tbm_buffer_resource_iface_is_instance,
- .from_resource = tbm_buffer_resource_iface_from_resource,
-};
-
static void
-tbm_client_buffer_destroy(struct ds_buffer *ds_buffer)
+tbm_client_buffer_iface_destroy(struct ds_buffer *ds_buffer)
{
- struct tbm_client_buffer *buffer;
+ struct ds_tbm_client_buffer *buffer;
buffer = tbm_client_buffer_from_buffer(ds_buffer);
}
static bool
-tbm_client_buffer_begin_data_ptr_access(struct ds_buffer *ds_buffer,
+tbm_client_buffer_iface_begin_data_ptr_access(struct ds_buffer *ds_buffer,
enum ds_buffer_data_ptr_access_flag flags, void **data,
uint32_t *format, size_t *stride)
{
- struct tbm_client_buffer *buffer;
+ struct ds_tbm_client_buffer *buffer;
tbm_surface_info_s info;
tbm_bo_access_option op = TBM_OPTION_NONE;
int err;
return false;
}
- *format = DRM_FORMAT_XRGB8888; // FIXME
+ *format = convert_tbm_format_to_drm(buffer->format);
*stride = info.planes[0].stride;
*data = info.planes[0].ptr;
}
static void
-tbm_client_buffer_end_data_ptr_access(struct ds_buffer *ds_buffer)
+tbm_client_buffer_iface_end_ptr_access(struct ds_buffer *ds_buffer)
{
- struct tbm_client_buffer *buffer;
+ struct ds_tbm_client_buffer *buffer;
buffer = tbm_client_buffer_from_buffer(ds_buffer);
}
static const struct ds_buffer_interface tbm_client_buffer_iface = {
- .destroy = tbm_client_buffer_destroy,
- .begin_data_ptr_access = tbm_client_buffer_begin_data_ptr_access,
- .end_data_ptr_access = tbm_client_buffer_end_data_ptr_access,
+ .destroy = tbm_client_buffer_iface_destroy,
+ .begin_data_ptr_access = tbm_client_buffer_iface_begin_data_ptr_access,
+ .end_data_ptr_access = tbm_client_buffer_iface_end_ptr_access,
};
-static void
-tbm_client_buffer_handle_release(struct wl_listener *listener, void *data)
-{
- struct tbm_client_buffer *buffer;
-
- buffer = wl_container_of(listener, buffer, buffer_release);
- if (buffer->resource)
- wl_buffer_send_release(buffer->resource);
-}
-
-static struct tbm_client_buffer *
+static struct ds_tbm_client_buffer *
tbm_client_buffer_create(struct wl_resource *resource)
{
- struct tbm_client_buffer *buffer;
+ struct ds_tbm_client_buffer *buffer;
tbm_surface_h surface;
int32_t width, height;
surface = wayland_tbm_server_get_surface(NULL, resource);
- assert(surface);
+ if (!surface) {
+ ds_err("Could not get tbm_surface from wl_resource@%d",
+ wl_resource_get_id(resource));
+ return NULL;
+ }
width = tbm_surface_get_width(surface);
height = tbm_surface_get_height(surface);
buffer = calloc(1, sizeof *buffer);
- assert(buffer);
+ if (!buffer)
+ return NULL;
ds_buffer_init(&buffer->base, &tbm_client_buffer_iface, width, height);
return buffer;
}
+
+static struct ds_tbm_client_buffer *
+tbm_client_buffer_get_or_create(struct wl_resource *resource)
+{
+ struct ds_tbm_client_buffer *buffer;
+ struct wl_listener *resource_destroy_listener;
+
+ resource_destroy_listener = wl_resource_get_destroy_listener(resource,
+ tbm_client_buffer_handle_resource_destroy);;
+ if (resource_destroy_listener) {
+ buffer = wl_container_of(resource_destroy_listener,
+ buffer, resource_destroy);
+ return buffer;
+ }
+
+ return tbm_client_buffer_create(resource);
+}
+
+static bool
+tbm_buffer_resource_iface_is_instance(struct wl_resource *resource)
+{
+ return !!wayland_tbm_server_get_surface(NULL, resource);
+}
+
+static struct ds_buffer *
+tbm_buffer_resource_iface_from_resource(struct wl_resource *resource)
+{
+ struct ds_tbm_client_buffer *buffer;
+
+ buffer = tbm_client_buffer_get_or_create(resource);
+ if (!buffer) {
+ ds_err("Could not get or create ds_tbm_client_buffer");
+ return NULL;
+ }
+
+ return &buffer->base;
+}
+
+static const struct ds_buffer_resource_interface tbm_buffer_resource_iface = {
+ .name = "tbm",
+ .is_instance = tbm_buffer_resource_iface_is_instance,
+ .from_resource = tbm_buffer_resource_iface_from_resource,
+};