From 9830fe626249151ae7ca1a179158ed99037300bd Mon Sep 17 00:00:00 2001 From: SooChan Lim Date: Mon, 13 Sep 2021 14:37:59 +0900 Subject: [PATCH] tdm: add pepper_tdm_output_create_renderer function The tdm provides the pepper_tdm_renderer_t and the pepper_tdm_renderer_iface_t. The tdm compositor can make own renderer implementations with pepper_tdm_output_create_renderer function on a pepper_tdm_output. Change-Id: Ic50ea9e241f7042bfe6d90503c826bcf333efd15 --- src/lib/tdm/Makefile.am | 3 +- src/lib/tdm/pepper-tdm.h | 43 ++++++++++ src/lib/tdm/tdm-internal.h | 18 +++++ src/lib/tdm/tdm-renderer.c | 158 +++++++++++++++++++++++++++++++++++++ 4 files changed, 221 insertions(+), 1 deletion(-) create mode 100644 src/lib/tdm/tdm-renderer.c diff --git a/src/lib/tdm/Makefile.am b/src/lib/tdm/Makefile.am index e52cac1..eb8b821 100644 --- a/src/lib/tdm/Makefile.am +++ b/src/lib/tdm/Makefile.am @@ -11,4 +11,5 @@ libpepper_tdm_la_LIBADD = $(PEPPER_TDM_LIBS) libpepper_tdm_la_SOURCES = tdm-internal.h \ tdm-common.c \ tdm-output.c \ - tdm-hwc.c + tdm-hwc.c \ + tdm-renderer.c diff --git a/src/lib/tdm/pepper-tdm.h b/src/lib/tdm/pepper-tdm.h index 90b2698..886b342 100644 --- a/src/lib/tdm/pepper-tdm.h +++ b/src/lib/tdm/pepper-tdm.h @@ -38,6 +38,40 @@ extern "C" { typedef struct pepper_tdm pepper_tdm_t; typedef struct pepper_tdm_output pepper_tdm_output_t; +typedef struct pepper_tdm_renderer pepper_tdm_renderer_t; +typedef struct pepper_tdm_renderer_iface pepper_tdm_renderer_iface_t; + +struct pepper_tdm_renderer_iface { + /** + * destroy a renderer. + */ + void (*destroy)(void *renderer_data); + + /** + * setup a renderer. + */ + pepper_bool_t (*setup)(void *renderer_data); + + /** + * attach a surface + */ + pepper_bool_t (*attach_surface)(void *renderer_data, + pepper_surface_t *surface, + int *w, int *h); + + /** + * flush a surface damage + */ + pepper_bool_t (*flush_surface_damage)(void *renderer_data, + pepper_surface_t *surface); + + /** + * Render once. + */ + pepper_bool_t (*render_once)(void *renderer_data, + const pepper_list_t *render_list, + pepper_region_t *damage); +}; PEPPER_API pepper_tdm_t * pepper_tdm_create(pepper_compositor_t *compositor); @@ -60,6 +94,15 @@ pepper_tdm_output_get_pixel_size(pepper_tdm_output_t *output, uint32_t *w, uint3 PEPPER_API tbm_surface_queue_h pepper_tdm_output_get_display_buffer_queue(pepper_tdm_output_t *output); +PEPPER_API pepper_tdm_renderer_t * +pepper_tdm_output_create_renderer(pepper_tdm_output_t *output, + const pepper_tdm_renderer_iface_t *renderer_iface, + tbm_surface_queue_h tsurface_queue, + void *renderer_data); + +PEPPER_API void +pepper_tdm_renderer_destroy(pepper_tdm_renderer_t *renderer); + #ifdef __cplusplus } #endif diff --git a/src/lib/tdm/tdm-internal.h b/src/lib/tdm/tdm-internal.h index d238233..28ec84a 100644 --- a/src/lib/tdm/tdm-internal.h +++ b/src/lib/tdm/tdm-internal.h @@ -84,6 +84,7 @@ struct pepper_tdm_output { tbm_surface_queue_h tbm_surface_queue; tdm_render_type_t render_type; + pepper_renderer_t *renderer; pepper_render_target_t *render_target; @@ -167,6 +168,12 @@ struct pepper_tdm_hwc_commit_data { pepper_list_t window_commit_data_list; }; +struct pepper_tdm_renderer { + tbm_surface_queue_h tsurface_queue; + const pepper_tdm_renderer_iface_t *iface; + void *data; +}; + int pepper_tdm_output_init(pepper_tdm_t *tdm); void pepper_tdm_output_commit_cb(pepper_tdm_output_t *output, unsigned int sequence, @@ -178,4 +185,15 @@ pepper_bool_t pepper_tdm_hwc_evaluate(pepper_tdm_hwc_t *hwc, const pepper_list_t pepper_bool_t pepper_tdm_hwc_commit(pepper_tdm_hwc_t *hwc); pepper_bool_t pepper_tdm_hwc_set_client_target_buffer(pepper_tdm_hwc_t *hwc, tbm_surface_h tsurface); +void pepper_tdm_renderer_destroy(pepper_tdm_renderer_t *renderer); +pepper_bool_t pepper_tdm_renderer_setup(pepper_tdm_renderer_t *renderer); +pepper_bool_t pepper_tdm_renderer_attach_surface(pepper_tdm_renderer_t *renderer, + pepper_surface_t *surface, + int *w, int *h); +pepper_bool_t pepper_tdm_renderer_flush_surface_damage(pepper_tdm_renderer_t *renderer, + pepper_surface_t *surface); +pepper_bool_t pepper_tdm_renderer_render_once(pepper_tdm_renderer_t *renderer, + const pepper_list_t *render_list, + pepper_region_t *damage); + #endif /* DRM_INTERNAL_H */ diff --git a/src/lib/tdm/tdm-renderer.c b/src/lib/tdm/tdm-renderer.c new file mode 100644 index 0000000..6c055e8 --- /dev/null +++ b/src/lib/tdm/tdm-renderer.c @@ -0,0 +1,158 @@ +/* +* Copyright © 2021 Samsung Electronics co., Ltd. All Rights Reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a +* copy of this software and associated documentation files (the "Software"), +* to deal in the Software without restriction, including without limitation +* the rights to use, copy, modify, merge, publish, distribute, sublicense, +* and/or sell copies of the Software, and to permit persons to whom the +* Software is furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice (including the next +* paragraph) shall be included in all copies or substantial portions of the +* Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +* DEALINGS IN THE SOFTWARE. +*/ + +#include "tdm-internal.h" + +pepper_bool_t +pepper_tdm_renderer_setup(pepper_tdm_renderer_t *renderer) +{ + PEPPER_INFO("\n"); + + pepper_bool_t ret; + + PEPPER_CHECK(renderer != NULL, return PEPPER_FALSE, + "renderer is null.\n"); + PEPPER_CHECK(renderer->iface != NULL, return PEPPER_FALSE, + "renderer->iface is null.\n"); + PEPPER_CHECK(renderer->iface->setup != NULL, return PEPPER_FALSE, + "renderer->iface->setup() is null.\n"); + + ret = renderer->iface->setup(renderer->data); + + return ret; +} + +pepper_bool_t +pepper_tdm_renderer_attach_surface(pepper_tdm_renderer_t *renderer, + pepper_surface_t *surface, + int *w, int *h) +{ + PEPPER_INFO("\n"); + + pepper_bool_t ret; + + PEPPER_CHECK(renderer != NULL, return PEPPER_FALSE, + "renderer is null.\n"); + PEPPER_CHECK(renderer->iface != NULL, return PEPPER_FALSE, + "renderer->iface is null.\n"); + PEPPER_CHECK(renderer->iface->setup != NULL, return PEPPER_FALSE, + "renderer->iface->setup() is null.\n"); + + ret = renderer->iface->attach_surface(renderer->data, surface, w, h); + + return ret; +} + +pepper_bool_t +pepper_tdm_renderer_flush_surface_damage(pepper_tdm_renderer_t *renderer, + pepper_surface_t *surface) +{ + PEPPER_INFO("\n"); + + pepper_bool_t ret; + + PEPPER_CHECK(renderer != NULL, return PEPPER_FALSE, + "renderer is null.\n"); + PEPPER_CHECK(renderer->iface != NULL, return PEPPER_FALSE, + "renderer->iface is null.\n"); + PEPPER_CHECK(renderer->iface->setup != NULL, return PEPPER_FALSE, + "renderer->iface->setup() is null.\n"); + + ret = renderer->iface->flush_surface_damage(renderer->data, surface); + + return ret; +} + +pepper_bool_t +pepper_tdm_renderer_render_once(pepper_tdm_renderer_t *renderer, + const pepper_list_t *render_list, + pepper_region_t *damage) +{ + PEPPER_INFO("\n"); + + pepper_bool_t ret; + + PEPPER_CHECK(renderer != NULL, return PEPPER_FALSE, + "renderer is null.\n"); + PEPPER_CHECK(renderer->iface != NULL, return PEPPER_FALSE, + "renderer->iface is null.\n"); + PEPPER_CHECK(renderer->iface->setup != NULL, return PEPPER_FALSE, + "renderer->iface->setup() is null.\n"); + + ret = renderer->iface->render_once(renderer->data, render_list, damage); + + return ret; +} + +PEPPER_API pepper_tdm_renderer_t * +pepper_tdm_output_create_renderer(pepper_tdm_output_t *output, + const pepper_tdm_renderer_iface_t *renderer_iface, + tbm_surface_queue_h tsurface_queue, + void *renderer_data) +{ + PEPPER_INFO("\n"); + + pepper_tdm_renderer_t *renderer = NULL; + pepper_bool_t ret = PEPPER_FALSE; + + PEPPER_CHECK(!output->renderer, return NULL, + "renderer:%p already assigned.\n"); + + renderer = calloc(1, sizeof(pepper_tdm_renderer_t)); + PEPPER_CHECK(renderer, return NULL, + "failed to alloc pepper_tdm_renderer_t.\n"); + + renderer->iface = renderer_iface; + renderer->tsurface_queue = tsurface_queue; + renderer->data = renderer_data; + + ret = pepper_tdm_renderer_setup(renderer); + PEPPER_CHECK(ret == PEPPER_TRUE, goto error, + "renderer->iface->setup() failed.\n"); + + output->renderer = renderer; + + return renderer; + +error: + if (renderer) + free(renderer); + + return NULL; +} + +PEPPER_API void +pepper_tdm_renderer_destroy(pepper_tdm_renderer_t *renderer) +{ + PEPPER_INFO("\n"); + + PEPPER_CHECK(renderer != NULL, return, + "renderer is null.\n"); + PEPPER_CHECK(renderer->iface != NULL, return, + "renderer->iface is null.\n"); + PEPPER_CHECK(renderer->iface->setup != NULL, return, + "renderer->iface->setup() is null.\n"); + + renderer->iface->destroy(renderer->data); + free(renderer); +} -- 2.34.1