YaGL: Get number of extensions before calling glGetStringi 35/13135/1
authorStanislav Vorobiov <s.vorobiov@samsung.com>
Thu, 31 Oct 2013 14:10:25 +0000 (18:10 +0400)
committerStanislav Vorobiov <s.vorobiov@samsung.com>
Thu, 31 Oct 2013 14:10:25 +0000 (18:10 +0400)
It's better to call glGetIntegerv(GL_NUM_EXTENSIONS) and use
the result in glGetStringi than calling glGetStringi
until error is returned

Change-Id: Ic61c0c4d42469be9ae217e5d234033ba0023c3b5

hw/yagl_apis/gles/yagl_host_gles_calls.c
hw/yagl_drivers/egl_glx/yagl_egl_glx.c

index 9c5a9f9634c8f74146e9691c98b7d6a429a5bdf6..dac491659c011853a972e8450d5ddce4cd7002f7 100644 (file)
@@ -1560,14 +1560,15 @@ void yagl_host_glGetString(GLenum name,
     if ((name == GL_EXTENSIONS) &&
         (gles_api_ts->driver->gl_version > yagl_gl_2)) {
         struct yagl_vector v;
-        uint32_t i;
+        GLint i, num_extensions = 0;
         char nb = '\0';
 
         yagl_vector_init(&v, 1, 0);
 
-        for (i = 0, tmp = (const char*)gles_api_ts->driver->GetStringi(name, i);
-             tmp;
-             ++i, tmp = (const char*)gles_api_ts->driver->GetStringi(name, i)) {
+        gles_api_ts->driver->GetIntegerv(GL_NUM_EXTENSIONS, &num_extensions);
+
+        for (i = 0; i < num_extensions; ++i) {
+            tmp = (const char*)gles_api_ts->driver->GetStringi(name, i);
             int size = yagl_vector_size(&v);
             int ext_len = strlen(tmp);
 
index 3f2e12a842668ab96ef432929694a9cb9bed70d5..4d899b8c236b757149323bb4b2d7db2c2305578b 100644 (file)
@@ -134,7 +134,7 @@ static bool yagl_egl_glx_get_gl_version(struct yagl_egl_glx *egl_glx,
     GLXPbuffer pbuffer = 0;
     const GLubyte *(GLAPIENTRY *GetStringi)(GLenum, GLuint) = NULL;
     void (GLAPIENTRY *GetIntegerv)(GLenum, GLint*) = NULL;
-    uint32_t i;
+    GLint i, num_extensions = 0;
     GLint major = 0, minor = 0;
 
     YAGL_EGL_GLX_ENTER(yagl_egl_glx_get_gl_version, NULL);
@@ -208,9 +208,19 @@ static bool yagl_egl_glx_get_gl_version(struct yagl_egl_glx *egl_glx,
         goto out;
     }
 
-    for (i = 0, tmp = (const char*)GetStringi(GL_EXTENSIONS, i);
-         tmp;
-         ++i, tmp = (const char*)GetStringi(GL_EXTENSIONS, i)) {
+    GetIntegerv = yagl_dyn_lib_get_ogl_procaddr(egl_glx->base.dyn_lib,
+                                                "glGetIntegerv");
+
+    if (!GetIntegerv) {
+        YAGL_LOG_ERROR("Unable to get symbol: %s",
+                       yagl_dyn_lib_get_error(egl_glx->base.dyn_lib));
+        goto out;
+    }
+
+    GetIntegerv(GL_NUM_EXTENSIONS, &num_extensions);
+
+    for (i = 0; i < num_extensions; ++i) {
+        tmp = (const char*)GetStringi(GL_EXTENSIONS, i);
         if (strcmp(tmp, "GL_ARB_ES3_compatibility") == 0) {
             YAGL_LOG_INFO("GL_ARB_ES3_compatibility supported, using OpenGL 3.1");
             *version = yagl_gl_3_es3;
@@ -224,15 +234,6 @@ static bool yagl_egl_glx_get_gl_version(struct yagl_egl_glx *egl_glx,
      * able to patch shaders and run them with GLSL 1.50.
      */
 
-    GetIntegerv = yagl_dyn_lib_get_ogl_procaddr(egl_glx->base.dyn_lib,
-                                                "glGetIntegerv");
-
-    if (!GetIntegerv) {
-        YAGL_LOG_ERROR("Unable to get symbol: %s",
-                       yagl_dyn_lib_get_error(egl_glx->base.dyn_lib));
-        goto out;
-    }
-
     GetIntegerv(GL_MAJOR_VERSION, &major);
     GetIntegerv(GL_MINOR_VERSION, &minor);