#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
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];
+ }
}
}
// 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
}
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)
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);
}
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;
}
{
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;
}
// 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);
}
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
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);
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);
// 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
NULL, // PBuffer
NULL, // OpenGL-ES 1
NULL, // OpenGL-ES 1
+ NULL, //native_win_surface_config_check
};
/* local functions */
NULL, // PBuffer
NULL, // OpenGL-ES 1
NULL, // OpenGL-ES 1
+ NULL, //native_win_surface_config_check
};
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
// 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;
#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,
evgl_eng_gles1_surface_create,
evgl_eng_gles1_surface_destroy,
evgl_eng_gles1_context_create,
+ evgl_eng_native_win_surface_config_check,
};
//----------------------------------------------------------//
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);
(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;
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);
#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;
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);
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;
#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;
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;
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();
{
// 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();
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))
evgl_eng_pbuffer_surface_destroy,
NULL, //gles1_surface_create
NULL, // gles1_surface_destroy
+ NULL, //native_win_surface_config_check
};
/* engine functions */