/**
- * Filter an array and return the filtered data. The returned data pointer
- * should be freed.
+ * Filter an array and return the number of filtered elements.
*/
-void **
-_eglFilterArray(_EGLArray *array, EGLint *size,
+EGLint
+_eglFilterArray(_EGLArray *array, void **data, EGLint size,
_EGLArrayForEach filter, void *filter_data)
{
- void **data;
EGLint count = 0, i;
- if (!array) {
- *size = 0;
- return malloc(0);
- }
-
- data = malloc(array->Size * sizeof(array->Elements[0]));
- if (!data)
- return NULL;
+ if (!array)
+ return 0;
if (filter) {
for (i = 0; i < array->Size; i++) {
- if (filter(array->Elements[i], filter_data))
- data[count++] = array->Elements[i];
+ if (filter(array->Elements[i], filter_data)) {
+ if (data && count < size)
+ data[count] = array->Elements[i];
+ count++;
+ }
+ if (data && count >= size)
+ break;
}
}
else {
- memcpy(data, array->Elements, array->Size * sizeof(array->Elements[0]));
+ if (data) {
+ count = (size < array->Size) ? size : array->Size;
+ memcpy(data, array->Elements, count * sizeof(array->Elements[0]));
+ }
+ else {
+ count = array->Size;
+ }
}
- *size = count;
-
- return data;
+ return count;
}
_eglFindArray(_EGLArray *array, void *elem);
-PUBLIC void **
-_eglFilterArray(_EGLArray *array, EGLint *size,
+PUBLIC EGLint
+_eglFilterArray(_EGLArray *array, void **data, EGLint size,
_EGLArrayForEach filter, void *filter_data);
if (!_eglParseConfigAttribList(&criteria, disp, attrib_list))
return _eglError(EGL_BAD_ATTRIBUTE, "eglChooseConfig");
- configList = (_EGLConfig **) _eglFilterArray(disp->Configs, &count,
+ /* get the number of matched configs */
+ count = _eglFilterArray(disp->Configs, NULL, 0,
(_EGLArrayForEach) _eglMatchConfig, (void *) &criteria);
+ if (!count) {
+ *num_configs = count;
+ return EGL_TRUE;
+ }
+
+ configList = malloc(sizeof(*configList) * count);
if (!configList)
return _eglError(EGL_BAD_ALLOC, "eglChooseConfig(out of memory)");
+ /* get the matched configs */
+ _eglFilterArray(disp->Configs, (void **) configList, count,
+ (_EGLArrayForEach) _eglMatchConfig, (void *) &criteria);
+
/* perform sorting of configs */
if (configs && count) {
_eglSortConfigs((const _EGLConfig **) configList, count,
if (!_eglParseConfigAttribList(&criteria, dpy, attribs))
return _eglError(EGL_BAD_ATTRIBUTE, "eglChooseConfig");
- tmp_configs = (_EGLConfig **) _eglFilterArray(dpy->Configs, &tmp_size,
+ /* get the number of matched configs */
+ tmp_size = _eglFilterArray(dpy->Configs, NULL, 0,
(_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 (tmp_configs && tmp_size) {
_eglSortConfigs((const _EGLConfig **) tmp_configs, tmp_size,
configs[i] = _eglGetConfigHandle(tmp_configs[i]);
}
- free(tmp_configs);
+ FREE(tmp_configs);
*num_configs = size;