summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKristian Høgsberg <krh@redhat.com>2008-12-19 12:05:01 -0500
committerKristian Høgsberg <krh@redhat.com>2008-12-19 12:08:17 -0500
commit28471dbfbb27495ac11f7475b8dbbadd85018a33 (patch)
treef161ac7866de2299bb85f4d85b064ecb51cd476d
parentc1512b69a5d5414e6712fe47b1ea19f34c1ed5d1 (diff)
Begin implementing the config chooser.
-rw-r--r--eagle.c52
-rw-r--r--test.c57
2 files changed, 57 insertions, 52 deletions
diff --git a/eagle.c b/eagle.c
index a5bc179..1a41550 100644
--- a/eagle.c
+++ b/eagle.c
@@ -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)
diff --git a/test.c b/test.c
index cad2949..e8565ab 100644
--- a/test.c
+++ b/test.c
@@ -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);