Fixes in GLES configuration selection.
authorMike Gorchak <lestat@i.com.ua>
Thu, 22 Oct 2009 06:09:03 +0000
changeset 3412 fe9c8a5cab51
parent 3411 d15a4daa4a58
child 3413 4b1f10cfd304
Fixes in GLES configuration selection.
src/video/qnxgf/SDL_qnxgf.c
--- a/src/video/qnxgf/SDL_qnxgf.c	Thu Oct 22 06:08:36 2009 +0000
+++ b/src/video/qnxgf/SDL_qnxgf.c	Thu Oct 22 06:09:03 2009 +0000
@@ -1463,15 +1463,21 @@
     } else {
         wdata->gles_attributes[attr_pos++] = EGL_DONT_CARE;
     }
+
     wdata->gles_attributes[attr_pos++] = EGL_DEPTH_SIZE;
-    wdata->gles_attributes[attr_pos++] = _this->gl_config.depth_size;
+    if (_this->gl_config.depth_size) {
+        wdata->gles_attributes[attr_pos++] = _this->gl_config.depth_size;
+    } else {
+        wdata->gles_attributes[attr_pos++] = EGL_DONT_CARE;
+    }
+
     if (_this->gl_config.buffer_size) {
         wdata->gles_attributes[attr_pos++] = EGL_BUFFER_SIZE;
         wdata->gles_attributes[attr_pos++] = _this->gl_config.buffer_size;
     }
     if (_this->gl_config.stencil_size) {
         wdata->gles_attributes[attr_pos++] = EGL_STENCIL_SIZE;
-        wdata->gles_attributes[attr_pos++] = _this->gl_config.buffer_size;
+        wdata->gles_attributes[attr_pos++] = _this->gl_config.stencil_size;
     }
 
     /* Set number of samples in multisampling */
@@ -1586,6 +1592,8 @@
     for (cit = 0; cit < configs; cit++) {
         uint32_t stencil_found;
         uint32_t depth_found;
+        EGLint   cur_depth;
+        EGLint   cur_stencil;
 
         stencil_found = 0;
         depth_found = 0;
@@ -1594,7 +1602,7 @@
             status =
                 eglGetConfigAttrib(gfdata->egldisplay,
                                    wdata->gles_configs[cit], EGL_STENCIL_SIZE,
-                                   &attr_value);
+                                   &cur_stencil);
             if (status == EGL_TRUE) {
                 if (attr_value != 0) {
                     stencil_found = 1;
@@ -1608,7 +1616,7 @@
             status =
                 eglGetConfigAttrib(gfdata->egldisplay,
                                    wdata->gles_configs[cit], EGL_DEPTH_SIZE,
-                                   &attr_value);
+                                   &cur_depth);
             if (status == EGL_TRUE) {
                 if (attr_value != 0) {
                     depth_found = 1;
@@ -1620,15 +1628,34 @@
 
         /* Exit from loop if found appropriate configuration */
         if ((depth_found != 0) && (stencil_found != 0)) {
-            break;
+            /* Store last satisfied configuration id */
+            wdata->gles_config = cit;
+
+            if (cur_depth==_this->gl_config.depth_size)
+            {
+                /* Exact match on depth bits */
+                if (!_this->gl_config.stencil_size)
+                {
+                    /* Stencil is not required */
+                    break;
+                }
+                else
+                {
+                    if (cur_stencil==_this->gl_config.stencil_size)
+                    {
+                        /* Exact match on stencil bits */
+                        break;
+                    }
+                }
+            }
         }
     }
 
-    /* If best could not be found, use first */
-    if (cit == configs) {
+    /* If best could not be found, use first or last satisfied */
+    if ((cit == configs) && (wdata->gles_config==0)) {
         cit = 0;
+        wdata->gles_config = cit;
     }
-    wdata->gles_config = cit;
 
     /* Create OpenGL ES context */
     wdata->gles_context =