EGLAPI EGLBoolean EGLAPIENTRY eglGetConfigAttrib(EGLDisplay dpy, EGLConfig config, EGLint attribute, EGLint *value) { CLIENT_THREAD_STATE_T *thread; CLIENT_PROCESS_STATE_T *process; EGLBoolean result; if (CLIENT_LOCK_AND_GET_STATES(dpy, &thread, &process)) { if (!value) { thread->error = EGL_BAD_PARAMETER; result = EGL_FALSE; } else if (egl_config_to_id(config) < 0 || egl_config_to_id(config) >= EGL_MAX_CONFIGS) { thread->error = EGL_BAD_CONFIG; result = EGL_FALSE; } else if (!egl_config_get_attrib(egl_config_to_id(config), attribute, value)) { thread->error = EGL_BAD_ATTRIBUTE; result = EGL_FALSE; } else { thread->error = EGL_SUCCESS; result = EGL_TRUE; } CLIENT_UNLOCK(); } else result = EGL_FALSE; return result; }
bool egl_config_filter(int id, const EGLint *attrib_list) { if (!attrib_list) return true; while (*attrib_list != EGL_NONE) { EGLint name = *attrib_list++; EGLint value = *attrib_list++; EGLint actual_value; if (!egl_config_get_attrib(id, name, &actual_value) ) { UNREACHABLE(); return false; } switch (name) { /* Selection Criteria: AtLeast */ case EGL_BUFFER_SIZE: case EGL_RED_SIZE: case EGL_GREEN_SIZE: case EGL_BLUE_SIZE: case EGL_LUMINANCE_SIZE: case EGL_ALPHA_SIZE: case EGL_ALPHA_MASK_SIZE: case EGL_DEPTH_SIZE: case EGL_SAMPLE_BUFFERS: case EGL_SAMPLES: case EGL_STENCIL_SIZE: if (value != EGL_DONT_CARE && value > actual_value) return false; break; /* Selection Criteria: Exact */ /* Excluding EGL_TRANSPARENT_x_VALUE and EGL_MATCH_FORMAT_KHR which are listed in the table as Exact, but seem to have special rules attached to them. Excluding EGL_NATIVE_VISUAL_TYPE which is in the ignore list Excluding EGL_LEVEL because EGL_DONT_CARE is not allowed */ case EGL_BIND_TO_TEXTURE_RGB: case EGL_BIND_TO_TEXTURE_RGBA: case EGL_COLOR_BUFFER_TYPE: case EGL_CONFIG_CAVEAT: case EGL_CONFIG_ID: case EGL_MAX_SWAP_INTERVAL: case EGL_MIN_SWAP_INTERVAL: case EGL_NATIVE_RENDERABLE: case EGL_TRANSPARENT_TYPE: #if EGL_ANDROID_recordable case EGL_RECORDABLE_ANDROID: #endif if (value != EGL_DONT_CARE && value != actual_value) return false; break; case EGL_LEVEL: if (value != actual_value) return false; break; /* Selection Criteria: Mask */ case EGL_CONFORMANT: case EGL_RENDERABLE_TYPE: case EGL_SURFACE_TYPE: if (value != EGL_DONT_CARE && (value & ~actual_value)) return false; break; /* Selection Criteria: Special */ case EGL_MATCH_NATIVE_PIXMAP: if (value != EGL_DONT_CARE) { /* see comments in egl_config_check_attribs */ EGLNativePixmapType pixmap = (EGLNativePixmapType)(intptr_t)value; KHRN_IMAGE_WRAP_T image; if (!platform_get_pixmap_info(pixmap, &image)) { /* Not actually unreachable in theory! We should have detected this in egl_config_check_attribs It's possible that the validity of pixmap has changed since then however... */ UNREACHABLE(); return false; } if (!egl_config_match_pixmap_info(id, &image) || !platform_match_pixmap_api_support(pixmap, egl_config_get_api_support(id))) { khrn_platform_release_pixmap_info(pixmap, &image); return false; } khrn_platform_release_pixmap_info(pixmap, &image); } break; #if EGL_KHR_lock_surface case EGL_MATCH_FORMAT_KHR: if (!(value == EGL_DONT_CARE || value == actual_value || (value == EGL_FORMAT_RGB_565_KHR && actual_value == EGL_FORMAT_RGB_565_EXACT_KHR) || (value == EGL_FORMAT_RGBA_8888_KHR && actual_value == EGL_FORMAT_RGBA_8888_EXACT_KHR))) { return false; } break; #endif /* Attributes we can completely ignore */ case EGL_MAX_PBUFFER_WIDTH: case EGL_MAX_PBUFFER_HEIGHT: case EGL_MAX_PBUFFER_PIXELS: case EGL_NATIVE_VISUAL_ID: /* "If EGL_MAX_PBUFFER_WIDTH, EGL_MAX_PBUFFER_HEIGHT, EGL_MAX_PBUFFER_PIXELS, or EGL_NATIVE_VISUAL_ID are specified in attrib_list, then they are ignored" */ case EGL_NATIVE_VISUAL_TYPE: /* "if there are no native visual types, then the EGL NATIVE VISUAL TYPE attribute is ignored." */ case EGL_TRANSPARENT_BLUE_VALUE: case EGL_TRANSPARENT_GREEN_VALUE: case EGL_TRANSPARENT_RED_VALUE: /* "If EGL_TRANSPARENT_TYPE is set to EGL_NONE in attrib_list, then the EGL_TRANSPARENT_RED_VALUE, EGL_TRANSPARENT_GREEN_VALUE, and EGL_TRANSPARENT_BLUE_VALUE attributes are ignored." Possible spec deviation if EGL_TRANSPARENT_TYPE is specified as EGL_DONT_CARE and EGL_TRANSPARENT_*_VALUE is also specified? */ break; default: UNREACHABLE(); break; } } return true; }