X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fegl%2Fmain%2Feglconfig.c;h=b15ba758278cf9e69b56647d00edf0b3e46a85b7;hb=1456aa61cc51f6e7727944d58a662d00158cf111;hp=cf65c69b7b4333fb2cab1e36d8eaf88c043146cb;hpb=6ee082718fca884fbda73001e0ecb32095409549;p=mesa.git diff --git a/src/egl/main/eglconfig.c b/src/egl/main/eglconfig.c index cf65c69b7b4..b15ba758278 100644 --- a/src/egl/main/eglconfig.c +++ b/src/egl/main/eglconfig.c @@ -37,6 +37,7 @@ #include #include #include "c99_compat.h" +#include "util/macros.h" #include "eglconfig.h" #include "egldisplay.h" @@ -44,7 +45,6 @@ #include "egllog.h" -#define MIN2(A, B) (((A) < (B)) ? (A) : (B)) /** @@ -56,11 +56,11 @@ * IDs are from 1 to N respectively. */ void -_eglInitConfig(_EGLConfig *conf, _EGLDisplay *dpy, EGLint id) +_eglInitConfig(_EGLConfig *conf, _EGLDisplay *disp, EGLint id) { memset(conf, 0, sizeof(*conf)); - conf->Display = dpy; + conf->Display = disp; /* some attributes take non-zero default values */ conf->ConfigID = id; @@ -68,8 +68,19 @@ _eglInitConfig(_EGLConfig *conf, _EGLDisplay *dpy, EGLint id) conf->TransparentType = EGL_NONE; conf->NativeVisualType = EGL_NONE; conf->ColorBufferType = EGL_RGB_BUFFER; + conf->ComponentType = EGL_COLOR_COMPONENT_TYPE_FIXED_EXT; } +/* + * Wipe the configs list and return the old list + */ +_EGLArray * +_eglWipeConfigs(_EGLDisplay *disp) +{ + _EGLArray *configs = disp->Configs; + disp->Configs = NULL; + return configs; +} /** * Link a config to its display and return the handle of the link. @@ -80,18 +91,19 @@ _eglInitConfig(_EGLConfig *conf, _EGLDisplay *dpy, EGLint id) EGLConfig _eglLinkConfig(_EGLConfig *conf) { - _EGLDisplay *dpy = conf->Display; + _EGLDisplay *disp = conf->Display; /* sanity check */ - assert(dpy && conf->ConfigID > 0); + assert(disp); + assert(conf->ConfigID > 0); - if (!dpy->Configs) { - dpy->Configs = _eglCreateArray("Config", 16); - if (!dpy->Configs) + if (!disp->Configs) { + disp->Configs = _eglCreateArray("Config", 16); + if (!disp->Configs) return (EGLConfig) NULL; } - _eglAppendArray(dpy->Configs, (void *) conf); + _eglAppendArray(disp->Configs, (void *) conf); return (EGLConfig) conf; } @@ -102,30 +114,31 @@ _eglLinkConfig(_EGLConfig *conf) * Return NULL if the handle has no corresponding linked config. */ _EGLConfig * -_eglLookupConfig(EGLConfig config, _EGLDisplay *dpy) +_eglLookupConfig(EGLConfig config, _EGLDisplay *disp) { _EGLConfig *conf; - if (!dpy) + if (!disp) return NULL; - conf = (_EGLConfig *) _eglFindArray(dpy->Configs, (void *) config); + conf = (_EGLConfig *) _eglFindArray(disp->Configs, (void *) config); if (conf) - assert(conf->Display == dpy); + assert(conf->Display == disp); return conf; } -enum { - /* types */ +enum type { ATTRIB_TYPE_INTEGER, ATTRIB_TYPE_BOOLEAN, ATTRIB_TYPE_BITMASK, ATTRIB_TYPE_ENUM, ATTRIB_TYPE_PSEUDO, /* non-queryable */ ATTRIB_TYPE_PLATFORM, /* platform-dependent */ - /* criteria */ +}; + +enum criterion { ATTRIB_CRITERION_EXACT, ATTRIB_CRITERION_ATLEAST, ATTRIB_CRITERION_MASK, @@ -137,8 +150,8 @@ enum { /* EGL spec Table 3.1 and 3.4 */ static const struct { EGLint attr; - EGLint type; - EGLint criterion; + enum type type; + enum criterion criterion; EGLint default_value; } _eglValidationTable[] = { @@ -245,7 +258,19 @@ static const struct { /* extensions */ { EGL_Y_INVERTED_NOK, ATTRIB_TYPE_BOOLEAN, ATTRIB_CRITERION_EXACT, - EGL_DONT_CARE } + EGL_DONT_CARE }, + { EGL_FRAMEBUFFER_TARGET_ANDROID, ATTRIB_TYPE_BOOLEAN, + ATTRIB_CRITERION_EXACT, + EGL_DONT_CARE }, + { EGL_RECORDABLE_ANDROID, ATTRIB_TYPE_BOOLEAN, + ATTRIB_CRITERION_EXACT, + EGL_DONT_CARE }, + { EGL_COLOR_COMPONENT_TYPE_EXT, ATTRIB_TYPE_ENUM, + ATTRIB_CRITERION_EXACT, + EGL_COLOR_COMPONENT_TYPE_FIXED_EXT }, + { EGL_CONFIG_SELECT_GROUP_MESA, ATTRIB_TYPE_INTEGER, + ATTRIB_CRITERION_IGNORE, + 0 }, }; @@ -260,6 +285,7 @@ static const struct { EGLBoolean _eglValidateConfig(const _EGLConfig *conf, EGLBoolean for_matching) { + _EGLDisplay *disp = conf->Display; EGLint i, attr, val; EGLBoolean valid = EGL_TRUE; @@ -283,6 +309,8 @@ _eglValidateConfig(const _EGLConfig *conf, EGLBoolean for_matching) if (val > 1 || val < 0) valid = EGL_FALSE; break; + case EGL_CONFIG_SELECT_GROUP_MESA: + break; default: if (val < 0) valid = EGL_FALSE; @@ -308,8 +336,13 @@ _eglValidateConfig(const _EGLConfig *conf, EGLBoolean for_matching) if (val != EGL_RGB_BUFFER && val != EGL_LUMINANCE_BUFFER) valid = EGL_FALSE; break; + case EGL_COLOR_COMPONENT_TYPE_EXT: + if (val != EGL_COLOR_COMPONENT_TYPE_FIXED_EXT && + val != EGL_COLOR_COMPONENT_TYPE_FLOAT_EXT) + valid = EGL_FALSE; + break; default: - assert(0); + unreachable("check _eglValidationTable[]"); break; } break; @@ -323,6 +356,8 @@ _eglValidateConfig(const _EGLConfig *conf, EGLBoolean for_matching) EGL_VG_ALPHA_FORMAT_PRE_BIT | EGL_MULTISAMPLE_RESOLVE_BOX_BIT | EGL_SWAP_BEHAVIOR_PRESERVED_BIT; + if (disp->Extensions.KHR_mutable_render_buffer) + mask |= EGL_MUTABLE_RENDER_BUFFER_BIT_KHR; break; case EGL_RENDERABLE_TYPE: case EGL_CONFORMANT: @@ -333,7 +368,7 @@ _eglValidateConfig(const _EGLConfig *conf, EGLBoolean for_matching) EGL_OPENGL_BIT; break; default: - assert(0); + unreachable("check _eglValidationTable[]"); mask = 0; break; } @@ -348,9 +383,6 @@ _eglValidateConfig(const _EGLConfig *conf, EGLBoolean for_matching) if (val != 0) valid = EGL_FALSE; break; - default: - assert(0); - break; } if (!valid && for_matching) { @@ -458,8 +490,8 @@ _eglMatchConfig(const _EGLConfig *conf, const _EGLConfig *criteria) case ATTRIB_CRITERION_SPECIAL: /* ignored here */ break; - default: - assert(0); + case ATTRIB_CRITERION_IGNORE: + unreachable("already handled above"); break; } @@ -488,6 +520,10 @@ _eglIsConfigAttribValid(_EGLConfig *conf, EGLint attr) switch (attr) { case EGL_Y_INVERTED_NOK: return conf->Display->Extensions.NOK_texture_from_pixmap; + case EGL_FRAMEBUFFER_TARGET_ANDROID: + return conf->Display->Extensions.ANDROID_framebuffer_target; + case EGL_RECORDABLE_ANDROID: + return conf->Display->Extensions.ANDROID_recordable; default: break; } @@ -500,12 +536,12 @@ _eglIsConfigAttribValid(_EGLConfig *conf, EGLint attr) * Return EGL_FALSE if any of the attribute is invalid. */ EGLBoolean -_eglParseConfigAttribList(_EGLConfig *conf, _EGLDisplay *dpy, +_eglParseConfigAttribList(_EGLConfig *conf, _EGLDisplay *disp, const EGLint *attrib_list) { EGLint attr, val, i; - _eglInitConfig(conf, dpy, EGL_DONT_CARE); + _eglInitConfig(conf, disp, EGL_DONT_CARE); /* reset to default values */ for (i = 0; i < ARRAY_SIZE(_eglValidationTable); i++) { @@ -520,7 +556,7 @@ _eglParseConfigAttribList(_EGLConfig *conf, _EGLDisplay *dpy, val = attrib_list[i + 1]; if (!_eglIsConfigAttribValid(conf, attr)) - return EGL_FALSE; + return EGL_FALSE; _eglSetConfigKey(conf, attr, val); } @@ -587,15 +623,19 @@ _eglCompareConfigs(const _EGLConfig *conf1, const _EGLConfig *conf2, if (conf1 == conf2) return 0; + val1 = conf1->ConfigSelectGroup - conf2->ConfigSelectGroup; + if (val1) + return val1; + /* the enum values have the desired ordering */ - assert(EGL_NONE < EGL_SLOW_CONFIG); - assert(EGL_SLOW_CONFIG < EGL_NON_CONFORMANT_CONFIG); + STATIC_ASSERT(EGL_NONE < EGL_SLOW_CONFIG); + STATIC_ASSERT(EGL_SLOW_CONFIG < EGL_NON_CONFORMANT_CONFIG); val1 = conf1->ConfigCaveat - conf2->ConfigCaveat; if (val1) return val1; /* the enum values have the desired ordering */ - assert(EGL_RGB_BUFFER < EGL_LUMINANCE_BUFFER); + STATIC_ASSERT(EGL_RGB_BUFFER < EGL_LUMINANCE_BUFFER); val1 = conf1->ColorBufferType - conf2->ColorBufferType; if (val1) return val1; @@ -716,9 +756,6 @@ _eglFilterConfigArray(_EGLArray *array, EGLConfig *configs, _EGLConfig **configList; EGLint i, count; - if (!num_configs) - return _eglError(EGL_BAD_PARAMETER, "eglChooseConfigs"); - /* get the number of matched configs */ count = _eglFilterArray(array, NULL, 0, (_EGLArrayForEach) match, priv_data); @@ -791,7 +828,7 @@ _eglChooseConfig(_EGLDriver *drv, _EGLDisplay *disp, const EGLint *attrib_list, * Fallback for eglGetConfigAttrib. */ EGLBoolean -_eglGetConfigAttrib(_EGLDriver *drv, _EGLDisplay *dpy, _EGLConfig *conf, +_eglGetConfigAttrib(_EGLDriver *drv, _EGLDisplay *disp, _EGLConfig *conf, EGLint attribute, EGLint *value) { if (!_eglIsConfigAttribValid(conf, attribute)) @@ -830,9 +867,6 @@ EGLBoolean _eglGetConfigs(_EGLDriver *drv, _EGLDisplay *disp, EGLConfig *configs, EGLint config_size, EGLint *num_config) { - if (!num_config) - return _eglError(EGL_BAD_PARAMETER, "eglGetConfigs"); - *num_config = _eglFlattenArray(disp->Configs, (void *) configs, sizeof(configs[0]), config_size, _eglFlattenConfig);