summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Blumenkrantz <zmike@osg.samsung.com>2017-07-21 16:17:55 -0400
committerMike Blumenkrantz <zmike@osg.samsung.com>2017-07-21 16:17:54 -0400
commit93bac8ce4a88064c430d55b34fa80bd914f2c2f9 (patch)
tree60a64b28537a354e0809568352f01254a7b6a7d3
parent5070ecc99aeed399775a834e60b6485d61a35624 (diff)
downloadefl-93bac8ce4a88064c430d55b34fa80bd914f2c2f9.tar.gz
wayland: stop creating 1x1 surfaces on init
fix T5226 #IGot99TicketsBut1x1AintOne
-rw-r--r--src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_common.c6
-rw-r--r--src/modules/evas/engines/drm/evas_outbuf.c2
-rw-r--r--src/modules/evas/engines/wayland_egl/evas_engine.c2
-rw-r--r--src/modules/evas/engines/wayland_egl/evas_wl_main.c78
-rw-r--r--src/modules/evas/engines/wayland_shm/evas_dmabuf.c37
-rw-r--r--src/modules/evas/engines/wayland_shm/evas_shm.c14
6 files changed, 71 insertions, 68 deletions
diff --git a/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_common.c b/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_common.c
index 3946f5e4ef..eb36e9644e 100644
--- a/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_common.c
+++ b/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_common.c
@@ -184,9 +184,6 @@ _ecore_evas_wl_common_resize(Ecore_Evas *ee, int w, int h)
wdata = ee->engine.data;
if (!wdata) return;
- if (w < 1) w = 1;
- if (h < 1) h = 1;
-
ee->req.w = w;
ee->req.h = h;
@@ -2275,9 +2272,6 @@ _ecore_evas_wl_common_new_internal(const char *disp_name, unsigned int parent, i
ee->driver = engine_name;
if (disp_name) ee->name = strdup(disp_name);
- if (w < 1) w = 1;
- if (h < 1) h = 1;
-
ee->x = x;
ee->y = y;
ee->w = w;
diff --git a/src/modules/evas/engines/drm/evas_outbuf.c b/src/modules/evas/engines/drm/evas_outbuf.c
index 99e8f42af9..d65b92107d 100644
--- a/src/modules/evas/engines/drm/evas_outbuf.c
+++ b/src/modules/evas/engines/drm/evas_outbuf.c
@@ -86,6 +86,7 @@ _outbuf_setup(Evas_Engine_Info_Drm *info, int w, int h)
else if (ob->priv.num > 4) ob->priv.num = 4;
}
+ if ((!w) || (!h)) return ob;
for (i = 0; i < ob->priv.num; i++)
{
if (!_outbuf_fb_create(ob, &(ob->priv.ofb[i])))
@@ -179,6 +180,7 @@ _outbuf_reconfigure(Outbuf *ob, int w, int h, int rotation, Outbuf_Depth depth)
for (i = 0; i < ob->priv.num; i++)
_outbuf_fb_destroy(&ob->priv.ofb[i]);
+ if ((!w) || (!h)) return;
for (i = 0; i < ob->priv.num; i++)
{
if (!_outbuf_fb_create(ob, &(ob->priv.ofb[i])))
diff --git a/src/modules/evas/engines/wayland_egl/evas_engine.c b/src/modules/evas/engines/wayland_egl/evas_engine.c
index 1c90a5b6fd..02766aaf1d 100644
--- a/src/modules/evas/engines/wayland_egl/evas_engine.c
+++ b/src/modules/evas/engines/wayland_egl/evas_engine.c
@@ -701,7 +701,7 @@ eng_update(void *engine EINA_UNUSED, void *data, void *info, unsigned int w, uns
return 1;
}
- if ((ob) && (_re_wincheck(ob)))
+ if (ob)
{
ob->info = inf;
if ((ob->info->info.wl_display != ob->disp) ||
diff --git a/src/modules/evas/engines/wayland_egl/evas_wl_main.c b/src/modules/evas/engines/wayland_egl/evas_wl_main.c
index 36a3c81ab6..59c69c6dfb 100644
--- a/src/modules/evas/engines/wayland_egl/evas_wl_main.c
+++ b/src/modules/evas/engines/wayland_egl/evas_wl_main.c
@@ -101,22 +101,6 @@ eng_window_new(Evas_Engine_Info_Wayland *einfo, int w, int h, Render_Engine_Swap
return NULL;
}
- if ((gw->rot == 0) || (gw->rot == 180))
- gw->win = wl_egl_window_create(gw->surface, gw->w, gw->h);
- else if ((gw->rot == 90) || (gw->rot == 270))
- gw->win = wl_egl_window_create(gw->surface, gw->h, gw->w);
-
- gw->egl_surface =
- eglCreateWindowSurface(gw->egl_disp, gw->egl_config,
- (EGLNativeWindowType)gw->win, NULL);
- if (gw->egl_surface == EGL_NO_SURFACE)
- {
- ERR("eglCreateWindowSurface() fail for %p. code=%#x",
- gw->win, eglGetError());
- eng_window_free(gw);
- return NULL;
- }
-
gw->egl_context =
eglCreateContext(gw->egl_disp, gw->egl_config, context, context_attrs);
if (gw->egl_context == EGL_NO_CONTEXT)
@@ -128,14 +112,6 @@ eng_window_new(Evas_Engine_Info_Wayland *einfo, int w, int h, Render_Engine_Swap
if (context == EGL_NO_CONTEXT) context = gw->egl_context;
- if (eglMakeCurrent(gw->egl_disp, gw->egl_surface,
- gw->egl_surface, gw->egl_context) == EGL_FALSE)
- {
- ERR("eglMakeCurrent() fail. code=%#x", eglGetError());
- eng_window_free(gw);
- return NULL;
- }
-
vendor = glGetString(GL_VENDOR);
renderer = glGetString(GL_RENDERER);
version = glGetString(GL_VERSION);
@@ -168,22 +144,29 @@ eng_window_new(Evas_Engine_Info_Wayland *einfo, int w, int h, Render_Engine_Swap
return NULL;
}
- eng_gl_symbols(gw->egl_disp);
-
- if (!(gw->gl_context = glsym_evas_gl_common_context_new()))
+ if (w && h)
+ eng_window_resurf(gw);
+ else
{
- eng_window_free(gw);
- return NULL;
- }
-
- gw->gl_context->egldisp = gw->egl_disp;
- gw->gl_context->eglctxt = gw->egl_context;
-
- eng_window_use(gw);
- glsym_evas_gl_common_context_resize(gw->gl_context, w, h, gw->rot);
+ if (eglMakeCurrent(gw->egl_disp, EGL_NO_SURFACE,
+ EGL_NO_SURFACE, gw->egl_context) == EGL_FALSE)
+ {
+ ERR("eglMakeCurrent() fail. code=%#x", eglGetError());
+ eng_window_free(gw);
+ return NULL;
+ }
+ eng_gl_symbols(gw->egl_disp);
- gw->surf = EINA_TRUE;
+ if (!(gw->gl_context = glsym_evas_gl_common_context_new()))
+ {
+ eng_window_free(gw);
+ return NULL;
+ }
+ gw->gl_context->egldisp = gw->egl_disp;
+ gw->gl_context->eglctxt = gw->egl_context;
+ eng_window_use(gw);
+ }
return gw;
}
@@ -298,11 +281,18 @@ eng_window_resurf(Outbuf *gw)
{
if (gw->surf) return;
if (getenv("EVAS_GL_INFO")) printf("resurf %p\n", gw);
+ if ((!gw->w) || (!gw->h)) return;
+ if (!gw->win)
+ {
+ if ((gw->rot == 0) || (gw->rot == 180))
+ gw->win = wl_egl_window_create(gw->surface, gw->w, gw->h);
+ else if ((gw->rot == 90) || (gw->rot == 270))
+ gw->win = wl_egl_window_create(gw->surface, gw->h, gw->w);
+ }
gw->egl_surface =
eglCreateWindowSurface(gw->egl_disp, gw->egl_config,
(EGLNativeWindowType)gw->win, NULL);
-
if (gw->egl_surface == EGL_NO_SURFACE)
{
ERR("eglCreateWindowSurface() fail for %p. code=%#x",
@@ -310,9 +300,12 @@ eng_window_resurf(Outbuf *gw)
return;
}
- if (eglMakeCurrent(gw->egl_disp, gw->egl_surface, gw->egl_surface,
- gw->egl_context) == EGL_FALSE)
- ERR("eglMakeCurrent() failed!");
+ if (eglMakeCurrent(gw->egl_disp, gw->egl_surface,
+ gw->egl_surface, gw->egl_context) == EGL_FALSE)
+ {
+ ERR("eglMakeCurrent() fail. code=%#x", eglGetError());
+ return;
+ }
gw->surf = EINA_TRUE;
}
@@ -323,6 +316,9 @@ eng_outbuf_reconfigure(Outbuf *ob, int w, int h, int rot, Outbuf_Depth depth EIN
ob->w = w;
ob->h = h;
ob->rot = rot;
+
+ if (!ob->win)
+ eng_window_resurf(ob);
eng_window_use(ob);
glsym_evas_gl_common_context_resize(ob->gl_context, w, h, rot);
diff --git a/src/modules/evas/engines/wayland_shm/evas_dmabuf.c b/src/modules/evas/engines/wayland_shm/evas_dmabuf.c
index 92413ea93a..63e54a4999 100644
--- a/src/modules/evas/engines/wayland_shm/evas_dmabuf.c
+++ b/src/modules/evas/engines/wayland_shm/evas_dmabuf.c
@@ -562,20 +562,24 @@ _evas_dmabuf_surface_reconfigure(Surface *s, int w, int h, uint32_t flags EINA_U
Dmabuf_Surface *surface;
int i;
+ if ((!w) || (!h)) return;
surface = s->surf.dmabuf;
for (i = 0; i < surface->nbuf; i++)
{
- Dmabuf_Buffer *b = surface->buffer[i];
- int stride = b->stride;
-
- /* If stride is a little bigger than width we still fit */
- if (!force && (w >= b->w) && (w <= stride / 4) && (h == b->h))
+ if (surface->buffer[i])
{
- b->w = w;
- continue;
- }
+ Dmabuf_Buffer *b = surface->buffer[i];
+ int stride = b->stride;
- _evas_dmabuf_buffer_destroy(b);
+ /* If stride is a little bigger than width we still fit */
+ if (!force && (w >= b->w) && (w <= stride / 4) && (h == b->h))
+ {
+ b->w = w;
+ continue;
+ }
+
+ _evas_dmabuf_buffer_destroy(b);
+ }
buf = _evas_dmabuf_buffer_init(surface, w, h);
surface->buffer[i] = buf;
if (!buf)
@@ -795,14 +799,17 @@ _evas_dmabuf_surface_create(Surface *s, int w, int h, int num_buff)
if (!_buffer_manager_get()) goto err;
- for (i = 0; i < num_buff; i++)
+ if (w && h)
{
- surf->buffer[i] = _evas_dmabuf_buffer_init(surf, w, h);
- if (!surf->buffer[i])
+ for (i = 0; i < num_buff; i++)
{
- DBG("Could not create buffers");
- /* _init() handled surface cleanup when it failed */
- return EINA_FALSE;
+ surf->buffer[i] = _evas_dmabuf_buffer_init(surf, w, h);
+ if (!surf->buffer[i])
+ {
+ DBG("Could not create buffers");
+ /* _init() handled surface cleanup when it failed */
+ return EINA_FALSE;
+ }
}
}
diff --git a/src/modules/evas/engines/wayland_shm/evas_shm.c b/src/modules/evas/engines/wayland_shm/evas_shm.c
index 529b6098f5..28feb3fdbd 100644
--- a/src/modules/evas/engines/wayland_shm/evas_shm.c
+++ b/src/modules/evas/engines/wayland_shm/evas_shm.c
@@ -431,6 +431,7 @@ _evas_shm_surface_reconfigure(Surface *s, int w, int h, uint32_t flags, Eina_Boo
surface->w = w;
surface->h = h;
+ if ((!w) || (!h)) return;
for (i = 0; i < surface->num_buff; i++)
{
if (surface->leaf[i].busy) continue;
@@ -600,13 +601,16 @@ _evas_shm_surface_create(Surface *s, int w, int h, int num_buff)
surf->alpha = s->info->info.destination_alpha;
surf->compositor_version = s->info->info.compositor_version;
- /* create surface buffers */
- for (; i < surf->num_buff; i++)
+ if (w && h)
{
- if (!_shm_leaf_create(surf, &(surf->leaf[i]), w, h))
+ /* create surface buffers */
+ for (; i < surf->num_buff; i++)
{
- ERR("Could not create surface leaf");
- goto err;
+ if (!_shm_leaf_create(surf, &(surf->leaf[i]), w, h))
+ {
+ ERR("Could not create surface leaf");
+ goto err;
+ }
}
}