'tinyds-tdm.c',
'pixman-helper.c',
'pixman-tbm-helper.c',
- 'tinyds-tdm-renderer.c',
+ 'tinyds-renderer.c',
'protocol-trace.c',
'tinyds-policy.c',
'tinyds-dpms.c',
--- /dev/null
+#include <assert.h>
+#include <stdlib.h>
+
+#include <libds/log.h>
+
+#include "pixman-helper.h"
+#include "pixman-tbm-helper.h"
+#include "tinyds-renderer.h"
+
+static void renderer_setup_thread(struct tinyds_renderer *renderer);
+static void *renderer_thread_func(void *data);
+static void texture_destroy(struct tinyds_texture *texture);
+
+bool
+init_renderer(struct tinyds_renderer *renderer)
+{
+ renderer->damaged = false;
+
+ wl_list_init(&renderer->textures);
+
+ renderer_setup_thread(renderer);
+
+ return true;
+}
+
+void
+fini_renderer(struct tinyds_renderer *renderer)
+{
+ pthread_mutex_lock(&renderer->mutex);
+
+ renderer->destroying = true;
+ pthread_cond_signal(&renderer->cond);
+
+ pthread_mutex_unlock(&renderer->mutex);
+
+ pthread_join(renderer->worker_thread, NULL);
+
+ pthread_mutex_destroy(&renderer->mutex);
+ pthread_cond_destroy(&renderer->cond);
+}
+
+void
+renderer_set_surface_queue(struct tinyds_renderer *renderer,
+ void *surface_queue)
+{
+ pthread_mutex_lock(&renderer->mutex);
+
+ renderer->surface_queue = (tbm_surface_queue_h)surface_queue;
+
+ pthread_mutex_unlock(&renderer->mutex);
+}
+
+void
+renderer_set_bg_color(struct tinyds_renderer *renderer,
+ uint8_t r, uint8_t g, uint8_t b)
+{
+ pixman_color_t color;
+
+ pthread_mutex_lock(&renderer->mutex);
+
+ color_rgb888(&color, r, g, b);
+
+ renderer->bg_image = pixman_image_create_solid_fill(&color);
+ assert(renderer->bg_image);
+
+ renderer->damaged = true;
+
+ pthread_mutex_unlock(&renderer->mutex);
+}
+
+#ifdef USE_CURSOR
+void
+renderer_cursor_create(struct tinyds_renderer *renderer,
+ uint8_t r, uint8_t g, uint8_t b, uint32_t width, uint32_t height)
+{
+ pixman_color_t color;
+
+ pthread_mutex_lock(&renderer->mutex);
+
+ color_rgb888(&color, r, g, b);
+
+ renderer->cursor_image = pixman_image_create_solid_fill(&color);
+ assert(renderer->cursor_image);
+
+ renderer->damaged = true;
+
+ renderer->cursor.w = width;
+ renderer->cursor.h = height;
+
+ pthread_mutex_unlock(&renderer->mutex);
+}
+
+void
+renderer_cursor_destroy(struct tinyds_renderer *renderer)
+{
+ pthread_mutex_lock(&renderer->mutex);
+
+ if (renderer->cursor_image)
+ {
+ pixman_image_unref(renderer->cursor_image);
+ renderer->cursor_image = NULL;
+ }
+
+ renderer->damaged = true;
+
+ pthread_mutex_unlock(&renderer->mutex);
+}
+
+void
+renderer_cursor_update(struct tinyds_renderer *renderer,
+ uint32_t x, uint32_t y)
+{
+ pthread_mutex_lock(&renderer->mutex);
+
+ renderer->cursor.x = x;
+ renderer->cursor.y = y;
+
+ pthread_mutex_unlock(&renderer->mutex);
+}
+#endif
+
+void
+renderer_add_texture(struct tinyds_renderer *renderer,
+ tbm_surface_h tbm_surface, int x, int y)
+{
+ struct tinyds_texture *texture;
+
+ pthread_mutex_lock(&renderer->mutex);
+
+ texture = calloc(1, sizeof *texture);
+
+ texture->x = x;
+ texture->y = y;
+ texture->renderer = renderer;
+ texture->surface = tbm_surface;
+ texture->image = pixman_image_from_tbm_surface(tbm_surface,
+ DS_BUFFER_DATA_PTR_ACCESS_READ);
+
+ wl_list_insert(renderer->textures.prev, &texture->link);
+
+ ds_dbg("Add texture(%p)", texture);
+
+ pthread_mutex_unlock(&renderer->mutex);
+}
+
+void
+renderer_draw(struct tinyds_renderer *renderer)
+{
+ pthread_mutex_lock(&renderer->mutex);
+
+ renderer->damaged = true;
+ pthread_cond_signal(&renderer->cond);
+
+ pthread_mutex_unlock(&renderer->mutex);
+}
+
+static void
+renderer_setup_thread(struct tinyds_renderer *renderer)
+{
+ pthread_mutex_init(&renderer->mutex, NULL);
+ pthread_cond_init(&renderer->cond, NULL);
+ pthread_create(&renderer->worker_thread, NULL,
+ renderer_thread_func, renderer);
+}
+
+static void *
+renderer_thread_func(void *data)
+{
+ struct tinyds_renderer *renderer = data;
+ struct tinyds_texture *texture, *texture_tmp;
+ pixman_image_t *dst_image;
+ tbm_surface_h surface;
+ tbm_surface_queue_error_e err;
+
+ pthread_mutex_lock(&renderer->mutex);
+
+ while (!renderer->destroying) {
+ if (!renderer->damaged)
+ pthread_cond_wait(&renderer->cond, &renderer->mutex);
+
+ if (!renderer->damaged)
+ continue;
+
+ if (!tbm_surface_queue_can_dequeue(renderer->surface_queue, 0))
+ continue;
+
+ ds_dbg(">> BEGIN DRAW");
+
+ err = tbm_surface_queue_dequeue(renderer->surface_queue, &surface);
+ assert(err == TBM_SURFACE_QUEUE_ERROR_NONE);
+
+ dst_image = pixman_image_from_tbm_surface(surface,
+ DS_BUFFER_DATA_PTR_ACCESS_WRITE);
+
+ if (renderer->bg_image) {
+ pixman_image_composite32(PIXMAN_OP_SRC,
+ renderer->bg_image,
+ NULL,
+ dst_image,
+ 0, 0, 0, 0, 0, 0,
+ pixman_image_get_width(dst_image),
+ pixman_image_get_height(dst_image));
+ }
+
+#ifdef USE_CURSOR
+ if (renderer->cursor_image) {
+ pixman_image_composite32(PIXMAN_OP_OVER,
+ renderer->cursor_image,
+ NULL,
+ dst_image,
+ 0, 0, 0, 0,
+ renderer->cursor.x, renderer->cursor.y,
+ renderer->cursor.w, renderer->cursor.h);
+ }
+#endif
+
+ wl_list_for_each_safe(texture, texture_tmp, &renderer->textures, link) {
+ ds_dbg("Draw texture(%p)", texture);
+ pixman_image_composite32(PIXMAN_OP_OVER,
+ texture->image,
+ NULL,
+ dst_image,
+ 0, 0, 0, 0,
+ texture->x, texture->y,
+ pixman_image_get_width(texture->image),
+ pixman_image_get_height(texture->image));
+ texture_destroy(texture);
+ }
+ pixman_image_unref(dst_image);
+
+ err = tbm_surface_queue_enqueue(renderer->surface_queue, surface);
+ assert(err == TBM_SURFACE_QUEUE_ERROR_NONE);
+
+ renderer->damaged = false;
+
+ ds_dbg("<< END DRAW");
+ }
+
+ pthread_mutex_unlock(&renderer->mutex);
+
+ return NULL;
+}
+
+static void
+texture_destroy(struct tinyds_texture *texture)
+{
+ pixman_image_unref(texture->image);
+ wl_list_remove(&texture->link);
+ free(texture);
+}
--- /dev/null
+#ifndef TINYDS_RENDERER_H
+#define TINYDS_RENDERER_H
+
+#include <pthread.h>
+#include <pixman.h>
+#include <tbm_surface_queue.h>
+#include <tbm_surface.h>
+#include <wayland-server.h>
+
+#define USE_CURSOR
+
+struct tinyds_renderer
+{
+ tbm_surface_queue_h surface_queue;
+
+ struct wl_list textures;
+
+ pthread_t worker_thread;
+ pthread_mutex_t mutex;
+ pthread_cond_t cond;
+
+ pixman_image_t *bg_image;
+
+#ifdef USE_CURSOR
+ pixman_image_t *cursor_image;
+
+ struct {
+ uint32_t x, y, w, h;
+ } cursor;
+#endif
+
+ bool damaged;
+ bool destroying;
+};
+
+struct tinyds_texture
+{
+ struct tinyds_renderer *renderer;
+ pixman_image_t *image;
+ tbm_surface_h surface;
+
+ struct wl_list link;
+ struct wl_listener buffer_destroy;
+
+ int x, y;
+};
+
+bool init_renderer(struct tinyds_renderer *renderer);
+void fini_renderer(struct tinyds_renderer *renderer);
+void renderer_set_surface_queue(struct tinyds_renderer *renderer,
+ void *surface_queue);
+void renderer_set_bg_color(struct tinyds_renderer *renderer,
+ uint8_t r, uint8_t g, uint8_t b);
+void renderer_add_texture(struct tinyds_renderer *renderer,
+ tbm_surface_h tbm_surface, int x, int y);
+void renderer_draw(struct tinyds_renderer *renderer);
+
+#ifdef USE_CURSOR
+void renderer_cursor_create(struct tinyds_renderer *renderer,
+ uint8_t r, uint8_t g, uint8_t b, uint32_t width, uint32_t height);
+void renderer_cursor_destroy(struct tinyds_renderer *renderer);
+void
+renderer_cursor_update(struct tinyds_renderer *renderer,
+ uint32_t x, uint32_t y);
+#endif
+
+#endif
+++ /dev/null
-#include <assert.h>
-#include <stdlib.h>
-
-#include <libds/log.h>
-
-#include "pixman-helper.h"
-#include "pixman-tbm-helper.h"
-#include "tinyds-tdm-renderer.h"
-
-static void renderer_setup_thread(struct tinyds_renderer *renderer);
-static void *renderer_thread_func(void *data);
-static void texture_destroy(struct tinyds_texture *texture);
-
-bool
-init_renderer(struct tinyds_renderer *renderer)
-{
- renderer->damaged = false;
-
- wl_list_init(&renderer->textures);
-
- renderer_setup_thread(renderer);
-
- return true;
-}
-
-void
-fini_renderer(struct tinyds_renderer *renderer)
-{
- pthread_mutex_lock(&renderer->mutex);
-
- renderer->destroying = true;
- pthread_cond_signal(&renderer->cond);
-
- pthread_mutex_unlock(&renderer->mutex);
-
- pthread_join(renderer->worker_thread, NULL);
-
- pthread_mutex_destroy(&renderer->mutex);
- pthread_cond_destroy(&renderer->cond);
-}
-
-void
-renderer_set_surface_queue(struct tinyds_renderer *renderer,
- void *surface_queue)
-{
- pthread_mutex_lock(&renderer->mutex);
-
- renderer->surface_queue = (tbm_surface_queue_h)surface_queue;
-
- pthread_mutex_unlock(&renderer->mutex);
-}
-
-void
-renderer_set_bg_color(struct tinyds_renderer *renderer,
- uint8_t r, uint8_t g, uint8_t b)
-{
- pixman_color_t color;
-
- pthread_mutex_lock(&renderer->mutex);
-
- color_rgb888(&color, r, g, b);
-
- renderer->bg_image = pixman_image_create_solid_fill(&color);
- assert(renderer->bg_image);
-
- renderer->damaged = true;
-
- pthread_mutex_unlock(&renderer->mutex);
-}
-
-#ifdef USE_CURSOR
-void
-renderer_cursor_create(struct tinyds_renderer *renderer,
- uint8_t r, uint8_t g, uint8_t b, uint32_t width, uint32_t height)
-{
- pixman_color_t color;
-
- pthread_mutex_lock(&renderer->mutex);
-
- color_rgb888(&color, r, g, b);
-
- renderer->cursor_image = pixman_image_create_solid_fill(&color);
- assert(renderer->cursor_image);
-
- renderer->damaged = true;
-
- renderer->cursor.w = width;
- renderer->cursor.h = height;
-
- pthread_mutex_unlock(&renderer->mutex);
-}
-
-void
-renderer_cursor_destroy(struct tinyds_renderer *renderer)
-{
- pthread_mutex_lock(&renderer->mutex);
-
- if (renderer->cursor_image)
- {
- pixman_image_unref(renderer->cursor_image);
- renderer->cursor_image = NULL;
- }
-
- renderer->damaged = true;
-
- pthread_mutex_unlock(&renderer->mutex);
-}
-
-void
-renderer_cursor_update(struct tinyds_renderer *renderer,
- uint32_t x, uint32_t y)
-{
- pthread_mutex_lock(&renderer->mutex);
-
- renderer->cursor.x = x;
- renderer->cursor.y = y;
-
- pthread_mutex_unlock(&renderer->mutex);
-}
-#endif
-
-void
-renderer_add_texture(struct tinyds_renderer *renderer,
- tbm_surface_h tbm_surface, int x, int y)
-{
- struct tinyds_texture *texture;
-
- pthread_mutex_lock(&renderer->mutex);
-
- texture = calloc(1, sizeof *texture);
-
- texture->x = x;
- texture->y = y;
- texture->renderer = renderer;
- texture->surface = tbm_surface;
- texture->image = pixman_image_from_tbm_surface(tbm_surface,
- DS_BUFFER_DATA_PTR_ACCESS_READ);
-
- wl_list_insert(renderer->textures.prev, &texture->link);
-
- ds_dbg("Add texture(%p)", texture);
-
- pthread_mutex_unlock(&renderer->mutex);
-}
-
-void
-renderer_draw(struct tinyds_renderer *renderer)
-{
- pthread_mutex_lock(&renderer->mutex);
-
- renderer->damaged = true;
- pthread_cond_signal(&renderer->cond);
-
- pthread_mutex_unlock(&renderer->mutex);
-}
-
-static void
-renderer_setup_thread(struct tinyds_renderer *renderer)
-{
- pthread_mutex_init(&renderer->mutex, NULL);
- pthread_cond_init(&renderer->cond, NULL);
- pthread_create(&renderer->worker_thread, NULL,
- renderer_thread_func, renderer);
-}
-
-static void *
-renderer_thread_func(void *data)
-{
- struct tinyds_renderer *renderer = data;
- struct tinyds_texture *texture, *texture_tmp;
- pixman_image_t *dst_image;
- tbm_surface_h surface;
- tbm_surface_queue_error_e err;
-
- pthread_mutex_lock(&renderer->mutex);
-
- while (!renderer->destroying) {
- if (!renderer->damaged)
- pthread_cond_wait(&renderer->cond, &renderer->mutex);
-
- if (!renderer->damaged)
- continue;
-
- if (!tbm_surface_queue_can_dequeue(renderer->surface_queue, 0))
- continue;
-
- ds_dbg(">> BEGIN DRAW");
-
- err = tbm_surface_queue_dequeue(renderer->surface_queue, &surface);
- assert(err == TBM_SURFACE_QUEUE_ERROR_NONE);
-
- dst_image = pixman_image_from_tbm_surface(surface,
- DS_BUFFER_DATA_PTR_ACCESS_WRITE);
-
- if (renderer->bg_image) {
- pixman_image_composite32(PIXMAN_OP_SRC,
- renderer->bg_image,
- NULL,
- dst_image,
- 0, 0, 0, 0, 0, 0,
- pixman_image_get_width(dst_image),
- pixman_image_get_height(dst_image));
- }
-
-#ifdef USE_CURSOR
- if (renderer->cursor_image) {
- pixman_image_composite32(PIXMAN_OP_OVER,
- renderer->cursor_image,
- NULL,
- dst_image,
- 0, 0, 0, 0,
- renderer->cursor.x, renderer->cursor.y,
- renderer->cursor.w, renderer->cursor.h);
- }
-#endif
-
- wl_list_for_each_safe(texture, texture_tmp, &renderer->textures, link) {
- ds_dbg("Draw texture(%p)", texture);
- pixman_image_composite32(PIXMAN_OP_OVER,
- texture->image,
- NULL,
- dst_image,
- 0, 0, 0, 0,
- texture->x, texture->y,
- pixman_image_get_width(texture->image),
- pixman_image_get_height(texture->image));
- texture_destroy(texture);
- }
- pixman_image_unref(dst_image);
-
- err = tbm_surface_queue_enqueue(renderer->surface_queue, surface);
- assert(err == TBM_SURFACE_QUEUE_ERROR_NONE);
-
- renderer->damaged = false;
-
- ds_dbg("<< END DRAW");
- }
-
- pthread_mutex_unlock(&renderer->mutex);
-
- return NULL;
-}
-
-static void
-texture_destroy(struct tinyds_texture *texture)
-{
- pixman_image_unref(texture->image);
- wl_list_remove(&texture->link);
- free(texture);
-}
+++ /dev/null
-#ifndef EXAMPLES_TINYDS_TDM_RENDERER_H
-#define EXAMPLES_TINYDS_TDM_RENDERER_H
-
-#include <pthread.h>
-#include <pixman.h>
-#include <tbm_surface_queue.h>
-#include <tbm_surface.h>
-#include <wayland-server.h>
-
-#define USE_CURSOR
-
-struct tinyds_renderer
-{
- tbm_surface_queue_h surface_queue;
-
- struct wl_list textures;
-
- pthread_t worker_thread;
- pthread_mutex_t mutex;
- pthread_cond_t cond;
-
- pixman_image_t *bg_image;
-
-#ifdef USE_CURSOR
- pixman_image_t *cursor_image;
-
- struct {
- uint32_t x, y, w, h;
- } cursor;
-#endif
-
- bool damaged;
- bool destroying;
-};
-
-struct tinyds_texture
-{
- struct tinyds_renderer *renderer;
- pixman_image_t *image;
- tbm_surface_h surface;
-
- struct wl_list link;
- struct wl_listener buffer_destroy;
-
- int x, y;
-};
-
-bool init_renderer(struct tinyds_renderer *renderer);
-void fini_renderer(struct tinyds_renderer *renderer);
-void renderer_set_surface_queue(struct tinyds_renderer *renderer,
- void *surface_queue);
-void renderer_set_bg_color(struct tinyds_renderer *renderer,
- uint8_t r, uint8_t g, uint8_t b);
-void renderer_add_texture(struct tinyds_renderer *renderer,
- tbm_surface_h tbm_surface, int x, int y);
-void renderer_draw(struct tinyds_renderer *renderer);
-
-#ifdef USE_CURSOR
-void renderer_cursor_create(struct tinyds_renderer *renderer,
- uint8_t r, uint8_t g, uint8_t b, uint32_t width, uint32_t height);
-void renderer_cursor_destroy(struct tinyds_renderer *renderer);
-void
-renderer_cursor_update(struct tinyds_renderer *renderer,
- uint32_t x, uint32_t y);
-#endif
-
-#endif
#ifdef USE_TDM_BUFFER_QUEUE
#include "pixman-tbm-helper.h"
-#include "tinyds-tdm-renderer.h"
+#include "tinyds-renderer.h"
#else
#include <libds/swapchain.h>
#endif