forked from enlightenment/efl
fixed issues on evas gl suport from sungwoo.
SVN revision: 59492
This commit is contained in:
parent
52acb710f5
commit
23c715b282
|
@ -344,3 +344,9 @@
|
||||||
as a "scaled percentage" of the virtual resolution. virtual
|
as a "scaled percentage" of the virtual resolution. virtual
|
||||||
resolution is defineable as is the geometry of each member.
|
resolution is defineable as is the geometry of each member.
|
||||||
|
|
||||||
|
2011-05-18 Sung W. Park
|
||||||
|
|
||||||
|
* Fix some internal stencil and depth requests for OpenGL-ES2
|
||||||
|
due to OpenGL-ES limitations.
|
||||||
|
* Fix Surface recreation for FBO in Evas GL support.
|
||||||
|
|
||||||
|
|
|
@ -37,6 +37,7 @@ struct _Render_Engine
|
||||||
struct _Render_Engine_GL_Surface
|
struct _Render_Engine_GL_Surface
|
||||||
{
|
{
|
||||||
int initialized;
|
int initialized;
|
||||||
|
int fbo_attached;
|
||||||
int w, h;
|
int w, h;
|
||||||
int depth_bits;
|
int depth_bits;
|
||||||
int stencil_bits;
|
int stencil_bits;
|
||||||
|
@ -2120,7 +2121,12 @@ _set_internal_config(Render_Engine_GL_Surface *sfc, Evas_GL_Config *cfg)
|
||||||
case EVAS_GL_DEPTH_BIT_8:
|
case EVAS_GL_DEPTH_BIT_8:
|
||||||
case EVAS_GL_DEPTH_BIT_16:
|
case EVAS_GL_DEPTH_BIT_16:
|
||||||
case EVAS_GL_DEPTH_BIT_24:
|
case EVAS_GL_DEPTH_BIT_24:
|
||||||
|
#if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
|
||||||
|
// 24 bit doesn't work... just cover it with 16 for now..
|
||||||
|
sfc->rb_depth_fmt = GL_DEPTH_COMPONENT16;
|
||||||
|
#else
|
||||||
sfc->rb_depth_fmt = GL_DEPTH_COMPONENT;
|
sfc->rb_depth_fmt = GL_DEPTH_COMPONENT;
|
||||||
|
#endif
|
||||||
break;
|
break;
|
||||||
case EVAS_GL_DEPTH_BIT_32:
|
case EVAS_GL_DEPTH_BIT_32:
|
||||||
default:
|
default:
|
||||||
|
@ -2136,7 +2142,11 @@ _set_internal_config(Render_Engine_GL_Surface *sfc, Evas_GL_Config *cfg)
|
||||||
case EVAS_GL_STENCIL_BIT_2:
|
case EVAS_GL_STENCIL_BIT_2:
|
||||||
case EVAS_GL_STENCIL_BIT_4:
|
case EVAS_GL_STENCIL_BIT_4:
|
||||||
case EVAS_GL_STENCIL_BIT_8:
|
case EVAS_GL_STENCIL_BIT_8:
|
||||||
|
#if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
|
||||||
|
sfc->rb_stencil_fmt = GL_STENCIL_INDEX8;
|
||||||
|
#else
|
||||||
sfc->rb_stencil_fmt = GL_STENCIL_INDEX;
|
sfc->rb_stencil_fmt = GL_STENCIL_INDEX;
|
||||||
|
#endif
|
||||||
break;
|
break;
|
||||||
case EVAS_GL_STENCIL_BIT_16:
|
case EVAS_GL_STENCIL_BIT_16:
|
||||||
default:
|
default:
|
||||||
|
@ -2188,14 +2198,13 @@ _create_rt_buffers(Render_Engine *data __UNUSED__,
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
_create_fbo_surface(Render_Engine *data __UNUSED__,
|
_attach_fbo_surface(Render_Engine *data __UNUSED__,
|
||||||
Render_Engine_GL_Surface *sfc,
|
Render_Engine_GL_Surface *sfc,
|
||||||
Render_Engine_GL_Context *ctx)
|
Render_Engine_GL_Context *ctx)
|
||||||
{
|
{
|
||||||
int fb_status;
|
int fb_status;
|
||||||
|
|
||||||
// FBO
|
// FBO
|
||||||
glGenFramebuffers(1, &ctx->fbo);
|
|
||||||
glBindFramebuffer(GL_FRAMEBUFFER, ctx->fbo);
|
glBindFramebuffer(GL_FRAMEBUFFER, ctx->fbo);
|
||||||
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
|
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
|
||||||
GL_TEXTURE_2D, sfc->rt_tex, 0);
|
GL_TEXTURE_2D, sfc->rt_tex, 0);
|
||||||
|
@ -2229,16 +2238,6 @@ _create_fbo_surface(Render_Engine *data __UNUSED__,
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
static void
|
|
||||||
eng_gl_options_set(void *data, int options __UNUSED__)
|
|
||||||
{
|
|
||||||
Render_Engine *re;
|
|
||||||
|
|
||||||
re = (Render_Engine *)data;
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
static void *
|
static void *
|
||||||
eng_gl_surface_create(void *data, void *config, int w, int h)
|
eng_gl_surface_create(void *data, void *config, int w, int h)
|
||||||
{
|
{
|
||||||
|
@ -2255,6 +2254,7 @@ eng_gl_surface_create(void *data, void *config, int w, int h)
|
||||||
cfg = (Evas_GL_Config *)config;
|
cfg = (Evas_GL_Config *)config;
|
||||||
|
|
||||||
sfc->initialized = 0;
|
sfc->initialized = 0;
|
||||||
|
sfc->fbo_attached = 0;
|
||||||
sfc->w = w;
|
sfc->w = w;
|
||||||
sfc->h = h;
|
sfc->h = h;
|
||||||
sfc->depth_bits = cfg->depth_bits;
|
sfc->depth_bits = cfg->depth_bits;
|
||||||
|
@ -2443,6 +2443,8 @@ eng_gl_context_create(void *data, void *share_context)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
ctx->initialized = 0;
|
ctx->initialized = 0;
|
||||||
|
ctx->fbo = 0;
|
||||||
|
ctx->current_sfc = NULL;
|
||||||
|
|
||||||
return ctx;
|
return ctx;
|
||||||
}
|
}
|
||||||
|
@ -2517,6 +2519,7 @@ eng_gl_make_current(void *data, void *surface, void *context)
|
||||||
sfc = (Render_Engine_GL_Surface*)surface;
|
sfc = (Render_Engine_GL_Surface*)surface;
|
||||||
ctx = (Render_Engine_GL_Context*)context;
|
ctx = (Render_Engine_GL_Context*)context;
|
||||||
|
|
||||||
|
// Flush remainder of what's in Evas' pipeline
|
||||||
if (re->win)
|
if (re->win)
|
||||||
{
|
{
|
||||||
#if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
|
#if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
|
||||||
|
@ -2536,6 +2539,7 @@ eng_gl_make_current(void *data, void *surface, void *context)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Unset surface/context
|
||||||
if ((!sfc) || (!ctx))
|
if ((!sfc) || (!ctx))
|
||||||
{
|
{
|
||||||
#if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
|
#if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
|
||||||
|
@ -2553,11 +2557,18 @@ eng_gl_make_current(void *data, void *surface, void *context)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Don't do a make current if it's already current
|
||||||
#if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
|
#if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
|
||||||
ret = eglMakeCurrent(re->win->egl_disp, re->win->egl_surface[0],
|
if ((eglGetCurrentContext() != ctx->context))
|
||||||
re->win->egl_surface[0], ctx->context);
|
{
|
||||||
|
ret = eglMakeCurrent(re->win->egl_disp, re->win->egl_surface[0],
|
||||||
|
re->win->egl_surface[0], ctx->context);
|
||||||
|
}
|
||||||
#else
|
#else
|
||||||
ret = glXMakeCurrent(re->info->info.display, re->win->win, ctx->context);
|
if (glXGetCurrentContext() != ctx->context)
|
||||||
|
{
|
||||||
|
ret = glXMakeCurrent(re->info->info.display, re->win->win, ctx->context);
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
if (!ret)
|
if (!ret)
|
||||||
{
|
{
|
||||||
|
@ -2565,17 +2576,25 @@ eng_gl_make_current(void *data, void *surface, void *context)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create FBO if not initalized already
|
// Create FBO if not already created
|
||||||
if (!ctx->initialized)
|
if (!ctx->initialized)
|
||||||
{
|
{
|
||||||
if (!_create_fbo_surface(re, sfc, ctx))
|
glGenFramebuffers(1, &ctx->fbo);
|
||||||
{
|
|
||||||
ERR("_create_fbo_surface() failed.");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
ctx->initialized = 1;
|
ctx->initialized = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Attach FBO if it hasn't been attached or if surface changed
|
||||||
|
if ( (!sfc->fbo_attached) || (ctx != sfc->current_ctx))
|
||||||
|
{
|
||||||
|
if (!_attach_fbo_surface(re, sfc, ctx))
|
||||||
|
{
|
||||||
|
ERR("_attach_fbo_surface() failed.");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
sfc->fbo_attached = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set the current surface/context
|
||||||
ctx->current_sfc = sfc;
|
ctx->current_sfc = sfc;
|
||||||
sfc->current_ctx = ctx;
|
sfc->current_ctx = ctx;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue