From dd022835a96134667dc63b2c5606adcb98657953 Mon Sep 17 00:00:00 2001 From: Sangjin Lee Date: Tue, 1 Dec 2015 14:01:03 +0900 Subject: [PATCH] render: change to supprot the wayland-tbm buffer pixman renderer can support wayland-tbm buffer. Change-Id: Idff39133e72a023451aab5d92234efdd74a92142 Signed-off-by: Sangjin Lee --- configure.ac | 11 ++-- src/lib/render/pixman-renderer.c | 122 ++++++++++++++++++++++++++++++++++++--- 2 files changed, 119 insertions(+), 14 deletions(-) diff --git a/configure.ac b/configure.ac index af95bc4..2fe64a5 100644 --- a/configure.ac +++ b/configure.ac @@ -31,6 +31,11 @@ AC_SUBST(GCC_CFLAGS) # pepper PEPPER_REQUIRES="wayland-server pixman-1 xkbcommon" PKG_CHECK_MODULES(PEPPER, [$PEPPER_REQUIRES]) +PKG_CHECK_MODULES([TBM], [libtbm wayland-tbm-server], [have_tbm=yes], [have_tbm=no]) +if test x$have_tbm = xyes; then + AC_DEFINE([HAVE_TBM], [1], [Build the tbm backend]) + PEPPER_REQUIRES="$PEPPER_REQUIRES libtbm wayland-tbm-server" +fi PEPPER_DIR="-I\$(top_srcdir)/src/lib/pepper" PEPPER_LIB="\$(top_srcdir)/src/lib/pepper/libpepper.la" @@ -85,12 +90,6 @@ PEPPER_DRM_REQUIRES="libdrm gbm" PKG_CHECK_MODULES(PEPPER_DRM, [$PEPPER_DRM_REQUIRES]) PEPPER_DRM_REQUIRES="$PEPPER_DRM_REQUIRES pepper pepper-render pepper-libinput" -PKG_CHECK_MODULES([TBM], [libtbm wayland-tbm-server], [have_tbm=yes], [have_tbm=no]) -if test x$have_tbm = xyes; then - AC_DEFINE([HAVE_TBM], [1], [Build the tbm backend]) - PEPPER_DRM_REQUIRES="$PEPPER_DRM_REQUIRES libtbm wayland-tbm-server" -fi - PEPPER_DRM_DIR="-I\$(top_srcdir)/src/lib/drm" PEPPER_DRM_LIB="\$(top_srcdir)/src/lib/drm/libpepper-drm.la" diff --git a/src/lib/render/pixman-renderer.c b/src/lib/render/pixman-renderer.c index f9274de..5ae46c0 100644 --- a/src/lib/render/pixman-renderer.c +++ b/src/lib/render/pixman-renderer.c @@ -25,11 +25,17 @@ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ +#include #include "pepper-pixman-renderer.h" #include "pepper-render-internal.h" #include +#ifdef HAVE_TBM +#include +#include +#endif + typedef struct pixman_renderer pixman_renderer_t; typedef struct pixman_surface_state pixman_surface_state_t; typedef struct pixman_render_target pixman_render_target_t; @@ -56,7 +62,6 @@ struct pixman_surface_state pepper_buffer_t *buffer; pepper_event_listener_t *buffer_destroy_listener; int buffer_width, buffer_height; - struct wl_shm_buffer *shm_buffer; pixman_image_t *image; @@ -121,6 +126,52 @@ surface_state_handle_surface_destroy(pepper_event_listener_t *listener, free(state); } +static void +surface_state_begin_access(pixman_surface_state_t *state) +{ + struct wl_shm_buffer *shm_buffer; + tbm_surface_h tbm_surface; + + shm_buffer = wl_shm_buffer_get(pepper_buffer_get_resource(state->buffer)); + if (shm_buffer) + { + wl_shm_buffer_begin_access(shm_buffer); + return; + } +#ifdef HAVE_TBM + tbm_surface = wayland_tbm_server_get_surface(NULL, pepper_buffer_get_resource(state->buffer)); + if (tbm_surface) + { + tbm_surface_info_s tmp; + tbm_surface_map(tbm_surface, TBM_SURF_OPTION_READ, &tmp); + return; + } +#endif +} + +static void +surface_state_end_access(pixman_surface_state_t *state) +{ + struct wl_shm_buffer *shm_buffer; + tbm_surface_h tbm_surface; + + shm_buffer = wl_shm_buffer_get(pepper_buffer_get_resource(state->buffer)); + if (shm_buffer) + { + wl_shm_buffer_end_access(shm_buffer); + return; + } +#ifdef HAVE_TBM + tbm_surface = wayland_tbm_server_get_surface(NULL, pepper_buffer_get_resource(state->buffer)); + if (tbm_surface) + { + tbm_surface_unmap(tbm_surface); + return; + } +#endif +} + + static pixman_surface_state_t * get_surface_state(pepper_renderer_t *renderer, pepper_surface_t *surface) { @@ -183,11 +234,61 @@ surface_state_attach_shm(pixman_surface_state_t *state, pepper_buffer_t *buffer) state->buffer_width = w; state->buffer_height = h; state->image = image; - state->shm_buffer = shm_buffer; + //state->shm_buffer = shm_buffer; return PEPPER_TRUE;; } +#ifdef HAVE_TBM +static pepper_bool_t +surface_state_attach_tbm(pixman_surface_state_t *state, pepper_buffer_t *buffer) +{ + tbm_surface_h tbm_surface = wayland_tbm_server_get_surface(NULL, pepper_buffer_get_resource(buffer)); + tbm_surface_info_s info; + pixman_format_code_t format; + int w, h; + pixman_image_t *image; + + if (!tbm_surface) + return PEPPER_FALSE; + + switch (tbm_surface_get_format(tbm_surface)) + { + case TBM_FORMAT_XRGB8888: + format = PIXMAN_x8r8g8b8; + break; + case TBM_FORMAT_ARGB8888: + format = PIXMAN_a8r8g8b8; + break; + case TBM_FORMAT_RGB565: + format = PIXMAN_r5g6b5; + break; + default: + return PEPPER_FALSE; + } + + tbm_surface_get_info(tbm_surface, &info); + if (info.num_planes != 1) + return PEPPER_FALSE; + + w = info.width; + h = info.height; + image = pixman_image_create_bits(format, w, h, + (uint32_t*)info.planes[0].ptr, + info.planes[0].stride); + + if (!image) + return PEPPER_FALSE; + + state->buffer_width = w; + state->buffer_height = h; + state->image = image; + //state->shm_buffer = shm_buffer; + + return PEPPER_TRUE;; +} +#endif + static pepper_bool_t pixman_renderer_attach_surface(pepper_renderer_t *renderer, pepper_surface_t *surface, int *w, int *h) @@ -208,6 +309,11 @@ pixman_renderer_attach_surface(pepper_renderer_t *renderer, pepper_surface_t *su if (surface_state_attach_shm(state, buffer)) goto done; +#ifdef HAVE_TBM + if (surface_state_attach_tbm(state, buffer)) + goto done; +#endif + PEPPER_ERROR("Not supported buffer type.\n"); return PEPPER_FALSE; @@ -381,14 +487,14 @@ repaint_view(pepper_renderer_t *renderer, pepper_output_t *output, pixman_region32_intersect(&repaint_surface, &repaint, surface_opaque); pixman_image_set_clip_region32(target->image, &repaint_surface); - wl_shm_buffer_begin_access(ps->shm_buffer); + surface_state_begin_access(ps); pixman_image_composite32(PIXMAN_OP_SRC, ps->image, NULL, target->image, 0, 0, /* src_x, src_y */ 0, 0, /* mask_x, mask_y */ 0, 0, /* dest_x, dest_y */ pixman_image_get_width(target->image), pixman_image_get_height(target->image)); - wl_shm_buffer_end_access(ps->shm_buffer); + surface_state_end_access(ps); } if (pixman_region32_not_empty(&surface_blend)) @@ -399,14 +505,14 @@ repaint_view(pepper_renderer_t *renderer, pepper_output_t *output, pixman_region32_intersect(&repaint_surface, &repaint, &surface_blend); pixman_image_set_clip_region32(target->image, &repaint_surface); - wl_shm_buffer_begin_access(ps->shm_buffer); + surface_state_begin_access(ps); pixman_image_composite32(PIXMAN_OP_OVER, ps->image, NULL, target->image, 0, 0, /* src_x, src_y */ 0, 0, /* mask_x, mask_y */ 0, 0, /* dest_x, dest_y */ pixman_image_get_width(target->image), pixman_image_get_height(target->image)); - wl_shm_buffer_end_access(ps->shm_buffer); + surface_state_end_access(ps); } } else @@ -417,14 +523,14 @@ repaint_view(pepper_renderer_t *renderer, pepper_output_t *output, pixman_region32_intersect(&repaint_surface, &repaint, &surface_blend); pixman_image_set_clip_region32(target->image, &repaint_surface); - wl_shm_buffer_begin_access(ps->shm_buffer); + surface_state_begin_access(ps); pixman_image_composite32(PIXMAN_OP_OVER, ps->image, NULL, target->image, 0, 0, /* src_x, src_y */ 0, 0, /* mask_x, mask_y */ 0, 0, /* dest_x, dest_y */ pixman_image_get_width(target->image), pixman_image_get_height(target->image)); - wl_shm_buffer_end_access(ps->shm_buffer); + surface_state_end_access(ps); } pixman_region32_fini(&repaint_surface); -- 2.7.4