summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSung W. Park <dunamis.park@samsung.com>2013-09-10 13:53:56 +0900
committerSung W. Park <dunamis.park@samsung.com>2013-09-10 13:53:56 +0900
commit4ece1a1f9f0f58235fb92ed8cfb0bafe5ee6ef45 (patch)
tree4f7ce89e925cb0e4df922f14ce90b73e1fe96149
parent5c82716fe899417902e17d0d26b7d467df186cbe (diff)
downloadefl-4ece1a1f9f0f58235fb92ed8cfb0bafe5ee6ef45.tar.gz
EvasGL: Fix surface destroy mismatch bug.
For EvasGL direct rendering, EvasGL does a make_current to the surface that evas is holding on to. When EvasGL was shutting down it was wrongly deleting evas' surface. This issue was temporarily fixed by Raphael before but the proper fix was added.
-rw-r--r--src/modules/evas/engines/gl_common/evas_gl_core.c22
-rw-r--r--src/modules/evas/engines/gl_common/evas_gl_core_private.h1
2 files changed, 10 insertions, 13 deletions
diff --git a/src/modules/evas/engines/gl_common/evas_gl_core.c b/src/modules/evas/engines/gl_common/evas_gl_core.c
index 847654191e..5ae7a9e28d 100644
--- a/src/modules/evas/engines/gl_common/evas_gl_core.c
+++ b/src/modules/evas/engines/gl_common/evas_gl_core.c
@@ -43,12 +43,7 @@ _internal_resources_create(void *eng_data)
return NULL;
}
- /*
// Create resource surface
- // Use Evas' surface if it's in the same thread
- if (rsc->id == evgl_engine->main_tid)
- rsc->surface = evgl_engine->funcs->evas_surface_get(evgl_engine->engine_data);
- */
rsc->window = evgl_engine->funcs->native_window_create(eng_data);
if (!rsc->window)
{
@@ -63,12 +58,6 @@ _internal_resources_create(void *eng_data)
goto error;
}
- if (!rsc->surface)
- {
- ERR("Internal resource surface failed.");
- goto error;
- }
-
// Create a resource context
rsc->context = evgl_engine->funcs->context_create(eng_data, NULL);
if (!rsc->context)
@@ -90,7 +79,7 @@ _internal_resources_destroy(void *eng_data, EVGL_Resource *rsc)
if ((!eng_data) || (!rsc)) return;
if (rsc->context)
- evgl_engine->funcs->context_destroy(eng_data, rsc->context);
+ evgl_engine->funcs->context_destroy(eng_data, rsc->context);
if (rsc->surface)
evgl_engine->funcs->surface_destroy(eng_data, rsc->surface);
if (rsc->window)
@@ -123,7 +112,14 @@ _internal_resource_make_current(void *eng_data, EVGL_Context *ctx)
else
context = (void*)rsc->context;
- surface = (void*)rsc->surface;
+ // Set the surface to evas surface if it's there
+ if (rsc->id == evgl_engine->main_tid)
+ rsc->direct_surface = evgl_engine->funcs->evas_surface_get(eng_data);
+
+ if (rsc->direct_surface)
+ surface = (void*)rsc->direct_surface;
+ else
+ surface = (void*)rsc->surface;
// Do the make current
ret = evgl_engine->funcs->make_current(eng_data, surface, context, 1);
diff --git a/src/modules/evas/engines/gl_common/evas_gl_core_private.h b/src/modules/evas/engines/gl_common/evas_gl_core_private.h
index fe296aee6d..5c617b6c69 100644
--- a/src/modules/evas/engines/gl_common/evas_gl_core_private.h
+++ b/src/modules/evas/engines/gl_common/evas_gl_core_private.h
@@ -209,6 +209,7 @@ struct _EVGL_Resource
EVGL_Context *current_ctx;
void *current_eng;
+ EVGLNative_Surface direct_surface;
int direct_rendered;
Evas_Object *direct_img_obj;
int get_pixels_set;