diff options
author | Vasiliy Ulyanov <v.ulyanov@samsung.com> | 2016-07-04 13:09:28 +0300 |
---|---|---|
committer | Vasiliy Ulyanov <v.ulyanov@samsung.com> | 2016-10-13 02:42:37 -0700 |
commit | 25f0d8669577f7b3b22a3b64e6d54fbbb4d383f4 (patch) | |
tree | 82a635151cb1fff528503b5acfe413240c5737ef | |
parent | 4ecc2a1f8364bc7becbeea7d9b4812975de6b64d (diff) | |
download | emulator-yagl-25f0d8669577f7b3b22a3b64e6d54fbbb4d383f4.tar.gz emulator-yagl-25f0d8669577f7b3b22a3b64e6d54fbbb4d383f4.tar.bz2 emulator-yagl-25f0d8669577f7b3b22a3b64e6d54fbbb4d383f4.zip |
YaGL: Add tpl surface validation
With EFL a 1x1 surface is created at first and then it is resized. There
is a need to handle such situation before drawing GL stuff and
invalidate the renderer.
Change-Id: Ic11cbae921d1f486f1a81fa1633c6f64d5673efe
Signed-off-by: Vasiliy Ulyanov <v.ulyanov@samsung.com>
-rw-r--r-- | EGL/tizen/yagl_tizen_pbuffer.c | 6 | ||||
-rw-r--r-- | EGL/tizen/yagl_tizen_window.c | 31 | ||||
-rw-r--r-- | EGL/yagl_native_drawable.h | 4 | ||||
-rw-r--r-- | EGL/yagl_onscreen_surface.c | 4 |
4 files changed, 39 insertions, 6 deletions
diff --git a/EGL/tizen/yagl_tizen_pbuffer.c b/EGL/tizen/yagl_tizen_pbuffer.c index 68f386a..2660976 100644 --- a/EGL/tizen/yagl_tizen_pbuffer.c +++ b/EGL/tizen/yagl_tizen_pbuffer.c @@ -70,6 +70,11 @@ static int yagl_tizen_pbuffer_get_buffer(struct yagl_native_drawable *drawable, return 1; } +static int yagl_tizen_pbuffer_validate(struct yagl_native_drawable *drawable) +{ + return 1; +} + static int yagl_tizen_pbuffer_get_buffer_age(struct yagl_native_drawable *drawable) { return 0; @@ -186,6 +191,7 @@ struct yagl_native_drawable yagl_native_drawable_init(pbuffer, dpy, (yagl_os_drawable)drm_sfc); pbuffer->get_buffer = &yagl_tizen_pbuffer_get_buffer; + pbuffer->validate = &yagl_tizen_pbuffer_validate; pbuffer->get_buffer_age = &yagl_tizen_pbuffer_get_buffer_age; pbuffer->swap_buffers = &yagl_tizen_pbuffer_swap_buffers; pbuffer->wait = &yagl_tizen_pbuffer_wait; diff --git a/EGL/tizen/yagl_tizen_window.c b/EGL/tizen/yagl_tizen_window.c index 56c338e..3a4c80a 100644 --- a/EGL/tizen/yagl_tizen_window.c +++ b/EGL/tizen/yagl_tizen_window.c @@ -75,8 +75,7 @@ static int yagl_tizen_window_get_buffer(struct yagl_native_drawable *drawable, width = tbm_surface_get_width(tbm_surface); height = tbm_surface_get_height(tbm_surface); - if ((window->width != width) || - (window->height != height)) { + if ((window->width != width) || (window->height != height)) { for (i = 0; i < YAGL_TIZEN_MAX_COLOR_BUF; i++) { if (window->color_buffers[i].locked && window->back != &window->color_buffers[i]) { /* @@ -84,11 +83,13 @@ static int yagl_tizen_window_get_buffer(struct yagl_native_drawable *drawable, */ continue; } - if(window->color_buffers[i].data) { - tbm_surface_internal_unref(window->color_buffers[i].data); - window->color_buffers[i].data = NULL; + + if (window->color_buffers[i].data) { + tbm_surface_internal_unref(window->color_buffers[i].data); + window->color_buffers[i].data = NULL; } - if (window->back == &window->color_buffers[i]) { + + if (window->back == &window->color_buffers[i]) { /* * If it's a back buffer and the window was resized * then we MUST destroy it and create a new one @@ -146,6 +147,22 @@ static int yagl_tizen_window_get_buffer(struct yagl_native_drawable *drawable, return 1; } +static int yagl_tizen_window_validate(struct yagl_native_drawable *drawable) +{ + struct yagl_tizen_window *window = (struct yagl_tizen_window *)drawable; + + if (!window->back || !window->back->data) { + return 1; + } + + if (tpl_surface_validate(window->surface) == TPL_FALSE) { + ++drawable->stamp; + return 0; + } + + return 1; +} + static int yagl_tizen_window_get_buffer_age(struct yagl_native_drawable *drawable) { struct yagl_tizen_window *window = (struct yagl_tizen_window*)drawable; @@ -261,7 +278,9 @@ struct yagl_native_drawable (tpl_handle_t)os_window, TPL_SURFACE_TYPE_WINDOW, TBM_FORMAT_ARGB8888); + window->base.get_buffer = &yagl_tizen_window_get_buffer; + window->base.validate = &yagl_tizen_window_validate; window->base.get_buffer_age = &yagl_tizen_window_get_buffer_age; window->base.swap_buffers = &yagl_tizen_window_swap_buffers; window->base.wait = &yagl_tizen_window_wait; diff --git a/EGL/yagl_native_drawable.h b/EGL/yagl_native_drawable.h index 1641d08..566bacd 100644 --- a/EGL/yagl_native_drawable.h +++ b/EGL/yagl_native_drawable.h @@ -56,6 +56,10 @@ struct yagl_native_drawable uint32_t */*buffer_name*/, struct vigs_drm_surface **/*buffer_sfc*/); +#ifdef YAGL_PLATFORM_TIZEN + int (*validate)(struct yagl_native_drawable */*drawable*/); +#endif + int (*get_buffer_age)(struct yagl_native_drawable */*drawable*/); void (*swap_buffers)(struct yagl_native_drawable */*drawable*/); diff --git a/EGL/yagl_onscreen_surface.c b/EGL/yagl_onscreen_surface.c index 8d65606..e1a3612 100644 --- a/EGL/yagl_onscreen_surface.c +++ b/EGL/yagl_onscreen_surface.c @@ -62,7 +62,11 @@ static void yagl_onscreen_surface_invalidate(struct yagl_surface *sfc) struct yagl_native_drawable *drawable = native_drawable(osfc); struct vigs_drm_surface *new_drm_sfc; +#ifdef YAGL_PLATFORM_TIZEN + if (drawable->validate(drawable) && osfc->last_stamp == drawable->stamp) { +#else if (osfc->last_stamp == drawable->stamp) { +#endif return; } |