From 802153469d8763ed0dfe58590cee91aac1c49246 Mon Sep 17 00:00:00 2001 From: Tavian Barnes Date: Tue, 30 Nov 2010 17:25:16 -0500 Subject: Test for GLX usability. --- configure.ac | 3 + tests/libdimension/Makefile.am | 7 +- tests/libdimension/display-stubs.c | 36 +++++++++ tests/libdimension/display.c | 151 +++++++++++++++++++++++++++++++++++++ tests/libdimension/tests.c | 140 ---------------------------------- tests/libdimension/tests.h | 11 +-- 6 files changed, 197 insertions(+), 151 deletions(-) create mode 100644 tests/libdimension/display-stubs.c create mode 100644 tests/libdimension/display.c delete mode 100644 tests/libdimension/tests.c diff --git a/configure.ac b/configure.ac index b4147fd..81c299c 100644 --- a/configure.ac +++ b/configure.ac @@ -125,6 +125,9 @@ AC_COMPILE_IFELSE([ AC_MSG_RESULT([no])] ) +AC_CHECK_HEADER([GL/glx.h], [enable_glx=yes], [enable_glx=no]) +AM_CONDITIONAL([GLX], [test "$enable_glx" != "no"]) + dnl Generate Makefiles AC_CONFIG_MACRO_DIR([m4]) AC_CONFIG_FILES([Makefile diff --git a/tests/libdimension/Makefile.am b/tests/libdimension/Makefile.am index 252deba..4dbe761 100644 --- a/tests/libdimension/Makefile.am +++ b/tests/libdimension/Makefile.am @@ -39,7 +39,7 @@ if !GL XFAIL_TESTS += gl-test endif -libdimension_tests_la_SOURCES = tests.c tests.h +libdimension_tests_la_SOURCES = tests.h if PGO libdimension_tests_la_LIBADD = $(top_builddir)/libdimension/libdimension-pgo.la @@ -47,7 +47,12 @@ else libdimension_tests_la_LIBADD = $(top_builddir)/libdimension/libdimension.la endif +if GLX +libdimension_tests_la_SOURCES += display.c libdimension_tests_la_LIBADD += -lX11 -lGL +else +libdimension_tests_la_SOURCES += display-stubs.c +endif error_test_SOURCES = error.c error_test_LDADD = libdimension-tests.la diff --git a/tests/libdimension/display-stubs.c b/tests/libdimension/display-stubs.c new file mode 100644 index 0000000..03cc19d --- /dev/null +++ b/tests/libdimension/display-stubs.c @@ -0,0 +1,36 @@ +/************************************************************************* + * Copyright (C) 2009-2010 Tavian Barnes * + * * + * This file is part of The Dimension Test Suite. * + * * + * The Dimension Test Suite is free software; you can redistribute it * + * and/or modify it under the terms of the GNU General Public License as * + * published by the Free Software Foundation; either version 3 of the * + * License, or (at your option) any later version. * + * * + * The Dimension Test Suite is distributed in the hope that it will be * + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty * + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * + * General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + *************************************************************************/ + +#include "tests.h" + +dmnsn_display * +dmnsn_new_display(const dmnsn_canvas *canvas) +{ + return NULL; +} + +void +dmnsn_delete_display(dmnsn_display *display) +{ +} + +void +dmnsn_display_flush(dmnsn_display *display) +{ +} diff --git a/tests/libdimension/display.c b/tests/libdimension/display.c new file mode 100644 index 0000000..3fb07e4 --- /dev/null +++ b/tests/libdimension/display.c @@ -0,0 +1,151 @@ +/************************************************************************* + * Copyright (C) 2009-2010 Tavian Barnes * + * * + * This file is part of The Dimension Test Suite. * + * * + * The Dimension Test Suite is free software; you can redistribute it * + * and/or modify it under the terms of the GNU General Public License as * + * published by the Free Software Foundation; either version 3 of the * + * License, or (at your option) any later version. * + * * + * The Dimension Test Suite is distributed in the hope that it will be * + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty * + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * + * General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + *************************************************************************/ + +#include "tests.h" +#include +#include +#include + +struct dmnsn_display { + Display *dpy; + Window win; + Colormap cmap; + GLXContext cx; + XEvent event; + XVisualInfo *vi; +}; + +/* XIfEvent callback */ +static Bool +WaitForNotify(Display *d, XEvent *e, char *arg) +{ + return (e->type == MapNotify) && (e->xmap.window == (Window)arg); +} + +dmnsn_display * +dmnsn_new_display(const dmnsn_canvas *canvas) +{ + int attributeList[] = { + GLX_RGBA, + GLX_DOUBLEBUFFER, + GLX_RED_SIZE, 1, + GLX_GREEN_SIZE, 1, + GLX_BLUE_SIZE, 1, + None + }; + XSetWindowAttributes swa; + dmnsn_display *display; + + display = dmnsn_malloc(sizeof(dmnsn_display)); + + display->dpy = NULL; + display->win = 0; + display->cmap = 0; + display->cx = NULL; + display->vi = NULL; + + /* Get an X connection */ + display->dpy = XOpenDisplay(0); + if (!display->dpy) { + dmnsn_delete_display(display); + return NULL; + } + + /* Get an appropriate visual */ + display->vi = glXChooseVisual(display->dpy, DefaultScreen(display->dpy), + attributeList); + if (!display->vi) { + dmnsn_delete_display(display); + return NULL; + } + + /* Create a GLX context */ + display->cx = glXCreateContext(display->dpy, display->vi, 0, GL_TRUE); + if (!display->cx) { + dmnsn_delete_display(display); + return NULL; + } + + /* Create a color map */ + display->cmap = XCreateColormap(display->dpy, + RootWindow(display->dpy, display->vi->screen), + display->vi->visual, AllocNone); + if (!display->cmap) { + dmnsn_delete_display(display); + return NULL; + } + + /* Create a window */ + swa.colormap = display->cmap; + swa.border_pixel = 0; + swa.event_mask = StructureNotifyMask; + display->win = XCreateWindow(display->dpy, + RootWindow(display->dpy, display->vi->screen), + 0, 0, canvas->width, canvas->height, + 0, display->vi->depth, InputOutput, + display->vi->visual, + CWBorderPixel|CWColormap|CWEventMask, &swa); + if (!display->win) { + dmnsn_delete_display(display); + return NULL; + } + + XStoreName(display->dpy, display->win, "glX"); + + XMapWindow(display->dpy, display->win); + XIfEvent(display->dpy, &display->event, WaitForNotify, (char*)display->win); + + /* Connect the context to the window */ + glXMakeCurrent(display->dpy, display->win, display->cx); + glClearColor(0.0, 0.0, 0.0, 1.0); + glClear(GL_COLOR_BUFFER_BIT); + dmnsn_display_flush(display); + + return display; +} + +void +dmnsn_delete_display(dmnsn_display *display) +{ + if (display) { + if (display->win) + XDestroyWindow(display->dpy, display->win); + + if (display->cmap) + XFreeColormap(display->dpy, display->cmap); + + if (display->cx) + glXDestroyContext(display->dpy, display->cx); + + if (display->vi) + XFree(display->vi); + + if (display->dpy) + XCloseDisplay(display->dpy); + + dmnsn_free(display); + } +} + +void +dmnsn_display_flush(dmnsn_display *display) +{ + glXWaitX(); + glXSwapBuffers(display->dpy, display->win); +} diff --git a/tests/libdimension/tests.c b/tests/libdimension/tests.c deleted file mode 100644 index e2e0d18..0000000 --- a/tests/libdimension/tests.c +++ /dev/null @@ -1,140 +0,0 @@ -/************************************************************************* - * Copyright (C) 2009-2010 Tavian Barnes * - * * - * This file is part of The Dimension Test Suite. * - * * - * The Dimension Test Suite is free software; you can redistribute it * - * and/or modify it under the terms of the GNU General Public License as * - * published by the Free Software Foundation; either version 3 of the * - * License, or (at your option) any later version. * - * * - * The Dimension Test Suite is distributed in the hope that it will be * - * useful, but WITHOUT ANY WARRANTY; without even the implied warranty * - * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - *************************************************************************/ - -#include "tests.h" -#include - -/* XIfEvent callback */ -static Bool -WaitForNotify(Display *d, XEvent *e, char *arg) -{ - return (e->type == MapNotify) && (e->xmap.window == (Window)arg); -} - -dmnsn_display * -dmnsn_new_display(const dmnsn_canvas *canvas) -{ - int attributeList[] = { - GLX_RGBA, - GLX_DOUBLEBUFFER, - GLX_RED_SIZE, 1, - GLX_GREEN_SIZE, 1, - GLX_BLUE_SIZE, 1, - None - }; - XSetWindowAttributes swa; - dmnsn_display *display; - - display = dmnsn_malloc(sizeof(dmnsn_display)); - - display->dpy = NULL; - display->win = 0; - display->cmap = 0; - display->cx = NULL; - display->vi = NULL; - - /* Get an X connection */ - display->dpy = XOpenDisplay(0); - if (!display->dpy) { - dmnsn_delete_display(display); - return NULL; - } - - /* Get an appropriate visual */ - display->vi = glXChooseVisual(display->dpy, DefaultScreen(display->dpy), - attributeList); - if (!display->vi) { - dmnsn_delete_display(display); - return NULL; - } - - /* Create a GLX context */ - display->cx = glXCreateContext(display->dpy, display->vi, 0, GL_TRUE); - if (!display->cx) { - dmnsn_delete_display(display); - return NULL; - } - - /* Create a color map */ - display->cmap = XCreateColormap(display->dpy, - RootWindow(display->dpy, display->vi->screen), - display->vi->visual, AllocNone); - if (!display->cmap) { - dmnsn_delete_display(display); - return NULL; - } - - /* Create a window */ - swa.colormap = display->cmap; - swa.border_pixel = 0; - swa.event_mask = StructureNotifyMask; - display->win = XCreateWindow(display->dpy, - RootWindow(display->dpy, display->vi->screen), - 0, 0, canvas->width, canvas->height, - 0, display->vi->depth, InputOutput, - display->vi->visual, - CWBorderPixel|CWColormap|CWEventMask, &swa); - if (!display->win) { - dmnsn_delete_display(display); - return NULL; - } - - XStoreName(display->dpy, display->win, "glX"); - - XMapWindow(display->dpy, display->win); - XIfEvent(display->dpy, &display->event, WaitForNotify, (char*)display->win); - - /* Connect the context to the window */ - glXMakeCurrent(display->dpy, display->win, display->cx); - glClearColor(0.0, 0.0, 0.0, 1.0); - glClear(GL_COLOR_BUFFER_BIT); - dmnsn_display_flush(display); - - return display; -} - -void -dmnsn_delete_display(dmnsn_display *display) -{ - if (display) { - if (display->win) - XDestroyWindow(display->dpy, display->win); - - if (display->cmap) - XFreeColormap(display->dpy, display->cmap); - - if (display->cx) - glXDestroyContext(display->dpy, display->cx); - - if (display->vi) - XFree(display->vi); - - if (display->dpy) - XCloseDisplay(display->dpy); - - dmnsn_free(display); - } -} - -void -dmnsn_display_flush(dmnsn_display *display) -{ - glXWaitX(); - glXSwapBuffers(display->dpy, display->win); -} diff --git a/tests/libdimension/tests.h b/tests/libdimension/tests.h index 995a063..294670d 100644 --- a/tests/libdimension/tests.h +++ b/tests/libdimension/tests.h @@ -21,8 +21,6 @@ #define TESTS_H #include "dimension.h" -#include -#include #include #include @@ -35,14 +33,7 @@ extern "C" { * Windowing */ -typedef struct { - Display *dpy; - Window win; - Colormap cmap; - GLXContext cx; - XEvent event; - XVisualInfo *vi; -} dmnsn_display; +typedef struct dmnsn_display dmnsn_display; dmnsn_display *dmnsn_new_display(const dmnsn_canvas *canvas); void dmnsn_delete_display(dmnsn_display *display); -- cgit v1.2.3