YaGL: Allow using EGL_DONT_CARE in eglChooseConfig 03/17203/1
authorStanislav Vorobiov <s.vorobiov@samsung.com>
Wed, 5 Mar 2014 08:55:45 +0000 (12:55 +0400)
committerStanislav Vorobiov <s.vorobiov@samsung.com>
Wed, 5 Mar 2014 09:11:12 +0000 (13:11 +0400)
EGL_DONT_CARE must be allowed to be used in config
attributes

Change-Id: If20440b863a5525d8f0d63c4d778db65f7959ff6

hw/yagl/yagl_apis/egl/yagl_host_egl_calls.c

index 883231a..e52ab90 100644 (file)
@@ -451,42 +451,48 @@ EGLBoolean yagl_host_eglChooseConfig(yagl_host_handle dpy_,
                 dummy.frame_buffer_level = attrib_list[i + 1];
                 break;
             case EGL_BUFFER_SIZE:
-                if (attrib_list[i + 1] < 0) {
+                if ((attrib_list[i + 1] != EGL_DONT_CARE) &&
+                    (attrib_list[i + 1] < 0)) {
                     YAGL_SET_ERR(EGL_BAD_ATTRIBUTE);
                     goto out;
                 }
                 dummy.buffer_size = attrib_list[i + 1];
                 break;
             case EGL_RED_SIZE:
-                if (attrib_list[i + 1] < 0) {
+                if ((attrib_list[i + 1] != EGL_DONT_CARE) &&
+                    (attrib_list[i + 1] < 0)) {
                     YAGL_SET_ERR(EGL_BAD_ATTRIBUTE);
                     goto out;
                 }
                 dummy.red_size = attrib_list[i + 1];
                 break;
             case EGL_GREEN_SIZE:
-                if (attrib_list[i + 1] < 0) {
+                if ((attrib_list[i + 1] != EGL_DONT_CARE) &&
+                    (attrib_list[i + 1] < 0)) {
                     YAGL_SET_ERR(EGL_BAD_ATTRIBUTE);
                     goto out;
                 }
                 dummy.green_size = attrib_list[i + 1];
                 break;
             case EGL_BLUE_SIZE:
-                if (attrib_list[i + 1] < 0) {
+                if ((attrib_list[i + 1] != EGL_DONT_CARE) &&
+                    (attrib_list[i + 1] < 0)) {
                     YAGL_SET_ERR(EGL_BAD_ATTRIBUTE);
                     goto out;
                 }
                 dummy.blue_size = attrib_list[i + 1];
                 break;
             case EGL_ALPHA_SIZE:
-                if (attrib_list[i + 1] < 0) {
+                if ((attrib_list[i + 1] != EGL_DONT_CARE) &&
+                    (attrib_list[i + 1] < 0)) {
                     YAGL_SET_ERR(EGL_BAD_ATTRIBUTE);
                     goto out;
                 }
                 dummy.alpha_size = attrib_list[i + 1];
                 break;
             case EGL_CONFIG_CAVEAT:
-                if ((attrib_list[i + 1] != EGL_NONE) &&
+                if ((attrib_list[i + 1] != EGL_DONT_CARE) &&
+                    (attrib_list[i + 1] != EGL_NONE) &&
                     (attrib_list[i + 1] != EGL_SLOW_CONFIG) &&
                     (attrib_list[i + 1] != EGL_NON_CONFORMANT_CONFIG)) {
                     YAGL_SET_ERR(EGL_BAD_ATTRIBUTE);
@@ -495,42 +501,52 @@ EGLBoolean yagl_host_eglChooseConfig(yagl_host_handle dpy_,
                 dummy.caveat = attrib_list[i + 1];
                 break;
             case EGL_CONFIG_ID:
-                if (attrib_list[i + 1] < 0) {
+                if ((attrib_list[i + 1] != EGL_DONT_CARE) &&
+                    (attrib_list[i + 1] < 0)) {
                     YAGL_SET_ERR(EGL_BAD_ATTRIBUTE);
                     goto out;
                 }
-                config_id = attrib_list[i + 1];
-                has_config_id = true;
+                if (attrib_list[i + 1] != EGL_DONT_CARE) {
+                    config_id = attrib_list[i + 1];
+                    has_config_id = true;
+                }
                 break;
             case EGL_DEPTH_SIZE:
-                if (attrib_list[i + 1] < 0) {
+                if ((attrib_list[i + 1] != EGL_DONT_CARE) &&
+                    (attrib_list[i + 1] < 0)) {
                     YAGL_SET_ERR(EGL_BAD_ATTRIBUTE);
                     goto out;
                 }
                 dummy.depth_size = attrib_list[i + 1];
                 break;
             case EGL_MAX_SWAP_INTERVAL:
-                if (attrib_list[i + 1] < 0) {
+                if ((attrib_list[i + 1] != EGL_DONT_CARE) &&
+                    (attrib_list[i + 1] < 0)) {
                     YAGL_SET_ERR(EGL_BAD_ATTRIBUTE);
                     goto out;
                 }
                 dummy.max_swap_interval = attrib_list[i + 1];
                 break;
             case EGL_MIN_SWAP_INTERVAL:
-                if (attrib_list[i + 1] < 0) {
+                if ((attrib_list[i + 1] != EGL_DONT_CARE) &&
+                    (attrib_list[i + 1] < 0)) {
                     YAGL_SET_ERR(EGL_BAD_ATTRIBUTE);
                     goto out;
                 }
                 dummy.min_swap_interval = attrib_list[i + 1];
                 break;
             case EGL_CONFORMANT:
-                if ((attrib_list[i + 1] &
-                    ~(EGL_OPENGL_ES_BIT|
-                      EGL_OPENVG_BIT|
-                      EGL_OPENGL_ES2_BIT|
-                      EGL_OPENGL_BIT)) != 0) {
-                    YAGL_SET_ERR(EGL_BAD_ATTRIBUTE);
-                    goto out;
+                if ((attrib_list[i + 1] != EGL_DONT_CARE) &&
+                    ((attrib_list[i + 1] &
+                     ~(EGL_OPENGL_ES_BIT|
+                       EGL_OPENVG_BIT|
+                       EGL_OPENGL_ES2_BIT|
+                       EGL_OPENGL_BIT)) != 0)) {
+                    if (((attrib_list[i + 1] & EGL_OPENGL_ES3_BIT_KHR) == 0) ||
+                        (dpy->backend->gl_version < yagl_gl_3_1_es3)) {
+                        YAGL_SET_ERR(EGL_BAD_ATTRIBUTE);
+                        goto out;
+                    }
                 }
                 dummy.conformant = attrib_list[i + 1];
                 break;
@@ -542,34 +558,39 @@ EGLBoolean yagl_host_eglChooseConfig(yagl_host_handle dpy_,
                 break;
             case EGL_NATIVE_VISUAL_TYPE:
                 dummy.native_visual_type = attrib_list[i + 1];
-                if ((attrib_list[i + 1] < 0) || (attrib_list[i + 1] > 1)) {
+                if ((attrib_list[i + 1] != EGL_DONT_CARE) &&
+                    ((attrib_list[i + 1] < 0) || (attrib_list[i + 1] > 1))) {
                     YAGL_SET_ERR(EGL_BAD_ATTRIBUTE);
                     goto out;
                 }
                 break;
             case EGL_SAMPLE_BUFFERS:
-                if (attrib_list[i + 1] < 0) {
+                if ((attrib_list[i + 1] != EGL_DONT_CARE) &&
+                    (attrib_list[i + 1] < 0)) {
                     YAGL_SET_ERR(EGL_BAD_ATTRIBUTE);
                     goto out;
                 }
                 dummy.sample_buffers_num = attrib_list[i + 1];
                 break;
             case EGL_SAMPLES:
-                if (attrib_list[i + 1] < 0) {
+                if ((attrib_list[i + 1] != EGL_DONT_CARE) &&
+                    (attrib_list[i + 1] < 0)) {
                     YAGL_SET_ERR(EGL_BAD_ATTRIBUTE);
                     goto out;
                 }
                 dummy.samples_per_pixel = attrib_list[i + 1];
                 break;
             case EGL_STENCIL_SIZE:
-                if (attrib_list[i + 1] < 0) {
+                if ((attrib_list[i + 1] != EGL_DONT_CARE) &&
+                    (attrib_list[i + 1] < 0)) {
                     YAGL_SET_ERR(EGL_BAD_ATTRIBUTE);
                     goto out;
                 }
                 dummy.stencil_size = attrib_list[i + 1];
                 break;
             case EGL_TRANSPARENT_TYPE:
-                if ((attrib_list[i + 1] != EGL_NONE) &&
+                if ((attrib_list[i + 1] != EGL_DONT_CARE) &&
+                    (attrib_list[i + 1] != EGL_NONE) &&
                     (attrib_list[i + 1] != EGL_TRANSPARENT_RGB)) {
                     YAGL_SET_ERR(EGL_BAD_ATTRIBUTE);
                     goto out;