From 94b4a26e751ac7bfebc69773c9dfe5377bd8596a Mon Sep 17 00:00:00 2001 From: Junghoon Date: Fri, 19 Jun 2015 10:39:32 +0900 Subject: [PATCH] drm: apply dynamic render target setup - create gl & pixman renderers - set render target - minor bug fixes Change-Id: I7f02e538b99869e22832b775478b0662f188100c --- drm/src/drm-common.c | 7 ++++++- drm/src/drm-internal.h | 3 ++- drm/src/drm-output.c | 43 +++++++++++++++++++++++++++---------------- render/src/gl-renderer.c | 6 +++--- 4 files changed, 38 insertions(+), 21 deletions(-) diff --git a/drm/src/drm-common.c b/drm/src/drm-common.c index ad7ed30..eba7bef 100644 --- a/drm/src/drm-common.c +++ b/drm/src/drm-common.c @@ -1,7 +1,9 @@ #include #include -#include "drm-internal.h" #include +#include + +#include "drm-internal.h" PEPPER_API pepper_drm_t * pepper_drm_create(pepper_object_t *compositor, const char *device) @@ -71,6 +73,9 @@ pepper_drm_destroy(pepper_drm_t *drm) if (drm->crtcs) free(drm->crtcs); + if (drm->gbm_device) + gbm_device_destroy(drm->gbm_device); + if (drm->drm_fd) close(drm->drm_fd); diff --git a/drm/src/drm-internal.h b/drm/src/drm-internal.h index cac6553..93d4ad1 100644 --- a/drm/src/drm-internal.h +++ b/drm/src/drm-internal.h @@ -39,6 +39,8 @@ struct pepper_drm struct udev_monitor *udev_monitor; struct wl_event_source *udev_monitor_source; + struct gbm_device *gbm_device; + pepper_renderer_t *pixman_renderer; pepper_renderer_t *gl_renderer; }; @@ -66,7 +68,6 @@ struct drm_output drmModeCrtc *saved_crtc; - struct gbm_device *gbm_device; struct gbm_surface *gbm_surface; drm_fb_t *front_fb; diff --git a/drm/src/drm-output.c b/drm/src/drm-output.c index 5577567..8b8b16d 100644 --- a/drm/src/drm-output.c +++ b/drm/src/drm-output.c @@ -262,6 +262,12 @@ drm_output_repaint(void *o) if (!output->back_fb) return; + if (!output->front_fb) + { + ret = drmModeSetCrtc(output->drm->drm_fd, output->crtc_id, output->back_fb->id, + 0, 0, &output->conn_id, 1, output->current_mode); + } + ret = drmModePageFlip(output->drm->drm_fd, output->crtc_id, output->back_fb->id, DRM_MODE_PAGE_FLIP_EVENT, output); if (ret < 0) @@ -548,6 +554,7 @@ init_pixman_renderer(drm_output_t *output) } output->renderer = output->drm->pixman_renderer; + output->render_target = output->dumb_fb[output->back_fb_index]->target; output->use_pixman = PEPPER_TRUE; return PEPPER_TRUE; @@ -562,12 +569,8 @@ fini_gl_renderer(drm_output_t *output) if (output->gbm_surface) gbm_surface_destroy(output->gbm_surface); - if (output->gbm_device) - gbm_device_destroy(output->gbm_device); - output->gl_render_target = NULL; output->gbm_surface = NULL; - output->gbm_device = NULL; } static pepper_bool_t @@ -578,14 +581,7 @@ init_gl_renderer(drm_output_t *output) if (!output->drm->gl_renderer) return PEPPER_FALSE; - output->gbm_device = gbm_create_device(output->drm->drm_fd); - if (!output->gbm_device) - { - PEPPER_ERROR("Failed to create gbm device in %s\n", __FUNCTION__); - goto error; - } - - output->gbm_surface = gbm_surface_create(output->gbm_device, output->w, output->h, + output->gbm_surface = gbm_surface_create(output->drm->gbm_device, output->w, output->h, GBM_FORMAT_XRGB8888/*FIXME*/, GBM_BO_USE_SCANOUT | GBM_BO_USE_RENDERING/*FIXME*/); if (!output->gbm_surface) @@ -596,9 +592,9 @@ init_gl_renderer(drm_output_t *output) native_visual_id = GBM_FORMAT_XRGB8888; output->gl_render_target = pepper_gl_renderer_create_target(output->drm->gl_renderer, - output->gbm_surface, - PEPPER_FORMAT_XRGB8888, - &native_visual_id); + output->gbm_surface, + PEPPER_FORMAT_XRGB8888, + &native_visual_id); if (!output->gl_render_target) { PEPPER_ERROR("Failed to create gl render target.\n"); @@ -606,6 +602,8 @@ init_gl_renderer(drm_output_t *output) } output->renderer = output->drm->gl_renderer; + output->render_target = output->gl_render_target; + return PEPPER_TRUE; error: @@ -803,7 +801,8 @@ handle_page_flip(int fd, unsigned int sequence, unsigned int tv_sec, unsigned in else { /* Assume GL renderer in this case. */ - gbm_surface_release_buffer(output->gbm_surface, output->front_fb->bo); + if (output->front_fb && output->front_fb->bo) + gbm_surface_release_buffer(output->gbm_surface, output->front_fb->bo); } output->front_fb = output->back_fb; @@ -953,6 +952,18 @@ pepper_drm_output_create(pepper_drm_t *drm) goto error; } + /* create gl-renderer & pixman-renderer */ + drm->gbm_device = gbm_create_device(drm->drm_fd); + if (drm->gbm_device) + drm->gl_renderer = pepper_gl_renderer_create(drm->compositor, drm->gbm_device, "gbm"); + + drm->pixman_renderer = pepper_pixman_renderer_create(drm->compositor); + if (!drm->pixman_renderer) + { + PEPPER_ERROR("Failed to create pixman-renderer\n"); + goto error; + } + /* add outputs */ if (add_outputs(drm, drm_device) == PEPPER_FALSE) { diff --git a/render/src/gl-renderer.c b/render/src/gl-renderer.c index d6b98da..2894783 100644 --- a/render/src/gl-renderer.c +++ b/render/src/gl-renderer.c @@ -720,9 +720,6 @@ pepper_gl_renderer_create(pepper_object_t *compositor, void *native_display, con if (!setup_egl_extensions(gr)) goto error; - if (!setup_gl_extensions(gr)) - goto error; - return &gr->base; error: @@ -877,6 +874,9 @@ pepper_gl_renderer_create_target(pepper_renderer_t *renderer, void *native_windo goto error; } + if (!setup_gl_extensions(gr)) + goto error; + target->surface = surface; target->config = config; target->native_window = native_window; -- 2.7.4