summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJean-Philippe Andre <jp.andre@samsung.com>2014-10-20 13:37:28 +0900
committerJean-Philippe Andre <jp.andre@samsung.com>2014-10-20 13:37:28 +0900
commit1adff0ae3cd43bf7ffedf5c923ffad0726e2d994 (patch)
tree2731dc598303ee7de54c69992a0916a2aaa3eb55
parent823c7b87be84b623a3c81dbcf0537bd192d43713 (diff)
parent84ec02920233e52c185ae65aeb04c6381d22cbcd (diff)
GLView: Add new APIs to match Evas GL
This adds the following new features, based on Evas GL: - rotation_get - evas_gl_get - client-side rotation - precise stencil and depth buffer selection The changes follow recent changes in EFL. Merge branch 'devs/jpeg/evasgl'
-rw-r--r--src/lib/elm_glview.c140
-rw-r--r--src/lib/elm_glview.eo50
-rw-r--r--src/lib/elm_glview_common.h38
-rw-r--r--src/lib/elm_glview_legacy.h13
-rw-r--r--src/lib/elm_widget_glview.h1
5 files changed, 208 insertions, 34 deletions
diff --git a/src/lib/elm_glview.c b/src/lib/elm_glview.c
index 26c11a83c..ffb2c8ca3 100644
--- a/src/lib/elm_glview.c
+++ b/src/lib/elm_glview.c
@@ -47,31 +47,23 @@ _elm_glview_elm_widget_on_focus(Eo *obj, Elm_Glview_Data *_pd EINA_UNUSED)
47static void 47static void
48_glview_update_surface(Evas_Object *obj) 48_glview_update_surface(Evas_Object *obj)
49{ 49{
50 Evas_Native_Surface ns = { 0 };
50 ELM_GLVIEW_DATA_GET(obj, sd); 51 ELM_GLVIEW_DATA_GET(obj, sd);
51 ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd); 52 ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd);
52 if (!sd) return; 53 if (!sd) return;
53 54
54 if (sd->surface) 55 if (sd->surface)
55 { 56 {
56 evas_object_image_native_surface_set 57 evas_object_image_native_surface_set(wd->resize_obj, NULL);
57 (wd->resize_obj, NULL);
58 evas_gl_surface_destroy(sd->evasgl, sd->surface); 58 evas_gl_surface_destroy(sd->evasgl, sd->surface);
59 sd->surface = NULL;
60 } 59 }
61 60
62 evas_object_image_size_set(wd->resize_obj, sd->w, sd->h); 61 evas_object_image_size_set(wd->resize_obj, sd->w, sd->h);
63 62
64 if (!sd->surface) 63 sd->surface = evas_gl_surface_create(sd->evasgl, sd->config, sd->w, sd->h);
65 { 64 evas_gl_native_surface_get(sd->evasgl, sd->surface, &ns);
66 Evas_Native_Surface ns; 65 evas_object_image_native_surface_set(wd->resize_obj, &ns);
67 66 elm_glview_changed_set(obj);
68 sd->surface = evas_gl_surface_create
69 (sd->evasgl, sd->config, sd->w, sd->h);
70 evas_gl_native_surface_get(sd->evasgl, sd->surface, &ns);
71 evas_object_image_native_surface_set
72 (wd->resize_obj, &ns);
73 elm_glview_changed_set(obj);
74 }
75} 67}
76 68
77EOLIAN static void 69EOLIAN static void
@@ -181,7 +173,7 @@ _set_render_policy_callback(Evas_Object *obj)
181} 173}
182 174
183EOLIAN static void 175EOLIAN static void
184_elm_glview_evas_object_smart_add(Eo *obj, Elm_Glview_Data *priv) 176_elm_glview_evas_object_smart_add(Eo *obj, Elm_Glview_Data *priv EINA_UNUSED)
185{ 177{
186 Evas_Object *img; 178 Evas_Object *img;
187 179
@@ -193,7 +185,11 @@ _elm_glview_evas_object_smart_add(Eo *obj, Elm_Glview_Data *priv)
193 evas_object_image_size_set(img, 1, 1); 185 evas_object_image_size_set(img, 1, 1);
194 186
195 eo_do_super(obj, MY_CLASS, evas_obj_smart_add()); 187 eo_do_super(obj, MY_CLASS, evas_obj_smart_add());
188}
196 189
190static void
191_elm_glview_constructor(Eo *obj, Elm_Glview_Data *priv)
192{
197 // Evas_GL 193 // Evas_GL
198 priv->evasgl = evas_gl_new(evas_object_evas_get(obj)); 194 priv->evasgl = evas_gl_new(evas_object_evas_get(obj));
199 if (!priv->evasgl) 195 if (!priv->evasgl)
@@ -223,15 +219,22 @@ _elm_glview_evas_object_smart_add(Eo *obj, Elm_Glview_Data *priv)
223 priv->w = 64; 219 priv->w = 64;
224 priv->h = 64; 220 priv->h = 64;
225 221
222 // Set context version
223 if (!priv->gles_version)
224 priv->gles_version = EVAS_GL_GLES_2_X;
225 priv->config->gles_version = priv->gles_version;
226
226 // Create Context 227 // Create Context
227 priv->context = evas_gl_context_create(priv->evasgl, NULL); 228 if (priv->gles_version == EVAS_GL_GLES_2_X)
229 priv->context = evas_gl_context_create(priv->evasgl, NULL);
230 else
231 priv->context = evas_gl_context_version_create(priv->evasgl, NULL, priv->gles_version);
228 if (!priv->context) 232 if (!priv->context)
229 { 233 {
230 ERR("Error Creating an Evas_GL Context.\n"); 234 ERR("Error Creating an Evas_GL Context.\n");
231 235
232 evas_gl_config_free(priv->config); 236 ELM_SAFE_FREE(priv->config, evas_gl_config_free);
233 evas_gl_free(priv->evasgl); 237 ELM_SAFE_FREE(priv->evasgl, evas_gl_free);
234 priv->evasgl = NULL;
235 return; 238 return;
236 } 239 }
237} 240}
@@ -239,6 +242,8 @@ _elm_glview_evas_object_smart_add(Eo *obj, Elm_Glview_Data *priv)
239EOLIAN static void 242EOLIAN static void
240_elm_glview_evas_object_smart_del(Eo *obj, Elm_Glview_Data *sd) 243_elm_glview_evas_object_smart_del(Eo *obj, Elm_Glview_Data *sd)
241{ 244{
245 ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd);
246
242 // Call delete func if it's registered 247 // Call delete func if it's registered
243 if (sd->del_func) 248 if (sd->del_func)
244 { 249 {
@@ -248,7 +253,11 @@ _elm_glview_evas_object_smart_del(Eo *obj, Elm_Glview_Data *sd)
248 253
249 ecore_idle_enterer_del(sd->render_idle_enterer); 254 ecore_idle_enterer_del(sd->render_idle_enterer);
250 255
251 if (sd->surface) evas_gl_surface_destroy(sd->evasgl, sd->surface); 256 if (sd->surface)
257 {
258 evas_object_image_native_surface_set(wd->resize_obj, NULL);
259 evas_gl_surface_destroy(sd->evasgl, sd->surface);
260 }
252 if (sd->context) evas_gl_context_destroy(sd->evasgl, sd->context); 261 if (sd->context) evas_gl_context_destroy(sd->evasgl, sd->context);
253 if (sd->config) evas_gl_config_free(sd->config); 262 if (sd->config) evas_gl_config_free(sd->config);
254 if (sd->evasgl) evas_gl_free(sd->evasgl); 263 if (sd->evasgl) evas_gl_free(sd->evasgl);
@@ -260,14 +269,34 @@ EAPI Evas_Object *
260elm_glview_add(Evas_Object *parent) 269elm_glview_add(Evas_Object *parent)
261{ 270{
262 EINA_SAFETY_ON_NULL_RETURN_VAL(parent, NULL); 271 EINA_SAFETY_ON_NULL_RETURN_VAL(parent, NULL);
263 Evas_Object *obj = eo_add(MY_CLASS, parent); 272 Evas_Object *obj = eo_add(MY_CLASS, parent,
273 elm_obj_glview_version_constructor(EVAS_GL_GLES_2_X));
274 return obj;
275}
276
277EAPI Evas_Object *
278elm_glview_version_add(Evas_Object *parent, Evas_GL_Context_Version version)
279{
280 EINA_SAFETY_ON_NULL_RETURN_VAL(parent, NULL);
281 Evas_Object *obj = eo_add(MY_CLASS, parent,
282 elm_obj_glview_version_constructor(version));
264 return obj; 283 return obj;
265} 284}
266 285
267EOLIAN static void 286EOLIAN static void
268_elm_glview_eo_base_constructor(Eo *obj, Elm_Glview_Data *sd) 287_elm_glview_eo_base_constructor(Eo *obj, Elm_Glview_Data *sd EINA_UNUSED)
269{ 288{
270 eo_do_super(obj, MY_CLASS, eo_constructor()); 289 eo_do_super(obj, MY_CLASS, eo_constructor());
290}
291
292EOLIAN static void
293_elm_glview_version_constructor(Eo *obj, Elm_Glview_Data *sd,
294 Evas_GL_Context_Version version)
295{
296 sd->gles_version =
297 ((version > 0) && (version <= 3)) ? version : EVAS_GL_GLES_2_X;
298 _elm_glview_constructor(obj, sd);
299
271 eo_do(obj, 300 eo_do(obj,
272 evas_obj_type_set(MY_CLASS_NAME_LEGACY), 301 evas_obj_type_set(MY_CLASS_NAME_LEGACY),
273 evas_obj_smart_callbacks_descriptions_set(_smart_callbacks), 302 evas_obj_smart_callbacks_descriptions_set(_smart_callbacks),
@@ -283,7 +312,7 @@ _elm_glview_eo_base_constructor(Eo *obj, Elm_Glview_Data *sd)
283EOLIAN static Evas_GL_API* 312EOLIAN static Evas_GL_API*
284_elm_glview_gl_api_get(Eo *obj EINA_UNUSED, Elm_Glview_Data *sd) 313_elm_glview_gl_api_get(Eo *obj EINA_UNUSED, Elm_Glview_Data *sd)
285{ 314{
286 return evas_gl_api_get(sd->evasgl); 315 return evas_gl_context_api_get(sd->evasgl, sd->context);
287} 316}
288 317
289EOLIAN static Eina_Bool 318EOLIAN static Eina_Bool
@@ -295,16 +324,59 @@ _elm_glview_mode_set(Eo *obj, Elm_Glview_Data *sd, Elm_GLView_Mode mode)
295 if (mode & ELM_GLVIEW_ALPHA) sd->config->color_format = EVAS_GL_RGBA_8888; 324 if (mode & ELM_GLVIEW_ALPHA) sd->config->color_format = EVAS_GL_RGBA_8888;
296 else sd->config->color_format = EVAS_GL_RGB_888; 325 else sd->config->color_format = EVAS_GL_RGB_888;
297 326
298 if (mode & ELM_GLVIEW_DEPTH) sd->config->depth_bits = EVAS_GL_DEPTH_BIT_24; 327 if (mode & ELM_GLVIEW_DEPTH)
299 else sd->config->depth_bits = EVAS_GL_DEPTH_NONE; 328 {
329 const int mask = 7 << 6;
330 if ((mode & mask) == (ELM_GLVIEW_DEPTH_8 & mask))
331 sd->config->depth_bits = EVAS_GL_DEPTH_BIT_8;
332 else if ((mode & mask) == (ELM_GLVIEW_DEPTH_16 & mask))
333 sd->config->depth_bits = EVAS_GL_DEPTH_BIT_16;
334 else if ((mode & mask) == (ELM_GLVIEW_DEPTH_24 & mask))
335 sd->config->depth_bits = EVAS_GL_DEPTH_BIT_24;
336 else if ((mode & mask) == (ELM_GLVIEW_DEPTH_32 & mask))
337 sd->config->depth_bits = EVAS_GL_DEPTH_BIT_32;
338 else
339 sd->config->depth_bits = EVAS_GL_DEPTH_BIT_24;
340 }
341 else
342 sd->config->depth_bits = EVAS_GL_DEPTH_NONE;
300 343
301 if (mode & ELM_GLVIEW_STENCIL) 344 if (mode & ELM_GLVIEW_STENCIL)
302 sd->config->stencil_bits = EVAS_GL_STENCIL_BIT_8; 345 {
303 else sd->config->stencil_bits = EVAS_GL_STENCIL_NONE; 346 const int mask = 7 << 9;
347 if ((mode & mask) == (ELM_GLVIEW_STENCIL_1 & mask))
348 sd->config->stencil_bits = EVAS_GL_STENCIL_BIT_1;
349 else if ((mode & mask) == (ELM_GLVIEW_STENCIL_1 & mask))
350 sd->config->stencil_bits = EVAS_GL_STENCIL_BIT_2;
351 else if ((mode & mask) == (ELM_GLVIEW_STENCIL_4 & mask))
352 sd->config->stencil_bits = EVAS_GL_STENCIL_BIT_4;
353 else if ((mode & mask) == (ELM_GLVIEW_STENCIL_8 & mask))
354 sd->config->stencil_bits = EVAS_GL_STENCIL_BIT_8;
355 else if ((mode & mask) == (ELM_GLVIEW_STENCIL_16 & mask))
356 sd->config->stencil_bits = EVAS_GL_STENCIL_BIT_16;
357 else
358 sd->config->stencil_bits = EVAS_GL_STENCIL_BIT_8;
359 }
360 else
361 sd->config->stencil_bits = EVAS_GL_STENCIL_NONE;
362
363 if (mode & ELM_GLVIEW_MULTISAMPLE_HIGH)
364 {
365 if ((mode & ELM_GLVIEW_MULTISAMPLE_HIGH) == ELM_GLVIEW_MULTISAMPLE_LOW)
366 sd->config->multisample_bits = EVAS_GL_MULTISAMPLE_LOW;
367 else if ((mode & ELM_GLVIEW_MULTISAMPLE_HIGH) == ELM_GLVIEW_MULTISAMPLE_MED)
368 sd->config->multisample_bits = EVAS_GL_MULTISAMPLE_MED;
369 else
370 sd->config->multisample_bits = EVAS_GL_MULTISAMPLE_HIGH;
371 }
372 else
373 sd->config->multisample_bits = EVAS_GL_MULTISAMPLE_NONE;
304 374
375 sd->config->options_bits = EVAS_GL_OPTIONS_NONE;
305 if (mode & ELM_GLVIEW_DIRECT) 376 if (mode & ELM_GLVIEW_DIRECT)
306 sd->config->options_bits = EVAS_GL_OPTIONS_DIRECT; 377 sd->config->options_bits = EVAS_GL_OPTIONS_DIRECT;
307 else sd->config->options_bits = EVAS_GL_OPTIONS_NONE; 378 if (mode & ELM_GLVIEW_CLIENT_SIDE_ROTATION)
379 sd->config->options_bits |= EVAS_GL_OPTIONS_CLIENT_SIDE_ROTATION;
308 380
309 // Check for Alpha Channel and enable it 381 // Check for Alpha Channel and enable it
310 if (mode & ELM_GLVIEW_ALPHA) 382 if (mode & ELM_GLVIEW_ALPHA)
@@ -417,6 +489,18 @@ _elm_glview_changed_set(Eo *obj, Elm_Glview_Data *sd)
417 ecore_idle_enterer_before_add((Ecore_Task_Cb)_render_cb, obj); 489 ecore_idle_enterer_before_add((Ecore_Task_Cb)_render_cb, obj);
418} 490}
419 491
492EOLIAN static Evas_GL *
493_elm_glview_evas_gl_get(Eo *obj EINA_UNUSED, Elm_Glview_Data *sd)
494{
495 return sd->evasgl;
496}
497
498EOLIAN static int
499_elm_glview_rotation_get(Eo *obj EINA_UNUSED, Elm_Glview_Data *sd)
500{
501 return evas_gl_rotation_get(sd->evasgl);
502}
503
420static void 504static void
421_elm_glview_class_constructor(Eo_Class *klass) 505_elm_glview_class_constructor(Eo_Class *klass)
422{ 506{
diff --git a/src/lib/elm_glview.eo b/src/lib/elm_glview.eo
index 5dd2e2fc1..1152b8ee4 100644
--- a/src/lib/elm_glview.eo
+++ b/src/lib/elm_glview.eo
@@ -1,6 +1,15 @@
1class Elm_Glview (Elm_Widget) 1class Elm_Glview (Elm_Widget)
2{ 2{
3 eo_prefix: elm_obj_glview; 3 eo_prefix: elm_obj_glview;
4 methods {
5 version_constructor {
6 /*@ Constructor with context version number. */
7 legacy: null;
8 params {
9 @in Evas_GL_Context_Version version;
10 }
11 }
12 }
4 properties { 13 properties {
5 size { 14 size {
6 set { 15 set {
@@ -162,6 +171,43 @@ class Elm_Glview (Elm_Widget)
162 return: Evas_GL_API *; 171 return: Evas_GL_API *;
163 } 172 }
164 } 173 }
174 evas_gl {
175 get {
176 /*@
177 Get the internal Evas GL attached to this view.
178
179 @note The returned Evas_GL must not be destroyed as it is still owned
180 by the view. But this pointer can be used then to call all the evas_gl_
181 functions.
182
183 @since 1.12
184
185 @return The Evas_GL used by this GLView.
186
187 @ingroup GLView */
188 return: Evas_GL *;
189 }
190 }
191 rotation {
192 get {
193 /*@
194 Get the current GL view's rotation when using direct rendering
195
196 @return A window rotation in degrees (0, 90, 180 or 270)
197
198 @note This rotation can be different from the device orientation. This
199 rotation value must be used in case of direct rendering and should be
200 taken into account by the application when setting the internal rotation
201 matrix for the view.
202
203 @see ELM_GLVIEW_CLIENT_SIDE_ROTATION
204
205 @since 1.12
206
207 @ingroup GLView */
208 return: int;
209 }
210 }
165 } 211 }
166 implements { 212 implements {
167 class.constructor; 213 class.constructor;
@@ -177,5 +223,7 @@ class Elm_Glview (Elm_Widget)
177 language,changed; 223 language,changed;
178 access,changed; 224 access,changed;
179 } 225 }
180 226 constructors {
227 .version_constructor;
228 }
181} 229}
diff --git a/src/lib/elm_glview_common.h b/src/lib/elm_glview_common.h
index 0417b9e5b..6df9f61e1 100644
--- a/src/lib/elm_glview_common.h
+++ b/src/lib/elm_glview_common.h
@@ -1,17 +1,47 @@
1typedef void (*Elm_GLView_Func_Cb)(Evas_Object *obj); 1typedef void (*Elm_GLView_Func_Cb)(Evas_Object *obj);
2 2
3/** 3/**
4 * Defines mode of GLView 4 * @brief Selects the target surface properties
5 * 5 *
6 * An OR combination of @c Elm_GLView_Mode values should be passed to
7 * @ref elm_glview_mode_set when setting up a GL widget. These flags will
8 * specify the properties of the rendering target surface; in particular,
9 * the mode can request the surface to support alpha, depth and stencil buffers.
10 *
11 * @note @c ELM_GLVIEW_CLIENT_SIDE_ROTATION is a special value that indicates
12 * to EFL that the application will handle the view rotation when the
13 * device is rotated. This is needed only when the application requests
14 * direct rendering. Please refer to @ref Evas_GL
15 * for more information about direct rendering.
16 *
17 * @see elm_glview_mode_set
18 * @see @ref elm_opengl_page
6 * @ingroup GLView 19 * @ingroup GLView
7 */ 20 */
8typedef enum _Elm_GLView_Mode 21typedef enum _Elm_GLView_Mode
9{ 22{
10 ELM_GLVIEW_NONE = 0, 23 ELM_GLVIEW_NONE = 0,
24 // 0x1 is reserved for future use
11 ELM_GLVIEW_ALPHA = (1<<1), /**< Alpha channel enabled rendering mode */ 25 ELM_GLVIEW_ALPHA = (1<<1), /**< Alpha channel enabled rendering mode */
12 ELM_GLVIEW_DEPTH = (1<<2), /**< Depth buffer enabled rendering mode */ 26 ELM_GLVIEW_DEPTH = (1<<2), /**< Depth buffer enabled rendering mode (24 bits by default) */
13 ELM_GLVIEW_STENCIL = (1<<3), /**< Stencil buffer enabled rendering mode */ 27 ELM_GLVIEW_STENCIL = (1<<3), /**< Stencil buffer enabled rendering mode (8 bits by default) */
14 ELM_GLVIEW_DIRECT = (1<<4) /**< Direct rendering optimization hint */ 28 ELM_GLVIEW_DIRECT = (1<<4), /**< Request direct rendering, unless there must be a fallback */
29 ELM_GLVIEW_CLIENT_SIDE_ROTATION = (1<<5), /**< Client will handle GL view rotation if direct rendering is enabled */
30 // Depth buffer sizes (3 bits)
31 ELM_GLVIEW_DEPTH_8 = ELM_GLVIEW_DEPTH | (1 << 6), /**< Request min. 8 bits for the depth buffer */
32 ELM_GLVIEW_DEPTH_16 = ELM_GLVIEW_DEPTH | (2 << 6), /**< Request min. 16 bits for the depth buffer */
33 ELM_GLVIEW_DEPTH_24 = ELM_GLVIEW_DEPTH | (3 << 6), /**< Request min. 24 bits for the depth buffer (default) */
34 ELM_GLVIEW_DEPTH_32 = ELM_GLVIEW_DEPTH | (4 << 6), /**< Request min. 32 bits for the depth buffer */
35 // Stencil buffer sizes (3 bits)
36 ELM_GLVIEW_STENCIL_1 = ELM_GLVIEW_STENCIL | (1 << 9), /**< Request min. 1 bits for the stencil buffer */
37 ELM_GLVIEW_STENCIL_2 = ELM_GLVIEW_STENCIL | (2 << 9), /**< Request min. 2 bits for the stencil buffer */
38 ELM_GLVIEW_STENCIL_4 = ELM_GLVIEW_STENCIL | (3 << 9), /**< Request min. 4 bits for the stencil buffer */
39 ELM_GLVIEW_STENCIL_8 = ELM_GLVIEW_STENCIL | (4 << 9), /**< Request min. 8 bits for the stencil buffer (default) */
40 ELM_GLVIEW_STENCIL_16 = ELM_GLVIEW_STENCIL | (5 << 9), /**< Request min. 16 bits for the stencil buffer */
41 // MSAA params (2 bits)
42 ELM_GLVIEW_MULTISAMPLE_LOW = (1 << 12), /**< MSAA with minimum number of samples */
43 ELM_GLVIEW_MULTISAMPLE_MED = (2 << 12), /**< MSAA with half the number of maximum samples */
44 ELM_GLVIEW_MULTISAMPLE_HIGH = (3 << 12) /**< MSAA with maximum number of samples */
15} Elm_GLView_Mode; 45} Elm_GLView_Mode;
16 46
17/** 47/**
diff --git a/src/lib/elm_glview_legacy.h b/src/lib/elm_glview_legacy.h
index b5c545e42..fdfbb6a81 100644
--- a/src/lib/elm_glview_legacy.h
+++ b/src/lib/elm_glview_legacy.h
@@ -8,4 +8,15 @@
8 */ 8 */
9EAPI Evas_Object *elm_glview_add(Evas_Object *parent); 9EAPI Evas_Object *elm_glview_add(Evas_Object *parent);
10 10
11#include "elm_glview.eo.legacy.h" \ No newline at end of file 11/**
12 * Adds a new GLView to the parent, given an OpenGL-ES context version number.
13 *
14 * @param[in] parent The parent object
15 * @param[in] version Requested GL ES version number (default is 2.x, 1.x may also be supported)
16 * @return The new object or @c NULL if it cannot be created
17 *
18 * @since 1.12
19 */
20EAPI Evas_Object *elm_glview_version_add(Evas_Object *parent, Evas_GL_Context_Version version);
21
22#include "elm_glview.eo.legacy.h"
diff --git a/src/lib/elm_widget_glview.h b/src/lib/elm_widget_glview.h
index 175bdf1c9..93ce2f815 100644
--- a/src/lib/elm_widget_glview.h
+++ b/src/lib/elm_widget_glview.h
@@ -29,6 +29,7 @@ struct _Elm_Glview_Data
29 Elm_GLView_Mode mode; 29 Elm_GLView_Mode mode;
30 Elm_GLView_Resize_Policy scale_policy; 30 Elm_GLView_Resize_Policy scale_policy;
31 Elm_GLView_Render_Policy render_policy; 31 Elm_GLView_Render_Policy render_policy;
32 Evas_GL_Context_Version gles_version;
32 33
33 Evas_GL *evasgl; 34 Evas_GL *evasgl;
34 Evas_GL_Config *config; 35 Evas_GL_Config *config;