egl: make implementing eglChooseConfig easier

Add a new helper function, _eglFilterConfigArray, for drivers and hide
_eglSortConfigs.
This commit is contained in:
Chia-I Wu
2011-06-25 17:32:15 +09:00
parent 1e9f0b1736
commit 31520548b7
3 changed files with 63 additions and 63 deletions

View File

@@ -634,7 +634,7 @@ void _eglSwapConfigs(const _EGLConfig **conf1, const _EGLConfig **conf2)
* qsort() in that the compare function accepts an additional * qsort() in that the compare function accepts an additional
* argument. * argument.
*/ */
void static void
_eglSortConfigs(const _EGLConfig **configs, EGLint count, _eglSortConfigs(const _EGLConfig **configs, EGLint count,
EGLint (*compare)(const _EGLConfig *, const _EGLConfig *, EGLint (*compare)(const _EGLConfig *, const _EGLConfig *,
void *), void *),
@@ -672,34 +672,27 @@ _eglSortConfigs(const _EGLConfig **configs, EGLint count,
} }
static int
_eglFallbackCompare(const _EGLConfig *conf1, const _EGLConfig *conf2,
void *priv_data)
{
const _EGLConfig *criteria = (const _EGLConfig *) priv_data;
return _eglCompareConfigs(conf1, conf2, criteria, EGL_TRUE);
}
/** /**
* Typical fallback routine for eglChooseConfig * A helper function for implementing eglChooseConfig. See _eglFilterArray and
* _eglSortConfigs for the meanings of match and compare.
*/ */
EGLBoolean EGLBoolean
_eglChooseConfig(_EGLDriver *drv, _EGLDisplay *disp, const EGLint *attrib_list, _eglFilterConfigArray(_EGLArray *array, EGLConfig *configs,
EGLConfig *configs, EGLint config_size, EGLint *num_configs) EGLint config_size, EGLint *num_configs,
EGLBoolean (*match)(const _EGLConfig *, void *),
EGLint (*compare)(const _EGLConfig *, const _EGLConfig *,
void *),
void *priv_data)
{ {
_EGLConfig **configList, criteria; _EGLConfig **configList;
EGLint i, count; EGLint i, count;
if (!num_configs) if (!num_configs)
return _eglError(EGL_BAD_PARAMETER, "eglChooseConfigs"); return _eglError(EGL_BAD_PARAMETER, "eglChooseConfigs");
if (!_eglParseConfigAttribList(&criteria, disp, attrib_list))
return _eglError(EGL_BAD_ATTRIBUTE, "eglChooseConfig");
/* get the number of matched configs */ /* get the number of matched configs */
count = _eglFilterArray(disp->Configs, NULL, 0, count = _eglFilterArray(array, NULL, 0,
(_EGLArrayForEach) _eglMatchConfig, (void *) &criteria); (_EGLArrayForEach) match, priv_data);
if (!count) { if (!count) {
*num_configs = count; *num_configs = count;
return EGL_TRUE; return EGL_TRUE;
@@ -710,13 +703,13 @@ _eglChooseConfig(_EGLDriver *drv, _EGLDisplay *disp, const EGLint *attrib_list,
return _eglError(EGL_BAD_ALLOC, "eglChooseConfig(out of memory)"); return _eglError(EGL_BAD_ALLOC, "eglChooseConfig(out of memory)");
/* get the matched configs */ /* get the matched configs */
_eglFilterArray(disp->Configs, (void **) configList, count, _eglFilterArray(array, (void **) configList, count,
(_EGLArrayForEach) _eglMatchConfig, (void *) &criteria); (_EGLArrayForEach) match, priv_data);
/* perform sorting of configs */ /* perform sorting of configs */
if (configs && count) { if (configs && count) {
_eglSortConfigs((const _EGLConfig **) configList, count, _eglSortConfigs((const _EGLConfig **) configList, count,
_eglFallbackCompare, (void *) &criteria); compare, priv_data);
count = MIN2(count, config_size); count = MIN2(count, config_size);
for (i = 0; i < count; i++) for (i = 0; i < count; i++)
configs[i] = _eglGetConfigHandle(configList[i]); configs[i] = _eglGetConfigHandle(configList[i]);
@@ -730,6 +723,41 @@ _eglChooseConfig(_EGLDriver *drv, _EGLDisplay *disp, const EGLint *attrib_list,
} }
static EGLBoolean
_eglFallbackMatch(const _EGLConfig *conf, void *priv_data)
{
return _eglMatchConfig(conf, (const _EGLConfig *) priv_data);
}
static EGLint
_eglFallbackCompare(const _EGLConfig *conf1, const _EGLConfig *conf2,
void *priv_data)
{
return _eglCompareConfigs(conf1, conf2,
(const _EGLConfig *) priv_data, EGL_TRUE);
}
/**
* Typical fallback routine for eglChooseConfig
*/
EGLBoolean
_eglChooseConfig(_EGLDriver *drv, _EGLDisplay *disp, const EGLint *attrib_list,
EGLConfig *configs, EGLint config_size, EGLint *num_configs)
{
_EGLConfig criteria;
if (!_eglParseConfigAttribList(&criteria, disp, attrib_list))
return _eglError(EGL_BAD_ATTRIBUTE, "eglChooseConfig");
return _eglFilterConfigArray(disp->Configs,
configs, config_size, num_configs,
_eglFallbackMatch, _eglFallbackCompare,
(void *) &criteria);
}
/** /**
* Fallback for eglGetConfigAttrib. * Fallback for eglGetConfigAttrib.
*/ */

View File

@@ -172,11 +172,13 @@ _eglCompareConfigs(const _EGLConfig *conf1, const _EGLConfig *conf2,
const _EGLConfig *criteria, EGLBoolean compare_id); const _EGLConfig *criteria, EGLBoolean compare_id);
PUBLIC void PUBLIC EGLBoolean
_eglSortConfigs(const _EGLConfig **configs, EGLint count, _eglFilterConfigArray(_EGLArray *array, EGLConfig *configs,
EGLint (*compare)(const _EGLConfig *, const _EGLConfig *, EGLint config_size, EGLint *num_configs,
void *), EGLBoolean (*match)(const _EGLConfig *, void *),
void *priv_data); EGLint (*compare)(const _EGLConfig *, const _EGLConfig *,
void *),
void *filter_data);
extern EGLBoolean extern EGLBoolean

View File

@@ -97,8 +97,10 @@ egl_g3d_compare_config(const _EGLConfig *conf1, const _EGLConfig *conf2,
} }
static EGLBoolean static EGLBoolean
egl_g3d_match_config(const _EGLConfig *conf, const _EGLConfig *criteria) egl_g3d_match_config(const _EGLConfig *conf, void *priv_data)
{ {
const _EGLConfig *criteria = (const _EGLConfig *) priv_data;
if (!_eglMatchConfig(conf, criteria)) if (!_eglMatchConfig(conf, criteria))
return EGL_FALSE; return EGL_FALSE;
@@ -120,45 +122,13 @@ static EGLBoolean
egl_g3d_choose_config(_EGLDriver *drv, _EGLDisplay *dpy, const EGLint *attribs, egl_g3d_choose_config(_EGLDriver *drv, _EGLDisplay *dpy, const EGLint *attribs,
EGLConfig *configs, EGLint size, EGLint *num_configs) EGLConfig *configs, EGLint size, EGLint *num_configs)
{ {
_EGLConfig **tmp_configs, criteria; _EGLConfig criteria;
EGLint tmp_size, i;
if (!num_configs)
return _eglError(EGL_BAD_PARAMETER, "eglChooseConfigs");
if (!_eglParseConfigAttribList(&criteria, dpy, attribs)) if (!_eglParseConfigAttribList(&criteria, dpy, attribs))
return _eglError(EGL_BAD_ATTRIBUTE, "eglChooseConfig"); return _eglError(EGL_BAD_ATTRIBUTE, "eglChooseConfig");
/* get the number of matched configs */ return _eglFilterConfigArray(dpy->Configs, configs, size, num_configs,
tmp_size = _eglFilterArray(dpy->Configs, NULL, 0, egl_g3d_match_config, egl_g3d_compare_config, &criteria);
(_EGLArrayForEach) egl_g3d_match_config, (void *) &criteria);
if (!tmp_size) {
*num_configs = tmp_size;
return EGL_TRUE;
}
tmp_configs = MALLOC(sizeof(tmp_configs[0]) * tmp_size);
if (!tmp_configs)
return _eglError(EGL_BAD_ALLOC, "eglChooseConfig(out of memory)");
/* get the matched configs */
_eglFilterArray(dpy->Configs, (void **) tmp_configs, tmp_size,
(_EGLArrayForEach) egl_g3d_match_config, (void *) &criteria);
/* perform sorting of configs */
if (configs && tmp_size) {
_eglSortConfigs((const _EGLConfig **) tmp_configs, tmp_size,
egl_g3d_compare_config, (void *) &criteria);
tmp_size = MIN2(tmp_size, size);
for (i = 0; i < tmp_size; i++)
configs[i] = _eglGetConfigHandle(tmp_configs[i]);
}
FREE(tmp_configs);
*num_configs = tmp_size;
return EGL_TRUE;
} }
static _EGLContext * static _EGLContext *