Fix evas_gl's internal resource surface bug. For optimzation evas_gl

was using evas' window surface to do its resource creation and it 
wans't properly updated when a window is destroyed and recreated.

Also, deleted some whitespaces. 


SVN revision: 74771
This commit is contained in:
Sung Park 2012-08-02 01:15:38 +00:00
parent e40c9a05c8
commit d0b5d1e13e
3 changed files with 90 additions and 58 deletions

View File

@ -943,3 +943,9 @@
* Provide share (Data) file for prefix finding and use
eina_prefix for modules too so we work with debian multiarch
2012-08-02 Sung W. Park (sung_)
* Fix evas_gl's internal resource surface bug. For optimzation evas_gl
was using evas' window surface to do its resource creation and it
wans't properly updated when a window is destroyed and recreated.

View File

@ -26,6 +26,7 @@ Fixes:
* Don't crash when calling evas_object_smart_type_check without type.
* Handle proxy with the right context.
* Force proxied object to stay active to keep track of change in them.
* Fix evas_gl's internal resource surface bug when evas' window is deleted/recreated.
Removal:
* Remove EVAS_FRAME_QUEUING, EVAS_SLI, METRIC_CACHE and WORD_CACHE.

View File

@ -889,6 +889,15 @@ _destroy_internal_glue_resources(void *data)
Render_Engine_GL_Resource *rsc;
#if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
// Create internal resource context if it hasn't been created already
if ((rsc = eina_tls_get(resource_key)) == NULL)
{
ERR("Error retrieving the TLS resources.");
return 0;
}
if (eina_main_loop_is()) rsc->surface = re->win->egl_surface[0];
// EGL
// Delete the Resources
LKL(resource_lock);
@ -900,7 +909,7 @@ _destroy_internal_glue_resources(void *data)
eglDestroyContext(re->win->egl_disp, rsc->context);
free(rsc);
}
#else
#else
// GLX
// Delete the Resources
LKL(resource_lock);
@ -937,6 +946,45 @@ _destroy_internal_glue_resources(void *data)
}
static int
_internal_resources_make_current(void *data)
{
Render_Engine *re = (Render_Engine *)data;
Render_Engine_GL_Resource *rsc;
int ret = 0;
// Create internal resource context if it hasn't been created already
if ((rsc = eina_tls_get(resource_key)) == NULL)
{
if ((rsc = _create_internal_glue_resources(re)) == NULL)
{
ERR("Error creating internal resources.");
return 0;
}
}
// Use resource surface/context to create surface resrouces
#if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
// Update the evas' window surface
if (eina_main_loop_is()) rsc->surface = re->win->egl_surface[0];
ret = eglMakeCurrent(re->win->egl_disp, rsc->surface, rsc->surface, rsc->context);
if (!ret)
{
ERR("eglMakeCurrent() failed. Error Code: %#x", eglGetError());
return 0;
}
#else
ret = glXMakeCurrent(re->info->info.display, re->win->win, rsc->context);
if (!ret)
{
ERR("glXMakeCurrent()!");
return 0;
}
#endif
return 1;
}
static int
eng_setup(Evas *e, void *in)
@ -3391,7 +3439,7 @@ _attach_fbo_surface(Render_Engine *data __UNUSED__,
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_STENCIL_OES, sfc->w, sfc->h,
0, GL_DEPTH_STENCIL_OES, GL_UNSIGNED_INT_24_8_OES, NULL);
if (sfc->rt_msaa_samples)
if (sfc->rt_msaa_samples)
{
glsym_glFramebufferTexture2DMultisample(GL_FRAMEBUFFER,
GL_DEPTH_ATTACHMENT,
@ -3582,25 +3630,10 @@ eng_gl_surface_create(void *data, void *config, int w, int h)
#endif
}
// Create internal resource context if it hasn't been created already
if ((rsc = eina_tls_get(resource_key)) == NULL)
// Use resource surface/context to do a make current
if (!_internal_resources_make_current(re))
{
if ((rsc = _create_internal_glue_resources(re)) == NULL)
{
ERR("Error creating internal resources.");
goto finish;
}
}
// Use resource surface/context to create surface resrouces
#if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
res = eglMakeCurrent(re->win->egl_disp, rsc->surface, rsc->surface, rsc->context);
#else
res = glXMakeCurrent(re->info->info.display, re->win->win, rsc->context);
#endif
if (!res)
{
ERR("xxxMakeCurrent() finish!");
ERR("Error doing a make current with the internal resources.");
goto finish;
}
@ -3662,16 +3695,10 @@ eng_gl_surface_destroy(void *data, void *surface)
if (!sfc) return 0;
if ((rsc = eina_tls_get(resource_key)) == EINA_FALSE) return 0;
#if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
ret = eglMakeCurrent(re->win->egl_disp, rsc->surface, rsc->surface, rsc->context);
#else
ret = glXMakeCurrent(re->info->info.display, re->win->win, rsc->context);
#endif
if (!ret)
// Use resource surface/context to create surface resrouces
if (!_internal_resources_make_current(re))
{
ERR("xxxMakeCurrent() failed!");
ERR("Error doing a make current with the internal resources.");
return 0;
}
@ -3813,19 +3840,10 @@ eng_gl_context_destroy(void *data, void *context)
if (!ctx) return 0;
if ((rsc = eina_tls_get(resource_key)) == EINA_FALSE) return 0;
// Do a make current with the given context
#if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
ret = eglMakeCurrent(re->win->egl_disp, rsc->surface,
rsc->surface, ctx->context);
#else
ret = glXMakeCurrent(re->info->info.display, re->win->win,
ctx->context);
#endif
if (!ret)
// Use resource surface/context to create surface resrouces
if (!_internal_resources_make_current(re))
{
ERR("xxxMakeCurrent() failed!");
ERR("Error doing a make current with the internal resources.");
return 0;
}
@ -3904,7 +3922,14 @@ eng_gl_make_current(void *data __UNUSED__, void *surface, void *context)
// rendering outside of pixel getter but it doesn't guarantee
// correct rendering.
if ((sfc->direct_fb_opt) && (gl_direct_img_obj || gl_direct_override))
gl_direct_enabled = 1;
{
#if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
sfc->direct_sfc = re->win->egl_surface[0];
#else
sfc->direct_sfc = re->win->win;
#endif
gl_direct_enabled = 1;
}
else
gl_direct_enabled = 0;