summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVasiliy Ulyanov <v.ulyanov@samsung.com>2016-07-04 13:09:28 +0300
committerVasiliy Ulyanov <v.ulyanov@samsung.com>2016-10-13 02:42:37 -0700
commit25f0d8669577f7b3b22a3b64e6d54fbbb4d383f4 (patch)
tree82a635151cb1fff528503b5acfe413240c5737ef
parent4ecc2a1f8364bc7becbeea7d9b4812975de6b64d (diff)
downloademulator-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.c6
-rw-r--r--EGL/tizen/yagl_tizen_window.c31
-rw-r--r--EGL/yagl_native_drawable.h4
-rw-r--r--EGL/yagl_onscreen_surface.c4
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;
}