Commit 3ef3ba4d authored by Ian Romanick's avatar Ian Romanick

tests/glx: Add unit tests for GLX_ARB_create_context GLX protocol

This adds a new tests directory at the top-level and some extra build
infrastructure.  The tests use the Google C++ Testing Framework, and
they will only be built if configure can detect its availability.  The
tests are automatically wired-in to run with 'make check'.
Signed-off-by: 's avatarIan Romanick <ian.d.romanick@intel.com>
Acked-by: 's avatarChad Versace <chad.versace@linux.intel.com>
parent 8a4b36de
......@@ -23,7 +23,7 @@ doxygen:
check:
cd src/glsl/tests/ && ./optimization-test
@echo "All tests passed."
make -C tests check
clean:
-@touch $(TOP)/configs/current
......
dnl Process this file with autoconf to create configure.
nl Process this file with autoconf to create configure.
AC_PREREQ([2.59])
......@@ -16,6 +16,7 @@ AC_INIT([Mesa],[mesa_version],
[https://bugs.freedesktop.org/enter_bug.cgi?product=Mesa])
AC_CONFIG_AUX_DIR([bin])
AC_CANONICAL_HOST
AM_INIT_AUTOMAKE([foreign])
dnl Save user CFLAGS and CXXFLAGS so one can override the default ones
USER_CFLAGS="$CFLAGS"
......@@ -65,6 +66,19 @@ solaris*)
;;
esac
AC_PATH_PROG([GTESTCONFIG], [gtest-config])
if test "x$GTESTCONFIG" != "x"; then
GTEST_CFLAGS=`gtest-config --cppflags --cxxflags`
GTEST_LIBS=`gtest-config --ldflags --libs`
HAVE_GTEST=1
AC_SUBST([GTEST_CFLAGS])
AC_SUBST([GTEST_LIBS])
HAVE_GTEST=yes
else
HAVE_GTEST=no
fi
AM_CONDITIONAL(HAVE_GTEST, test x$HAVE_GTEST = xyes)
dnl clang is mostly GCC-compatible, but its version is much lower,
dnl so we have to check for it.
AC_MSG_CHECKING([if compiling with clang])
......@@ -1907,7 +1921,9 @@ CFLAGS="$CFLAGS $USER_CFLAGS"
CXXFLAGS="$CXXFLAGS $USER_CXXFLAGS"
dnl Substitute the config
AC_CONFIG_FILES([configs/autoconf])
AC_CONFIG_FILES([configs/autoconf
tests/Makefile
tests/glx/Makefile])
dnl Replace the configs/current symlink
AC_CONFIG_COMMANDS([configs],[
......
......@@ -83,8 +83,11 @@ INCLUDES = -I. \
default: depend $(TOP)/$(LIB_DIR)/$(GL_LIB_NAME)
libglx.a: $(OBJECTS)
$(MKLIB) -cplusplus -o glx -static $(OBJECTS)
# Make libGL
$(TOP)/$(LIB_DIR)/$(GL_LIB_NAME): $(OBJECTS) $(GLAPI_LIB) Makefile
$(TOP)/$(LIB_DIR)/$(GL_LIB_NAME): libglx.a $(OBJECTS) $(GLAPI_LIB) Makefile
$(MKLIB) -o $(GL_LIB) -linker '$(CXX)' -ldflags '$(LDFLAGS)' \
-major 1 -minor 2 \
-cplusplus $(MKLIB_OPTIONS) \
......
AM_CFLAGS = -I$(top_builddir)/src/glx -I$(top_builddir)/src/mapi \
$(X11_CFLAGS) $(GTEST_CFLAGS)
AM_CXXFLAGS = -I$(top_builddir)/src/glx -I$(top_builddir)/src/mapi \
$(X11_CFLAGS) $(GTEST_CFLAGS)
if HAVE_GTEST
TESTS = glx_unittest
check_PROGRAMS = glx_unittest
glx_unittest_SOURCES = \
clientinfo_unittest.cpp \
create_context_unittest.cpp \
fake_glx_screen.cpp
glx_unittest_LDADD = $(top_builddir)/src/glx/libglx.a $(GTEST_LIBS) -lgtest_main
endif
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
/*
* Copyright © 2011 Intel Corporation
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice (including the next
* paragraph) shall be included in all copies or substantial portions of the
* Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*/
#include "fake_glx_screen.h"
struct glx_screen_vtable fake_glx_screen::vt = {
indirect_create_context,
fake_glx_context::create_attribs
};
struct glx_screen_vtable fake_glx_screen_direct::vt = {
fake_glx_context_direct::create,
fake_glx_context_direct::create_attribs
};
const struct glx_context_vtable fake_glx_context::vt = {
fake_glx_context::destroy,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
};
int fake_glx_context::contexts_allocated = 0;
extern "C" struct glx_context *
indirect_create_context(struct glx_screen *psc, struct glx_config *mode,
struct glx_context *shareList, int renderType)
{
(void) shareList;
(void) renderType;
return new fake_glx_context(psc, mode);
}
/*
* Copyright © 2011 Intel Corporation
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice (including the next
* paragraph) shall be included in all copies or substantial portions of the
* Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*/
extern "C" {
#include "glxclient.h"
};
class fake_glx_screen : public glx_screen {
public:
fake_glx_screen(struct glx_display *glx_dpy, int num, const char *ext)
{
this->vtable = &fake_glx_screen::vt;
this->serverGLXexts = 0;
this->effectiveGLXexts = 0;
this->display = 0;
this->dpy = 0;
this->scr = num;
this->visuals = 0;
this->configs = 0;
this->display = glx_dpy;
this->dpy = (glx_dpy != NULL) ? glx_dpy->dpy : NULL;
this->serverGLXexts = new char[strlen(ext)];
strcpy((char *) this->serverGLXexts, ext);
}
~fake_glx_screen()
{
delete [] this->serverGLXexts;
}
private:
static struct glx_screen_vtable vt;
};
class fake_glx_screen_direct : public fake_glx_screen {
public:
fake_glx_screen_direct(struct glx_display *glx_dpy, int num,
const char *ext)
: fake_glx_screen(glx_dpy, num, ext)
{
this->vtable = &fake_glx_screen_direct::vt;
}
private:
static struct glx_screen_vtable vt;
};
class fake_glx_context : public glx_context {
public:
fake_glx_context(struct glx_screen *psc, struct glx_config *mode)
{
contexts_allocated++;
this->vtable = &fake_glx_context::vt;
this->majorOpcode = 123;
this->screen = psc->scr;
this->psc = psc;
this->config = mode;
this->isDirect = false;
this->currentContextTag = -1;
this->client_state_private = (struct __GLXattributeRec *) 0xcafebabe;
}
~fake_glx_context()
{
contexts_allocated--;
}
static glx_context *create_attribs(struct glx_screen *psc,
struct glx_config *mode,
struct glx_context *shareList,
unsigned num_attribs,
const uint32_t *attribs,
unsigned *error)
{
(void) shareList;
(void) num_attribs;
(void) attribs;
*error = 0;
return new fake_glx_context(psc, mode);
}
/** Number of context that are allocated (and not freed). */
static int contexts_allocated;
private:
static const struct glx_context_vtable vt;
static void destroy(struct glx_context *gc)
{
delete gc;
}
};
class fake_glx_context_direct : public fake_glx_context {
public:
fake_glx_context_direct(struct glx_screen *psc, struct glx_config *mode)
: fake_glx_context(psc, mode)
{
this->isDirect = True;
}
static glx_context *create(struct glx_screen *psc, struct glx_config *mode,
struct glx_context *shareList, int renderType)
{
(void) shareList;
(void) renderType;
return new fake_glx_context_direct(psc, mode);
}
static glx_context *create_attribs(struct glx_screen *psc,
struct glx_config *mode,
struct glx_context *shareList,
unsigned num_attribs,
const uint32_t *attribs,
unsigned *error)
{
(void) shareList;
(void) num_attribs;
(void) attribs;
*error = 0;
return new fake_glx_context_direct(psc, mode);
}
};
/*
* Copyright © 2011 Intel Corporation
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice (including the next
* paragraph) shall be included in all copies or substantial portions of the
* Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*/
#include <X11/X.h>
class mock_XDisplay : public _XDisplay {
public:
mock_XDisplay(int nscreens)
{
memset(this, 0, sizeof(struct _XDisplay));
this->nscreens = nscreens;
}
};
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment