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);
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
tbm_surface_queue_h tbm_surface_queue;
tdm_render_type_t render_type;
+
pepper_renderer_t *renderer;
pepper_render_target_t *render_target;
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,
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 */
--- /dev/null
+/*
+* 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);
+}