From f027152d14bbbabff4b1ba0e98fcd9cd6c5bae9d Mon Sep 17 00:00:00 2001 From: Joogab Yun Date: Wed, 17 Jun 2015 14:34:30 +0900 Subject: [PATCH] evas_gl: Add feature to set depth/stencil/msaa bit to window surface. Summary: When Evas GL runs with direct rendering, it can not set depth, stencil and msaa to Window surface. This patch is possible to use "option" input paramater of ecore_evas_gl_x11_options_new. So, new API is not needed. The other patch is in elementary. The elementary patch will be used this patch. Test Plan: Test elm gl veiw in elementary_test and JP's test app. Differential Revision: https://phab.enlightenment.org/D2144 Change-Id: If854ffae327fdd81e52fde44c79aea2e7c98b39e --- src/lib/ecore_evas/Ecore_Evas.h | 5 +- src/modules/ecore_evas/engines/x/ecore_evas_x.c | 15 +++++ src/modules/evas/engines/gl_common/evas_gl_core.c | 36 +++++++---- .../evas/engines/gl_common/evas_gl_core_private.h | 5 +- src/modules/evas/engines/gl_drm/evas_engine.c | 1 + src/modules/evas/engines/gl_sdl/evas_engine.c | 1 + .../evas/engines/gl_x11/Evas_Engine_GL_X11.h | 5 ++ src/modules/evas/engines/gl_x11/evas_engine.c | 35 ++++++++++- src/modules/evas/engines/gl_x11/evas_engine.h | 14 ++++- src/modules/evas/engines/gl_x11/evas_x_main.c | 71 ++++++++++++++++++++-- src/modules/evas/engines/wayland_egl/evas_engine.c | 1 + 11 files changed, 164 insertions(+), 25 deletions(-) diff --git a/src/lib/ecore_evas/Ecore_Evas.h b/src/lib/ecore_evas/Ecore_Evas.h index 8930dc9..37b037b 100644 --- a/src/lib/ecore_evas/Ecore_Evas.h +++ b/src/lib/ecore_evas/Ecore_Evas.h @@ -1136,7 +1136,10 @@ EAPI Ecore_X_Pixmap ecore_evas_software_x11_pixmap_get(const Ecore_Evas *ee); #define ECORE_EVAS_GL_X11_OPT_INDIRECT 1 #define ECORE_EVAS_GL_X11_OPT_VSYNC 2 #define ECORE_EVAS_GL_X11_OPT_SWAP_MODE 3 -#define ECORE_EVAS_GL_X11_OPT_LAST 4 +#define ECORE_EVAS_GL_X11_OPT_GL_DEPTH 4 +#define ECORE_EVAS_GL_X11_OPT_GL_STENCIL 5 +#define ECORE_EVAS_GL_X11_OPT_GL_MSAA 6 +#define ECORE_EVAS_GL_X11_OPT_LAST 7 #define ECORE_EVAS_GL_X11_SWAP_MODE_AUTO 0 #define ECORE_EVAS_GL_X11_SWAP_MODE_FULL 1 diff --git a/src/modules/ecore_evas/engines/x/ecore_evas_x.c b/src/modules/ecore_evas/engines/x/ecore_evas_x.c index 31d5108..2d9c8f9 100644 --- a/src/modules/ecore_evas/engines/x/ecore_evas_x.c +++ b/src/modules/ecore_evas/engines/x/ecore_evas_x.c @@ -432,6 +432,21 @@ _ecore_evas_x_gl_window_new(Ecore_Evas *ee, Ecore_X_Window parent, int x, int y, einfo->swap_mode = opt[op]; } #endif + else if (opt[op] == ECORE_EVAS_GL_X11_OPT_GL_DEPTH) + { + op++; + einfo->depth_bits = opt[op]; + } + else if (opt[op] == ECORE_EVAS_GL_X11_OPT_GL_STENCIL) + { + op++; + einfo->stencil_bits = opt[op]; + } + else if (opt[op] == ECORE_EVAS_GL_X11_OPT_GL_MSAA) + { + op++; + einfo->msaa_bits = opt[op]; + } } } 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 7c4d13a..cbb9998 100755 --- a/src/modules/evas/engines/gl_common/evas_gl_core.c +++ b/src/modules/evas/engines/gl_common/evas_gl_core.c @@ -348,7 +348,11 @@ _fbo_surface_cap_test(GLint color_ifmt, GLenum color_fmt, // Return the result if (fb_status != GL_FRAMEBUFFER_COMPLETE) { - // Put Error Log... + int err = glGetError(); + + if (err != GL_NO_ERROR) + DBG("glGetError() returns %x ", err); + return 0; } else @@ -1066,10 +1070,11 @@ _surface_buffers_destroy(EVGL_Surface *sfc) } static int -_internal_config_set(EVGL_Surface *sfc, Evas_GL_Config *cfg) +_internal_config_set(void *eng_data, EVGL_Surface *sfc, Evas_GL_Config *cfg) { int i = 0, cfg_index = -1; int color_bit = 0, depth_bit = 0, stencil_bit = 0, msaa_samples = 0; + int support_win_cfg = 1; // Check if engine is valid if (!evgl_engine) @@ -1117,11 +1122,16 @@ _internal_config_set(EVGL_Surface *sfc, Evas_GL_Config *cfg) sfc->depth_stencil_fmt = evgl_engine->caps.fbo_fmts[i].depth_stencil_fmt; sfc->msaa_samples = evgl_engine->caps.fbo_fmts[i].samples; - // TODO: Implement surface reconfigure and add depth+stencil support - // Direct Rendering Option - if ((!depth_bit && !stencil_bit && !msaa_samples) || evgl_engine->direct_override) - sfc->direct_fb_opt = cfg->options_bits & EVAS_GL_OPTIONS_DIRECT; + if (((depth_bit > 0) || (stencil_bit > 0) || (msaa_samples > 0)) + && (evgl_engine->funcs->native_win_surface_config_check)) + { + DBG("request to check win cfg with depth %d, stencil %d, msaa %d", depth_bit, stencil_bit, msaa_samples); + support_win_cfg = evgl_engine->funcs->native_win_surface_config_check(eng_data,depth_bit,stencil_bit,msaa_samples); + } + + if ((sfc->direct_override) || (support_win_cfg == 1)) + sfc->direct_fb_opt = !!(cfg->options_bits & EVAS_GL_OPTIONS_DIRECT); // Extra flags for direct rendering sfc->client_side_rotation = !!(cfg->options_bits & EVAS_GL_OPTIONS_CLIENT_SIDE_ROTATION); @@ -1139,15 +1149,16 @@ _internal_config_set(EVGL_Surface *sfc, Evas_GL_Config *cfg) } else { - DBG("-------------Surface Config---------------"); + DBG("-------------Evas GL Surface Config---------------"); DBG("Selected Config Index: %d", cfg_index); DBG(" Color Format : %s", _glenum_string_get(sfc->color_fmt)); DBG(" Depth Format : %s", _glenum_string_get(sfc->depth_fmt)); DBG(" Stencil Format : %s", _glenum_string_get(sfc->stencil_fmt)); DBG(" D-Stencil Format : %s", _glenum_string_get(sfc->depth_stencil_fmt)); DBG(" MSAA Samples : %d", sfc->msaa_samples); - DBG(" Direct Option : %d", sfc->direct_fb_opt); + DBG(" Direct Option : %d%s", sfc->direct_fb_opt, sfc->direct_override ? " (override)" : ""); DBG(" Client-side Rot. : %d", sfc->client_side_rotation); + DBG("--------------------------------------------------"); sfc->cfg_index = cfg_index; return 1; } @@ -1555,7 +1566,7 @@ evgl_surface_create(void *eng_data, Evas_GL_Config *cfg, int w, int h) { EVGL_Surface *sfc = NULL; char *s = NULL; - int direct_override = 0, direct_mem_opt = 0, evgl_msaa = 0; + int direct_override = 0, direct_mem_opt = 0; Eina_Bool need_reconfigure = EINA_FALSE; Eina_Bool dbg; @@ -1625,7 +1636,7 @@ evgl_surface_create(void *eng_data, Evas_GL_Config *cfg, int w, int h) } // Set the internal config value - if (!_internal_config_set(sfc, cfg)) + if (!_internal_config_set(eng_data, sfc, cfg)) { ERR("Unsupported Format!"); evas_gl_common_error_set(eng_data, EVAS_GL_BAD_CONFIG); @@ -1671,8 +1682,7 @@ evgl_surface_create(void *eng_data, Evas_GL_Config *cfg, int w, int h) } INF("Creating special surface for GLES 1.x rendering"); - evgl_msaa = evgl_engine->caps.msaa_samples[(int) cfg->multisample_bits - 1]; - evgl_engine->funcs->gles1_surface_create(eng_data, sfc, cfg, w, h, evgl_msaa); + evgl_engine->funcs->gles1_surface_create(eng_data, sfc, cfg, w, h); } // Create internal buffers @@ -1794,7 +1804,7 @@ evgl_pbuffer_surface_create(void *eng_data, Evas_GL_Config *cfg, if (sfc->pbuffer.color_fmt != EVAS_GL_NO_FBO) { // Set the internal config value - if (!_internal_config_set(sfc, cfg)) + if (!_internal_config_set(eng_data, sfc, cfg)) { ERR("Unsupported Format!"); evas_gl_common_error_set(eng_data, EVAS_GL_BAD_CONFIG); 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 87373bf..10578b2 100755 --- a/src/modules/evas/engines/gl_common/evas_gl_core_private.h +++ b/src/modules/evas/engines/gl_common/evas_gl_core_private.h @@ -70,7 +70,7 @@ struct _EVGL_Interface int (*pbuffer_surface_destroy)(void *data, void *surface); // Create a surface for 1.x rendering (could be pbuffer or xpixmap for instance) - void *(*gles1_surface_create)(void *data, EVGL_Surface *evgl_sfc, Evas_GL_Config *cfg, int w, int h, int evgl_msaa); + void *(*gles1_surface_create)(void *data, EVGL_Surface *evgl_sfc, Evas_GL_Config *cfg, int w, int h); // Destroy 1.x surface (could be pbuffer or xpixmap for instance) int (*gles1_surface_destroy)(void *data, EVGL_Surface *evgl_sfc); @@ -78,6 +78,9 @@ struct _EVGL_Interface // Create an indirect rendering context for GLES 1.x void *(*gles1_context_create)(void *data, EVGL_Context *share_ctx, EVGL_Surface *evgl_sfc); + // Check native window surface config for Evas GL Direct Rendering + int (*native_win_surface_config_check)(void *data, int evgl_depth, int evgl_stencil, int evgl_msaa); + }; struct _EVGL_Surface diff --git a/src/modules/evas/engines/gl_drm/evas_engine.c b/src/modules/evas/engines/gl_drm/evas_engine.c index b5283ee..d7d07ca 100644 --- a/src/modules/evas/engines/gl_drm/evas_engine.c +++ b/src/modules/evas/engines/gl_drm/evas_engine.c @@ -124,6 +124,7 @@ static const EVGL_Interface evgl_funcs = NULL, // PBuffer NULL, // OpenGL-ES 1 NULL, // OpenGL-ES 1 + NULL, //native_win_surface_config_check }; /* local functions */ diff --git a/src/modules/evas/engines/gl_sdl/evas_engine.c b/src/modules/evas/engines/gl_sdl/evas_engine.c index 1fa4e49..61ab67b 100644 --- a/src/modules/evas/engines/gl_sdl/evas_engine.c +++ b/src/modules/evas/engines/gl_sdl/evas_engine.c @@ -259,6 +259,7 @@ static const EVGL_Interface evgl_funcs = NULL, // PBuffer NULL, // OpenGL-ES 1 NULL, // OpenGL-ES 1 + NULL, //native_win_surface_config_check }; diff --git a/src/modules/evas/engines/gl_x11/Evas_Engine_GL_X11.h b/src/modules/evas/engines/gl_x11/Evas_Engine_GL_X11.h index e66539e..db37cd0 100644 --- a/src/modules/evas/engines/gl_x11/Evas_Engine_GL_X11.h +++ b/src/modules/evas/engines/gl_x11/Evas_Engine_GL_X11.h @@ -54,5 +54,10 @@ struct _Evas_Engine_Info_GL_X11 unsigned char vsync : 1; // does nothing right now unsigned char indirect : 1; // use indirect rendering unsigned char swap_mode : 4; // what swap mode to assume + + /*window surface should be made with these config*/ + int depth_bits; + int stencil_bits; + int msaa_bits; }; #endif diff --git a/src/modules/evas/engines/gl_x11/evas_engine.c b/src/modules/evas/engines/gl_x11/evas_engine.c index 14b9b40..823cbb4 100755 --- a/src/modules/evas/engines/gl_x11/evas_engine.c +++ b/src/modules/evas/engines/gl_x11/evas_engine.c @@ -868,7 +868,7 @@ evgl_eng_pbuffer_surface_destroy(void *data, void *surface) // FIXME: Avoid passing evgl_engine around like that. static void * evgl_eng_gles1_surface_create(void *data, EVGL_Surface *evgl_sfc, - Evas_GL_Config *cfg, int w, int h, int evgl_msaa) + Evas_GL_Config *cfg, int w, int h) { Render_Engine *re = (Render_Engine *)data; Eina_Bool alpha = EINA_FALSE; @@ -1171,6 +1171,25 @@ evgl_eng_gles1_context_create(void *data, #endif } +static int +evgl_eng_native_win_surface_config_check(void *data, + int evgl_depth, int evgl_stencil, int evgl_msaa) +{ + Render_Engine *re = data; + if (!re) return 0; + + if ((eng_get_ob(re)->detected.depth_buffer_size >= evgl_depth) + && (eng_get_ob(re)->detected.stencil_buffer_size >= evgl_stencil) + && (eng_get_ob(re)->detected.msaa >= evgl_msaa)) + { + DBG("Win cfg can support the Req Evas GL's config successfully"); + return 1; + } + DBG("Win cfg can'n support.win depth %d, stencil %d, msaa %d", + eng_get_ob(re)->detected.depth_buffer_size, eng_get_ob(re)->detected.stencil_buffer_size,eng_get_ob(re)->detected.msaa); + return 0; +} + static const EVGL_Interface evgl_funcs = { evgl_eng_display_get, @@ -1190,6 +1209,7 @@ static const EVGL_Interface evgl_funcs = evgl_eng_gles1_surface_create, evgl_eng_gles1_surface_destroy, evgl_eng_gles1_context_create, + evgl_eng_native_win_surface_config_check, }; //----------------------------------------------------------// @@ -1587,7 +1607,10 @@ eng_setup(Evas *eo_e, void *in) info->indirect, info->info.destination_alpha, info->info.rotation, - swap_mode); + swap_mode, + info->depth_bits, + info->stencil_bits, + info->msaa_bits); if (!ob) { free(re); @@ -1652,6 +1675,9 @@ eng_setup(Evas *eo_e, void *in) (info->info.visual != eng_get_ob(re)->visual) || (info->info.colormap != eng_get_ob(re)->colormap) || (info->info.depth != eng_get_ob(re)->depth) || + (info->depth_bits != eng_get_ob(re)->depth_bits) || + (info->stencil_bits != eng_get_ob(re)->stencil_bits) || + (info->msaa_bits != eng_get_ob(re)->msaa_bits) || (info->info.destination_alpha != eng_get_ob(re)->alpha)) { Outbuf *ob, *ob_old; @@ -1671,7 +1697,10 @@ eng_setup(Evas *eo_e, void *in) info->indirect, info->info.destination_alpha, info->info.rotation, - swap_mode); + swap_mode, + info->depth_bits, + info->stencil_bits, + info->msaa_bits); if (!ob) { if (ob_old) eng_window_free(ob_old); diff --git a/src/modules/evas/engines/gl_x11/evas_engine.h b/src/modules/evas/engines/gl_x11/evas_engine.h index 347c41f..bc642b4 100644 --- a/src/modules/evas/engines/gl_x11/evas_engine.h +++ b/src/modules/evas/engines/gl_x11/evas_engine.h @@ -68,15 +68,24 @@ struct _Outbuf #else GLXContext context; GLXWindow glxwin; +#endif struct { + unsigned char depth_buffer_size; + unsigned char stencil_buffer_size; + unsigned char msaa; +#ifndef GL_GLES Eina_Bool loose_binding : 1; - } detected; #endif + } detected; + Evas *evas; Display *disp; XVisualInfo *visualinfo; Visual *visual; + int depth_bits; + int stencil_bits; + int msaa_bits; Evas_Engine_GL_Context *gl_context; Evas_Engine_Info_GL_X11 *info; @@ -158,7 +167,8 @@ Outbuf *eng_window_new(Evas_Engine_Info_GL_X11 *info, Evas *e, Visual *vis, Colormap cmap, int depth, int w, int h, int indirect, int alpha, int rot, - Render_Engine_Swap_Mode swap_mode); + Render_Engine_Swap_Mode swap_mode, + int depth_bits, int stencil_bits, int msaa_bits); void eng_window_free(Outbuf *gw); void eng_window_use(Outbuf *gw); void eng_window_unsurf(Outbuf *gw); diff --git a/src/modules/evas/engines/gl_x11/evas_x_main.c b/src/modules/evas/engines/gl_x11/evas_x_main.c index d0908da..cfb1dc8 100644 --- a/src/modules/evas/engines/gl_x11/evas_x_main.c +++ b/src/modules/evas/engines/gl_x11/evas_x_main.c @@ -117,7 +117,10 @@ eng_window_new(Evas_Engine_Info_GL_X11 *info, int indirect EINA_UNUSED, int alpha, int rot, - Render_Engine_Swap_Mode swap_mode) + Render_Engine_Swap_Mode swap_mode, + int depth_bits, + int stencil_bits, + int msaa_bits) { Outbuf *gw; GLContext context; @@ -129,6 +132,7 @@ eng_window_new(Evas_Engine_Info_GL_X11 *info, #endif const GLubyte *vendor, *renderer, *version, *glslversion; int blacklist = 0; + int val = 0; if (!fbconf) eng_best_visual_get(info); if (!_evas_gl_x11_vi) return NULL; @@ -150,6 +154,9 @@ eng_window_new(Evas_Engine_Info_GL_X11 *info, gw->swap_mode = swap_mode; gw->info = info; gw->evas = e; + gw->depth_bits = depth_bits; + gw->stencil_bits = stencil_bits; + gw->msaa_bits = msaa_bits; if (gw->alpha && _evas_gl_x11_rgba_vi) gw->visualinfo = _evas_gl_x11_rgba_vi; @@ -255,6 +262,17 @@ eng_window_new(Evas_Engine_Info_GL_X11 *info, eng_window_free(gw); return NULL; } + + eglGetConfigAttrib(gw->egl_disp, gw->egl_config, EGL_DEPTH_SIZE, &val); + gw->detected.depth_buffer_size = val; + DBG("Detected depth size %d", val); + eglGetConfigAttrib(gw->egl_disp, gw->egl_config, EGL_STENCIL_SIZE, &val); + gw->detected.stencil_buffer_size = val; + DBG("Detected stencil size %d", val); + eglGetConfigAttrib(gw->egl_disp, gw->egl_config, EGL_SAMPLES, &val); + gw->detected.msaa = val; + DBG("Detected msaa %d", val); + // GLX #else context = _tls_context_get(); @@ -427,6 +445,13 @@ eng_window_new(Evas_Engine_Info_GL_X11 *info, { // noothing yet. add more cases and options over time } + + glXGetConfig(gw->disp, gw->visualinfo, GLX_DEPTH_SIZE, &val); + gw->detected.depth_buffer_size = val; + glXGetConfig(gw->disp, gw->visualinfo, GLX_STENCIL_SIZE, &val); + gw->detected.stencil_buffer_size = val; + glXGetConfig(gw->disp, gw->visualinfo, GLX_SAMPLES, &val); + gw->detected.msaa = val; #endif gw->gl_context = glsym_evas_gl_common_context_new(); @@ -725,10 +750,46 @@ eng_best_visual_get(Evas_Engine_Info_GL_X11 *einfo) config_attrs[n++] = EGL_ALPHA_SIZE; config_attrs[n++] = 0; } - config_attrs[n++] = EGL_DEPTH_SIZE; - config_attrs[n++] = 0; - config_attrs[n++] = EGL_STENCIL_SIZE; - config_attrs[n++] = 0; + + // Tizen Only :: Direct Rendering Option for widget (e.g. WEBKIT) + /* + * Sometimes, Tizen Widget uses Evas GL with Direct Rendering. + * This widget also runs with depth/stencil. + * Unfortunately, Application can not know this widget uses Evas GL that runs with DR, Depth/Stencil buffer. + * Although application does not set depth/stencil buffer size, + * evas gl render engine should set depth/stencil buffer size with minimum. + * This is HACK code for tizen platform. + */ + + if (einfo->depth_bits) + { + config_attrs[n++] = EGL_DEPTH_SIZE; + config_attrs[n++] = einfo->depth_bits; + } + else + { + config_attrs[n++] = EGL_DEPTH_SIZE; + config_attrs[n++] = 1; + } + + if (einfo->stencil_bits) + { + config_attrs[n++] = EGL_STENCIL_SIZE; + config_attrs[n++] = einfo->stencil_bits; + } + else + { + config_attrs[n++] = EGL_STENCIL_SIZE; + config_attrs[n++] = 1; + } + + if (einfo->msaa_bits) + { + config_attrs[n++] = EGL_SAMPLE_BUFFERS; + config_attrs[n++] = 1; + config_attrs[n++] = EGL_SAMPLES; + config_attrs[n++] = einfo->msaa_bits; + } config_attrs[n++] = EGL_NONE; num = 0; if ((!eglChooseConfig(egl_disp, config_attrs, configs, 200, &num)) diff --git a/src/modules/evas/engines/wayland_egl/evas_engine.c b/src/modules/evas/engines/wayland_egl/evas_engine.c index 77e474c..aef9a11 100644 --- a/src/modules/evas/engines/wayland_egl/evas_engine.c +++ b/src/modules/evas/engines/wayland_egl/evas_engine.c @@ -674,6 +674,7 @@ static const EVGL_Interface evgl_funcs = evgl_eng_pbuffer_surface_destroy, NULL, //gles1_surface_create NULL, // gles1_surface_destroy + NULL, //native_win_surface_config_check }; /* engine functions */ -- 2.7.4