diff options
author | Kristian Høgsberg <krh@redhat.com> | 2008-12-19 12:05:01 -0500 |
---|---|---|
committer | Kristian Høgsberg <krh@redhat.com> | 2008-12-19 12:08:17 -0500 |
commit | 28471dbfbb27495ac11f7475b8dbbadd85018a33 (patch) | |
tree | f161ac7866de2299bb85f4d85b064ecb51cd476d | |
parent | c1512b69a5d5414e6712fe47b1ea19f34c1ed5d1 (diff) |
Begin implementing the config chooser.
-rw-r--r-- | eagle.c | 52 | ||||
-rw-r--r-- | test.c | 57 |
2 files changed, 57 insertions, 52 deletions
@@ -282,13 +282,6 @@ eglGetConfigs(EGLDisplay display, EGLConfig *configs, return EGL_TRUE; } -EGLBoolean -eglChooseConfig(EGLDisplay display, const EGLint *attribList, - EGLConfig *configs, EGLint configSize, EGLint *numConfigs) -{ - return EGL_TRUE; -} - static struct { int egl_attrib, dri_attrib; } attrib_map[] = { { EGL_BUFFER_SIZE, __DRI_ATTRIB_BUFFER_SIZE }, { EGL_RED_SIZE, __DRI_ATTRIB_RED_SIZE }, @@ -318,6 +311,51 @@ static struct { int egl_attrib, dri_attrib; } attrib_map[] = { #define ARRAY_SIZE(a) (sizeof(a) / sizeof ((a)[0])) +static EGLBoolean +attributeMatches(EGLDisplay display, + EGLConfig config, EGLint attribute, EGLint value) +{ + EGLint config_value; + + /* FIXME: Handle non-exact matches. */ + + if (!eglGetConfigAttrib(display, config, attribute, &config_value)) + return EGL_FALSE; + + return value == config_value; +} + +static EGLBoolean +configMatches(EGLDisplay display, + EGLConfig config, const EGLint *attribList) +{ + int i; + + for (i = 0; attribList[i] != EGL_NONE; i += 2) + if (!attributeMatches(display, config, + attribList[i], attribList[i + 1])) + return EGL_FALSE; + + return EGL_TRUE; +} + +EGLBoolean +eglChooseConfig(EGLDisplay display, const EGLint *attribList, + EGLConfig *configs, EGLint configSize, EGLint *numConfigs) +{ + int i, j; + + for (i = 0, j = 0; i < display->numConfigs; i++) { + if (configMatches(display, &display->configs[i], attribList) && j < configSize) + configs[j++] = &display->configs[i]; + } + + if (numConfigs != NULL) + *numConfigs = j; + + return j > 0; +} + EGLBoolean eglGetConfigAttrib(EGLDisplay display, EGLConfig config, EGLint attribute, EGLint *value) @@ -63,49 +63,12 @@ static void run(EGLDisplay display, EGLSurface surface, EGLConfig config, eglTerminate(display); } -static EGLConfig -pick_config(EGLDisplay display) -{ - EGLConfig config, configs[100]; - EGLint value, count; - int i; - - if (!eglGetConfigs(display, configs, ARRAY_SIZE(configs), &count)) { - fprintf(stderr, "failed to get configs\n"); - return EGL_NO_CONFIG; - } - - config = EGL_NO_CONFIG; - for (i = 0; i < count; i++) { - eglGetConfigAttrib(display, - configs[i], - EGL_DEPTH_SIZE, - &value); - if (value == 0) { - fprintf(stderr, "config %d has depth size %d\n", i, value); - continue; - } - - eglGetConfigAttrib(display, - configs[i], - EGL_CONFIG_CAVEAT, - &value); - if (value != EGL_NONE) { - fprintf(stderr, "config %d has caveat %d\n", i, value); - continue; - } - - config = configs[i]; - break; - } - - if (config == EGL_NO_CONFIG) { - fprintf(stderr, "found no config without depth or stencil buffers\n"); - return EGL_NO_CONFIG; - } - - return config; -} +static const EGLint config_attribs[] = { + EGL_DEPTH_SIZE, 0, + EGL_STENCIL_SIZE, 0, + EGL_CONFIG_CAVEAT, EGL_NONE, + EGL_NONE +}; static void run_dri2(int x, int y, int width, int height) { @@ -154,7 +117,9 @@ static void run_dri2(int x, int y, int width, int height) if (!eglInitialize(display, &major, &minor)) die("failed to initialize display\n"); - config = pick_config(display); + if (!eglChooseConfig(display, config_attribs, &config, 1, NULL)) + die("failed to pick a config\n"); + surface = eglCreateSurfaceX11(display, config, window, width, height); if (surface == NULL) die("failed to create surface\n"); @@ -273,7 +238,9 @@ static void run_native(int x, int y, int width, int height) if (!eglInitialize(display, &major, &minor)) die("failed to initialize display\n"); - config = pick_config(display); + if (!eglChooseConfig(display, config_attribs, &config, 1, NULL)) + die("failed to pick a config\n"); + name = create_frontbuffer(display, &fb_width, &fb_height, &fb_stride); surface = eglCreateSurfaceForName(display, config, name, width, height, fb_stride, attribs); |