tdm: add pepper_tdm_output_create_renderer function 80/263880/1
authorSooChan Lim <sc1.lim@samsung.com>
Mon, 13 Sep 2021 05:37:59 +0000 (14:37 +0900)
committerSooChan Lim <sc1.lim@samsung.com>
Mon, 13 Sep 2021 06:22:32 +0000 (15:22 +0900)
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
src/lib/tdm/pepper-tdm.h
src/lib/tdm/tdm-internal.h
src/lib/tdm/tdm-renderer.c [new file with mode: 0644]

index e52cac1..eb8b821 100644 (file)
@@ -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
index 90b2698..886b342 100644 (file)
@@ -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
index d238233..28ec84a 100644 (file)
@@ -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 (file)
index 0000000..6c055e8
--- /dev/null
@@ -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);
+}