#include "tdm-internal.h"
-#include <pepper-pixman-renderer.h>
-#include <pepper-gl-renderer.h>
-
-static int key_render_target;
-
-#define KEY_RENDER_TARGET ((unsigned long)&key_render_target)
-
-static void
-__tdm_renderer_pixman_free_target(void *user_data)
-{
- PEPPER_INFO("\n");
-
- pepper_render_target_t *target = user_data;
-
- if (target)
- pepper_render_target_destroy(target);
-}
-
-static pepper_render_target_t *
-__tdm_renderer_pixman_get_target(tbm_surface_h surface)
-{
- PEPPER_INFO("\n");
-
- tbm_bo bo;
- pepper_render_target_t *target = NULL;
-
- bo = tbm_surface_internal_get_bo(surface, 0);
- if (!tbm_bo_get_user_data(bo, KEY_RENDER_TARGET, (void **)&target)) {
- tbm_surface_info_s info;
- pepper_format_t format;
-
- tbm_bo_add_user_data(bo, KEY_RENDER_TARGET, __tdm_renderer_pixman_free_target);
-
- tbm_surface_get_info(surface, &info);
- switch (info.format) {
- case TBM_FORMAT_XRGB8888:
- format = PEPPER_FORMAT_XRGB8888;
- break;
- case TBM_FORMAT_ARGB8888:
- format = PEPPER_FORMAT_ARGB8888;
- break;
- default:
- tbm_bo_delete_user_data(bo, KEY_RENDER_TARGET);
- PEPPER_ERROR("Unknown tbm format\n");
- return NULL;
- }
- target = pepper_pixman_renderer_create_target(format, info.planes[0].ptr,
- info.planes[0].stride,
- info.width, info.height);
- if (!target) {
- tbm_bo_delete_user_data(bo, KEY_RENDER_TARGET);
- PEPPER_ERROR("pepper_pixman_renderer_create_target() fail\n");
- return NULL;
- }
- tbm_bo_set_user_data(bo, KEY_RENDER_TARGET, target);
- }
-
- return target;
-}
-
static const pepper_list_t *
__tdm_output_get_render_list(pepper_tdm_output_t *output)
{
}
static void
-__tdm_renderer_pixman_render(pepper_tdm_output_t *output)
-{
- PEPPER_INFO("\n");
-
- const pepper_list_t *render_list;
- pepper_region_t *damage;
- pepper_region_t total_damage;
- tbm_surface_h back;
- pepper_render_target_t *target;
- int ret;
-
- render_list = __tdm_output_get_render_list(output);
- damage = __tdm_output_get_damage_region(output);
-
- /*Set render target*/
- ret = tbm_surface_queue_dequeue(output->tbm_surface_queue, &back);
- PEPPER_CHECK(ret == TBM_SURFACE_QUEUE_ERROR_NONE, return,
- "tbm_surface_queue_dequeue() failed\n");
-
- target = __tdm_renderer_pixman_get_target(back);
- if (PEPPER_FALSE == pepper_renderer_set_target(output->renderer, target)) {
- PEPPER_ERROR("pepper_renderer_set_target() failed\n");
- return;
- }
-
- pepper_region_init(&total_damage);
- pepper_region_union(&total_damage, damage, &output->previous_damage);
- pepper_region_copy(&output->previous_damage, damage);
-
- pepper_renderer_repaint_output(output->renderer, output->base, render_list,
- &total_damage);
-
- pepper_region_fini(&total_damage);
-
- __tdm_output_clear_damage_region(output);
-
-#if 0 // for debugging
- static int dump_cnt = 0;
- char filename[256];
- snprintf(filename, sizeof filename, "/tmp/pixman_render_%d.png", dump_cnt++);
- tdm_helper_dump_buffer(back, (const char*)filename);
-#endif
-
- output->back = back;
-}
-
-static void
-__tdm_renderer_pixman_fini(pepper_tdm_output_t *output)
-{
- PEPPER_INFO("\n");
-
- pepper_region_fini(&output->previous_damage);
-
- if (output->render_target)
- pepper_render_target_destroy(output->render_target);
-
- if (output->tbm_surface_queue) {
- // DO NOT destroy tbm_surface_queue_h
- if (output->hwc)
- output->tbm_surface_queue = NULL;
- else
- tbm_surface_queue_destroy(output->tbm_surface_queue);
- }
-
- output->renderer = NULL;
- output->render_target = NULL;
- output->tbm_surface_queue = NULL;
-}
-
-static void
-__tdm_renderer_pixman_init(pepper_tdm_output_t *output)
-{
- pepper_tdm_t *tdm = output->tdm;
- pepper_tdm_hwc_t *hwc = output->hwc;
-
- const tdm_output_mode *mode;
- tdm_error err = TDM_ERROR_NONE;
-
- PEPPER_INFO("\n");
-
- if (!tdm->pixman_renderer) {
- tdm->pixman_renderer = pepper_pixman_renderer_create(tdm->compositor);
- PEPPER_CHECK(tdm->pixman_renderer, return,
- "pepper_pixman_renderer_create() failed.\n");
- }
-
- output->renderer = tdm->pixman_renderer;
-
- err = tdm_output_get_mode(output->toutput, &mode);
- PEPPER_CHECK(err == TDM_ERROR_NONE, goto error,
- "tdm_output_get_mode() failed.\n");
-
- if (output->hwc) {
- output->tbm_surface_queue = tdm_hwc_get_client_target_buffer_queue(hwc->thwc, &err);
- PEPPER_CHECK(output->tbm_surface_queue, goto error,
- "tdm_hwc_get_client_target_buffer_queue() failed.\n");
- } else {
- output->tbm_surface_queue = tbm_surface_queue_create(3,
- mode->hdisplay, mode->vdisplay,
- TBM_FORMAT_XBGR8888, TBM_BO_SCANOUT);
- PEPPER_CHECK(output->tbm_surface_queue, goto error,
- "tbm_surface_queue_create() failed.\n");
- }
-
- pepper_region_init(&output->previous_damage);
- output->render_type = TDM_RENDER_TYPE_PIXMAN;
-
- return;
-
-error:
- __tdm_renderer_pixman_fini(output);
-}
-
-static void
-__tdm_renderer_gl_render(pepper_tdm_output_t *output)
-{
- PEPPER_INFO("\n");
-
- int ret;
- const pepper_list_t *render_list;
- pepper_region_t *damage;
-
- render_list = __tdm_output_get_render_list(output);
- damage = __tdm_output_get_damage_region(output);
-
- pepper_renderer_repaint_output(output->renderer, output->base, render_list,
- damage);
-
- ret = tbm_surface_queue_can_acquire(output->tbm_surface_queue, 1);
- PEPPER_CHECK(ret > 0, return, "tbm_surface_queue_can_acquire() failed.\n");
-
- ret = tbm_surface_queue_acquire(output->tbm_surface_queue, &output->back);
- PEPPER_CHECK(ret == TBM_SURFACE_QUEUE_ERROR_NONE, return,
- "tbm_surface_queue_acquire() failed.\n");
-
- __tdm_output_clear_damage_region(output);
-}
-
-static void
-__tdm_renderer_gl_fini(pepper_tdm_output_t *output)
-{
- PEPPER_INFO("\n");
-
- if (output->render_target)
- pepper_render_target_destroy(output->render_target);
-
- if (output->tbm_surface_queue) {
- // DO NOT destroy tbm_surface_queue_h
- if (output->hwc)
- output->tbm_surface_queue = NULL;
- else
- tbm_surface_queue_destroy(output->tbm_surface_queue);
- }
-
- output->renderer = NULL;
- output->render_target = NULL;
- output->tbm_surface_queue = NULL;
-}
-
-static void
-__tdm_renderer_gl_init(pepper_tdm_output_t *output)
-{
- PEPPER_INFO("\n");
-
- pepper_tdm_t *tdm = output->tdm;
- pepper_tdm_hwc_t *hwc = output->hwc;
- const tdm_output_mode *mode;
- uint32_t native_visual_id = TBM_FORMAT_XRGB8888;
- tdm_error err = TDM_ERROR_NONE;
-
- if (!tdm->gl_renderer) {
- tdm->gl_renderer = pepper_gl_renderer_create(tdm->compositor, tdm->bufmgr,
- "tbm");
- PEPPER_CHECK(tdm->gl_renderer, return, "pepper_gl_renderer_create() failed.\n");
- }
-
- output->renderer = tdm->gl_renderer;
-
- err = tdm_output_get_mode(output->toutput, &mode);
- PEPPER_CHECK(err == TDM_ERROR_NONE, goto error,
- "tdm_output_get_mode() failed.\n");
-
- if (output->hwc) {
- output->tbm_surface_queue = tdm_hwc_get_client_target_buffer_queue(hwc->thwc, &err);
- PEPPER_CHECK(err == TDM_ERROR_NONE, goto error,
- "tdm_hwc_get_client_target_buffer_queue() failed.\n");
- output->render_target = pepper_gl_renderer_create_target(tdm->gl_renderer,
- output->tbm_surface_queue,
- PEPPER_FORMAT_XRGB8888,
- &native_visual_id,
- mode->hdisplay, mode->vdisplay);
- } else {
- output->tbm_surface_queue = tbm_surface_queue_create(3,
- mode->hdisplay, mode->vdisplay,
- TBM_FORMAT_XRGB8888,
- TBM_BO_SCANOUT);
- PEPPER_CHECK(output->tbm_surface_queue, goto error,
- "tbm_surface_queue_create() failed.\n");
-
- output->render_target = pepper_gl_renderer_create_target(tdm->gl_renderer,
- output->tbm_surface_queue,
- PEPPER_FORMAT_XRGB8888,
- &native_visual_id,
- mode->hdisplay, mode->vdisplay);
- }
- PEPPER_CHECK(output->render_target, goto error,
- "pepper_gl_renderer_create_target() failed.\n");
- output->render_type = TDM_RENDER_TYPE_GL;
-
- pepper_renderer_set_target(output->renderer, output->render_target);
-
- return;
-
-error:
- __tdm_renderer_gl_fini(output);
-}
-
-static void
__tdm_hwc_destroy(pepper_event_listener_t *listener, pepper_object_t *object,
uint32_t id, void *info, void *data)
{
pepper_tdm_output_t *output = (pepper_tdm_output_t *)o;
tdm_error terror;
+ const pepper_list_t *render_list;
+ pepper_region_t *damage;
+ tbm_error_e tbm_err;
+ int ret;
// render
+ render_list = __tdm_output_get_render_list(output);
+ damage = __tdm_output_get_damage_region(output);
if (!output->back) {
- if (output->render_type == TDM_RENDER_TYPE_GL)
- __tdm_renderer_gl_render(output);
- else if (output->render_type == TDM_RENDER_TYPE_PIXMAN)
- __tdm_renderer_pixman_render(output);
- else {
- PEPPER_ERROR("Unknown render type\n");
- return;
- }
+ ret = pepper_tdm_renderer_render_once(output->renderer, render_list, damage);
+ PEPPER_CHECK(ret, return, "pepper_tdm_renderer_render_once() failed");
}
+ __tdm_output_clear_damage_region(output);
+
+ // acquire
+ if (!tbm_surface_queue_can_acquire(output->tbm_surface_queue, 1))
+ return;
+
+ tbm_err = tbm_surface_queue_acquire(output->tbm_surface_queue, &output->back);
+ PEPPER_CHECK(tbm_err == TBM_ERROR_NONE, return, "tbm_surface_queue_acquire() failed");
// TODO: fix this...
if (!output->back)
return;
+#if DEBUG_DUMP_BACK_BUFFER
+ static int dump_cnt = 0;
+ char filename[256];
+ snprintf(filename, sizeof filename, "/tmp/gl_render_%d.png", dump_cnt++);
+
+ tdm_helper_dump_buffer(output->back, (const char*)filename);
+#endif
+
+ // commit
if (output->hwc) {
// set back buffer as a client_target_buffer
pepper_tdm_hwc_set_client_target_buffer(output->hwc, output->back);
if (output->hwc)
pepper_tdm_hwc_attach_surface(output->hwc, surface);
- pepper_renderer_attach_surface(output->renderer, surface, w, h);
+ pepper_tdm_renderer_attach_surface(output->renderer, surface, w, h);
}
static void
pepper_tdm_output_t *output = o;
pepper_buffer_t *buffer = pepper_surface_get_buffer(surface);
- pepper_renderer_flush_surface_damage(output->renderer, surface);
+ pepper_tdm_renderer_flush_surface_damage(output->renderer, surface);
if (output->render_type == TDM_RENDER_TYPE_GL &&
(buffer && wl_shm_buffer_get(pepper_buffer_get_resource(buffer)))) {
// HWC :
}
-struct pepper_output_backend tdm_output_backend = {
+static const pepper_output_backend_t tdm_output_backend = {
pepper_tdm_output_destroy,
pepper_tdm_output_get_subpixel_order,
const tdm_output_mode *preferred_mode = NULL;
int num_mode;
- const char *render_env = getenv("PEPPER_RENDERER");
-
PEPPER_INFO("\n");
err = tdm_display_get_output_count(tdm->tdisplay, &num_output);
PEPPER_CHECK(PEPPER_TRUE == __tdm_output_plane_init(output), goto error,
"pepper_tdm_plane_init() failed\n");
- /*Setup renderer*/
- if (render_env && !strcmp(render_env, "gl")) {
- __tdm_renderer_gl_init(output);
- PEPPER_CHECK(output->renderer, goto error,
- "Failed to initialize gl_renderer.\n");
- }
-
- if (!output->renderer) {
- __tdm_renderer_pixman_init(output);
- PEPPER_CHECK(output->renderer, goto error,
- "Failed to initialize pixman_renderer.\n");
- }
-
// add output to output_list
pepper_list_insert(&tdm->output_list, &output->link);
tdm->num_outputs++;