From: SooChan Lim Date: Thu, 27 Oct 2022 09:00:24 +0000 (+0900) Subject: examples: rename tinyds-tdm-renderer to tinyds-renderer X-Git-Tag: accepted/tizen/unified/20230106.165108~5 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=a9dec0abae49810824db59352ae2ff825b8d072e;p=platform%2Fcore%2Fuifw%2Flibds-tizen.git examples: rename tinyds-tdm-renderer to tinyds-renderer Change-Id: I7d897f44a0042fb16d8efe9d6d656aec820d54f2 --- diff --git a/examples/meson.build b/examples/meson.build index 85b8165..23156e1 100644 --- a/examples/meson.build +++ b/examples/meson.build @@ -19,7 +19,7 @@ tinyds_tdm_files = [ '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', diff --git a/examples/tinyds-renderer.c b/examples/tinyds-renderer.c new file mode 100644 index 0000000..24c40d3 --- /dev/null +++ b/examples/tinyds-renderer.c @@ -0,0 +1,250 @@ +#include +#include + +#include + +#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); +} diff --git a/examples/tinyds-renderer.h b/examples/tinyds-renderer.h new file mode 100644 index 0000000..b2dc234 --- /dev/null +++ b/examples/tinyds-renderer.h @@ -0,0 +1,67 @@ +#ifndef TINYDS_RENDERER_H +#define TINYDS_RENDERER_H + +#include +#include +#include +#include +#include + +#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 diff --git a/examples/tinyds-tdm-renderer.c b/examples/tinyds-tdm-renderer.c deleted file mode 100644 index dd891b6..0000000 --- a/examples/tinyds-tdm-renderer.c +++ /dev/null @@ -1,250 +0,0 @@ -#include -#include - -#include - -#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); -} diff --git a/examples/tinyds-tdm-renderer.h b/examples/tinyds-tdm-renderer.h deleted file mode 100644 index 943e2be..0000000 --- a/examples/tinyds-tdm-renderer.h +++ /dev/null @@ -1,67 +0,0 @@ -#ifndef EXAMPLES_TINYDS_TDM_RENDERER_H -#define EXAMPLES_TINYDS_TDM_RENDERER_H - -#include -#include -#include -#include -#include - -#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 diff --git a/examples/tinyds-tdm.h b/examples/tinyds-tdm.h index 0359ec0..413cebd 100644 --- a/examples/tinyds-tdm.h +++ b/examples/tinyds-tdm.h @@ -5,7 +5,7 @@ #ifdef USE_TDM_BUFFER_QUEUE #include "pixman-tbm-helper.h" -#include "tinyds-tdm-renderer.h" +#include "tinyds-renderer.h" #else #include #endif