The tdm backend use tbm_surface_queue directly.
Tizen EGL support tbm_bufmgr to eglNativeDisplay and tbm_surface_queue to eglNativeWindow.
Change-Id: I8398b2d29d0231fc45b3594692c838358d35a74d
AM_CONDITIONAL(ENABLE_TDM, test x$enable_tdm = xyes)
if test x$enable_tdm = xyes; then
- PEPPER_TDM_REQUIRES="gbm libtbm libtdm"
+ PEPPER_TDM_REQUIRES="libtbm libtdm"
PKG_CHECK_MODULES(PEPPER_TDM, [$PEPPER_TDM_REQUIRES])
PEPPER_TDM_REQUIRES="$PEPPER_TDM_REQUIRES pepper pepper-render pepper-libinput"
PEPPER_TDM_DIR="-I\$(top_srcdir)/src/lib/tdm"
PEPPER_TDM_LIB="\$(top_srcdir)/src/lib/tdm/libpepper-tdm.la"
- PEPPER_TDM_CFLAGS="$PEPPER_DIR $PEPPER_RENDER_DIR $PEPPER_LIBINPUT_DIR $PEPPER_TDM_CFLAGS $TBM_CFLAGS"
- PEPPER_TDM_CFLAGS="$PEPPER_DRM_CFLAGS $PEPPER_CFLAGS"
- PEPPER_TDM_LIBS="$PEPPER_LIB $PEPPER_RENDER_LIB $PEPPER_LIBINPUT_LIB $PEPPER_TDM_LIBS $TBM_LIBS"
+ PEPPER_TDM_CFLAGS="$PEPPER_DIR $PEPPER_RENDER_DIR $PEPPER_LIBINPUT_DIR $PEPPER_TDM_CFLAGS"
+ PEPPER_TDM_CFLAGS="$PEPPER_TDM_CFLAGS $PEPPER_CFLAGS"
+ PEPPER_TDM_LIBS="$PEPPER_LIB $PEPPER_RENDER_LIB $PEPPER_LIBINPUT_LIB $PEPPER_TDM_LIBS"
AC_SUBST(PEPPER_TDM_CFLAGS)
AC_SUBST(PEPPER_TDM_LIBS)
Source: %{name}-%{version}.tar.xz
-%define ENABLE_TDM 0
+%define ENABLE_TDM 1
BuildRequires: autoconf > 2.64
BuildRequires: automake >= 1.11
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*/
+#include "config.h"
#include "pepper-gl-renderer.h"
#include "pepper-render-internal.h"
#include <stdio.h>
#include <float.h>
+#ifdef HAVE_TBM
+#include <tbm_surface.h>
+#include <wayland-tbm-server.h>
+#endif
+
typedef struct gl_renderer gl_renderer_t;
typedef struct gl_shader gl_shader_t;
typedef struct gl_surface_state gl_surface_state_t;
#ifndef EGL_PLATFORM_WAYLAND_KHR
#define EGL_PLATFORM_WAYLAND_KHR 0x31d8
#endif
+#ifndef EGL_PLATFORM_TBM_EXT
+#define EGL_PLATFORM_TBM_EXT 0x31d9
+#endif
#define NUM_MAX_PLANES 3
BUFFER_TYPE_NONE,
BUFFER_TYPE_SHM,
BUFFER_TYPE_EGL,
+ BUFFER_TYPE_TBM
};
#define MAX_BUFFER_COUNT 3
GLenum pixel_format;
int pitch;
} shm;
+
+ /*TBM buffer type*/
+ tbm_surface_h tbm_surface;
};
static pepper_bool_t
return PEPPER_TRUE;
}
+#ifdef HAVE_TBM
+static pepper_bool_t
+surface_state_attach_tbm(gl_surface_state_t *state, pepper_buffer_t *buffer)
+{
+ tbm_surface_h tbm_surface = wayland_tbm_server_get_surface(NULL, pepper_buffer_get_resource(buffer));
+
+ if (!tbm_surface)
+ return PEPPER_FALSE;
+
+ state->tbm_surface = tbm_surface;
+ state->buffer_width = tbm_surface_get_width(tbm_surface);
+ state->buffer_height = tbm_surface_get_height(tbm_surface);
+ state->y_inverted = 1;
+ state->buffer_type = BUFFER_TYPE_TBM;
+
+ return PEPPER_TRUE;;
+}
+#endif
+
static pepper_bool_t
surface_state_attach_egl(gl_surface_state_t *state, pepper_buffer_t *buffer)
{
if (surface_state_attach_shm(state, buffer))
goto done;
+#ifdef HAVE_TBM
+ if (surface_state_attach_tbm(state, buffer))
+ goto done;
+#endif
+
if (surface_state_attach_egl(state, buffer))
goto done;
return PEPPER_TRUE;
}
+#ifdef HAVE_TBM
+static pepper_bool_t
+surface_state_flush_tbm(gl_surface_state_t *state)
+{
+ gl_renderer_t *gr = (gl_renderer_t *)state->renderer;
+ EGLDisplay display = gr->display;
+ tbm_surface_h tbm_surface = wayland_tbm_server_get_surface(NULL, pepper_buffer_get_resource(state->buffer));
+ int sampler;
+
+ const EGLint image_attribs[] =
+ {
+ EGL_IMAGE_PRESERVED_KHR, EGL_TRUE,
+ EGL_NONE
+ };
+
+ if (!tbm_surface)
+ return PEPPER_FALSE;
+
+ switch (tbm_surface_get_format(tbm_surface))
+ {
+ case TBM_FORMAT_XRGB8888:
+ sampler = GL_SHADER_SAMPLER_RGBX;
+ break;
+ case TBM_FORMAT_ARGB8888:
+ sampler = GL_SHADER_SAMPLER_RGBA;
+ break;
+ case TBM_FORMAT_RGB565:
+ sampler = GL_SHADER_SAMPLER_RGBA;
+ break;
+ default:
+ PEPPER_ERROR("Unknown shm buffer format.\n");
+ return PEPPER_FALSE;
+ }
+
+ surface_state_ensure_textures(state, 1);
+ state->images[0] = gr->create_image(display, NULL, EGL_NATIVE_SURFACE_TIZEN,
+ state->tbm_surface, image_attribs);
+ PEPPER_ASSERT(state->images[0] != EGL_NO_IMAGE_KHR);
+
+ glActiveTexture(GL_TEXTURE0 + 0);
+ glBindTexture(GL_TEXTURE_2D, state->textures[0]);
+ gr->image_target_texture_2d(GL_TEXTURE_2D, state->images[0]);
+
+ state->sampler = sampler;
+
+ return PEPPER_TRUE;
+}
+#endif
+
static pepper_bool_t
surface_state_flush_shm(gl_surface_state_t *state)
{
if (state->buffer_type == BUFFER_TYPE_SHM)
return surface_state_flush_shm(state);
+#ifdef HAVE_TBM
+ else if(state->buffer_type == BUFFER_TYPE_TBM)
+ return surface_state_flush_tbm(state);
+#endif
else
return surface_state_flush_egl(state);
}
if (!strcmp(str, "x11"))
return EGL_PLATFORM_X11_KHR;
+ if (!strcmp(str, "tbm"))
+ return EGL_PLATFORM_TBM_EXT;
return EGL_NONE;
}
ret = tdm_display_get_fd(tdm->disp, &tdm->fd);
PEPPER_CHECK(ret == TDM_ERROR_NONE, goto error, "tdm_display_get_fd() failed %d\n", ret);
- tdm->gbm_device = gbm_create_device(tdm->fd);
- PEPPER_CHECK(tdm->gbm_device, goto error, "gbm_create_device() failed \n");
+ tdm->bufmgr = tbm_bufmgr_init(tdm->fd);
+ PEPPER_CHECK(tdm->bufmgr, goto error, "tbm_bufmgr_init() failed \n");
#ifdef HAVE_TBM
/* Create wayland-tbm
if (tdm->wl_tbm_server)
wayland_tbm_server_deinit(tdm->wl_tbm_server);
- if (tdm->gbm_device)
- gbm_device_destroy(tdm->gbm_device);
+ if (tdm->bufmgr)
+ tbm_bufmgr_deinit(tdm->bufmgr);
if (tdm->disp)
tdm_display_deinit(tdm->disp);
#include <unistd.h>
#include <config.h>
#include <pixman.h>
-#include <gbm.h>
-#include <gbm/gbm_tbm.h>
#include <tdm.h>
+#include <tbm_bufmgr.h>
+#include <tbm_surface.h>
+#include <tbm_surface_queue.h>
#ifdef HAVE_TBM
#include <wayland-tbm-server.h>
#endif
{
pepper_compositor_t *compositor;
tdm_display *disp;
+ tbm_bufmgr bufmgr;
int fd;
pepper_list_t output_list;
- struct gbm_device *gbm_device;
struct wayland_tbm_server *wl_tbm_server;
struct wl_event_source *tdm_event_source;
pepper_tdm_output_t *output;
pepper_tdm_plane_t *primary_plane;
- struct gbm_surface *gbm_surface;
tbm_surface_queue_h tbm_surface_queue;
tdm_render_type_t render_type;
if (output->render_target)
pepper_render_target_destroy(output->render_target);
- if (output->gbm_surface)
- gbm_surface_destroy(output->gbm_surface);
+ if (output->tbm_surface_queue)
+ tbm_surface_queue_destroy(output->tbm_surface_queue);
output->renderer = NULL;
output->render_target = NULL;
- output->gbm_surface = NULL;
output->tbm_surface_queue = NULL;
}
output->renderer = tdm->pixman_renderer;
tdm_output_get_mode(output->output, &mode);
- output->gbm_surface = gbm_surface_create(tdm->gbm_device,
- mode->width, mode->height, GBM_FORMAT_XRGB8888,
- GBM_BO_USE_SCANOUT | GBM_BO_USE_RENDERING);
- PEPPER_CHECK(output->gbm_surface, goto error, "gbm_surface_create() failed.\n");
-
- output->tbm_surface_queue = gbm_tbm_get_surface_queue(output->gbm_surface);
- PEPPER_CHECK(output->tbm_surface_queue, goto error, "gbm_tbm_get_surface_queue() failed.\n");
+ output->tbm_surface_queue = tbm_surface_queue_create(3,
+ mode->width, mode->height,
+ TBM_FORMAT_XBGR8888, TBM_BO_SCANOUT);
+ PEPPER_CHECK(output->tbm_surface_queue, goto error, "tbm_surface_queue_create() failed.\n");
pixman_region32_init(&output->previous_damage);
output->render_type = TDM_RENDER_TYPE_PIXMAN;
if (output->render_target)
pepper_render_target_destroy(output->render_target);
- if (output->gbm_surface)
- gbm_surface_destroy(output->gbm_surface);
+ if (output->tbm_surface_queue)
+ tbm_surface_queue_destroy(output->tbm_surface_queue);
output->renderer = NULL;
output->render_target = NULL;
- output->gbm_surface = NULL;
output->tbm_surface_queue = NULL;
}
{
pepper_tdm_t *tdm = output->tdm;
const tdm_output_mode *mode;
- uint32_t native_visual_id = GBM_FORMAT_XRGB8888;
+ uint32_t native_visual_id = TBM_FORMAT_XRGB8888;
if (!tdm->gl_renderer)
{
- tdm->gl_renderer = pepper_gl_renderer_create(tdm->compositor, tdm->gbm_device, "gbm");
+ 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;
tdm_output_get_mode(output->output, &mode);
- output->gbm_surface = gbm_surface_create(tdm->gbm_device,
- mode->width, mode->height, GBM_FORMAT_XRGB8888,
- GBM_BO_USE_SCANOUT | GBM_BO_USE_RENDERING);
- PEPPER_CHECK(output->gbm_surface, goto error, "gbm_surface_create() failed.\n");
-
- output->tbm_surface_queue = gbm_tbm_get_surface_queue(output->gbm_surface);
- PEPPER_CHECK(output->tbm_surface_queue, goto error, "gbm_tbm_get_surface_queue() failed.\n");
+ output->tbm_surface_queue = tbm_surface_queue_create(3,
+ mode->width, mode->height,
+ 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->gbm_surface,
+ output->tbm_surface_queue,
PEPPER_FORMAT_XRGB8888,
&native_visual_id,
mode->width, mode->height);