[Piglit] [PATCH 05/14] glx_ext_import_context: Add common test infrastructure

Brian Paul brianp at vmware.com
Thu Dec 8 16:16:20 PST 2011


On 12/08/2011 04:41 PM, Ian Romanick wrote:
> From: Ian Romanick<ian.d.romanick at intel.com>
>
> Signed-off-by: Ian Romanick<ian.d.romanick at intel.com>
> ---
>   tests/spec/CMakeLists.txt                          |    1 +
>   .../spec/glx_ext_import_context/CMakeLists.gl.txt  |   20 ++
>   tests/spec/glx_ext_import_context/CMakeLists.txt   |    1 +
>   tests/spec/glx_ext_import_context/common.c         |  298 ++++++++++++++++++++
>   tests/spec/glx_ext_import_context/common.h         |   66 +++++
>   5 files changed, 386 insertions(+), 0 deletions(-)
>   create mode 100644 tests/spec/glx_ext_import_context/CMakeLists.gl.txt
>   create mode 100644 tests/spec/glx_ext_import_context/CMakeLists.txt
>   create mode 100644 tests/spec/glx_ext_import_context/common.c
>   create mode 100644 tests/spec/glx_ext_import_context/common.h
>
> diff --git a/tests/spec/CMakeLists.txt b/tests/spec/CMakeLists.txt
> index a4021c3..a5a8335 100644
> --- a/tests/spec/CMakeLists.txt
> +++ b/tests/spec/CMakeLists.txt
> @@ -33,6 +33,7 @@ add_subdirectory (glsl-1.20)
>   add_subdirectory (glsl-1.30)
>   add_subdirectory (gl-2.0)
>   add_subdirectory (gl-3.0)
> +add_subdirectory (glx_ext_import_context)
>   add_subdirectory (arb_vertex_type_2_10_10_10_rev)
>   add_subdirectory (ext_texture_integer)
>   add_subdirectory (arb_draw_buffers)
> diff --git a/tests/spec/glx_ext_import_context/CMakeLists.gl.txt b/tests/spec/glx_ext_import_context/CMakeLists.gl.txt
> new file mode 100644
> index 0000000..b9521e5
> --- /dev/null
> +++ b/tests/spec/glx_ext_import_context/CMakeLists.gl.txt
> @@ -0,0 +1,20 @@
> +
> +include_directories(
> +	${GLEXT_INCLUDE_DIR}
> +	${OPENGL_INCLUDE_PATH}
> +	${GLUT_INCLUDE_DIR}
> +	${piglit_SOURCE_DIR}/tests/util
> +)
> +
> +link_libraries (
> +	piglitglxutil
> +	${OPENGL_gl_LIBRARY}
> +	${OPENGL_glu_LIBRARY}
> +	${GLUT_glut_LIBRARY}
> +	${X11_X11_LIB}
> +)
> +
> +IF(${CMAKE_SYSTEM_NAME} MATCHES "Linux")
> +ENDIF(${CMAKE_SYSTEM_NAME} MATCHES "Linux")
> +
> +# vim: ft=cmake:
> diff --git a/tests/spec/glx_ext_import_context/CMakeLists.txt b/tests/spec/glx_ext_import_context/CMakeLists.txt
> new file mode 100644
> index 0000000..144a306
> --- /dev/null
> +++ b/tests/spec/glx_ext_import_context/CMakeLists.txt
> @@ -0,0 +1 @@
> +piglit_include_target_api()
> diff --git a/tests/spec/glx_ext_import_context/common.c b/tests/spec/glx_ext_import_context/common.c
> new file mode 100644
> index 0000000..b922233
> --- /dev/null
> +++ b/tests/spec/glx_ext_import_context/common.c
> @@ -0,0 +1,298 @@
> +/* 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<assert.h>
> +#include "piglit-util.h"
> +#include "piglit-glx-util.h"
> +#include "common.h"
> +
> +PFNGLXGETCURRENTDISPLAYEXTPROC __piglit_glXGetCurrentDisplayEXT = NULL;
> +PFNGLXQUERYCONTEXTINFOEXTPROC __piglit_glXQueryContextInfoEXT = NULL;
> +PFNGLXGETCONTEXTIDEXTPROC __piglit_glXGetContextIDEXT = NULL;
> +PFNGLXIMPORTCONTEXTEXTPROC __piglit_glXImportContextEXT = NULL;
> +PFNGLXFREECONTEXTEXTPROC __piglit_glXFreeContextEXT = NULL;
> +
> +Display *dpy = NULL;
> +XVisualInfo *visinfo = NULL;
> +GLXContext directCtx = NULL;
> +GLXContextID directID = None;
> +GLXContext indirectCtx = NULL;
> +GLXContextID indirectID = None;
> +
> +int glx_error_code = -1;
> +int x_error_code = Success;
> +
> +int piglit_height = 50;
> +int piglit_width = 50;
> +
> +static int (*old_handler)(Display *, XErrorEvent *);
> +
> +static int x_error_handler(Display *dpy, XErrorEvent *e)
> +{
> +
> +	x_error_code = e->error_code;
> +	glx_error_code = piglit_glx_get_error(dpy, e);
> +
> +        return 0;
> +}
> +
> +void GLX_EXT_import_context_setup_for_child(void)
> +{
> +	dpy = piglit_get_glx_display();
> +        old_handler = XSetErrorHandler(x_error_handler);
> +}

The indentation looks inconsistent.


> +
> +void GLX_EXT_import_context_setup(void)
> +{
> +	const char *const names[] = {
> +		"glXGetCurrentDisplayEXT",
> +		"glXQueryContextInfoEXT",
> +		"glXGetContextIDEXT",
> +		"glXImportContextEXT",
> +		"glXFreeContextEXT"
> +	};
> +
> +	__GLXextFuncPtr *procedures[ARRAY_SIZE(names)] = {
> +		(__GLXextFuncPtr *)&  __piglit_glXGetCurrentDisplayEXT,
> +		(__GLXextFuncPtr *)&  __piglit_glXQueryContextInfoEXT,
> +		(__GLXextFuncPtr *)&  __piglit_glXGetContextIDEXT,
> +		(__GLXextFuncPtr *)&  __piglit_glXImportContextEXT,
> +		(__GLXextFuncPtr *)&  __piglit_glXFreeContextEXT
> +	};
> +
> +	const char *vendor;
> +
> +	dpy = piglit_get_glx_display();
> +
> +	/* NVIDIA incorrectly only list the extension in the client
> +	 * extenstions list.  If the extension is available for applications
> +	 * to use, it is supposed to be included in the list returned by
> +	 * glXQueryExtensionsString.
> +	 *
> +	 * The glXImportContextEXT manual page is somewhat clear on this
> +	 * topic:
> +	 *
> +	 *     "If _glxextstring(EXT_import_context) is included in the string
> +         *     returned by glXQueryExtensionsString, when called with argument
> +         *     GLX_EXTENSIONS, extension EXT_import_context is supported."
> +	 *

Indentation.


> +	 * The text is a little weird because the only parameters to
> +	 * glXQueryExtensionsString are the display and the screen.
> +	 */
> +	vendor = glXGetClientString(dpy, GLX_VENDOR);
> +	if (strcmp("NVIDIA Corporation", vendor) == 0) {
> +		const char needle[] = "GLX_EXT_import_context";
> +		const unsigned needle_len = sizeof(needle) - 1;
> +		const char *haystack;
> +		bool found = false;
> +
> +		haystack = glXGetClientString(dpy, GLX_EXTENSIONS);
> +		while (haystack != NULL) {
> +			const char *s = strstr(haystack, needle);
> +
> +			if (s != NULL
> +			&&  (s[needle_len] == ' '
> +				|| s[needle_len] == '\0')) {
> +				found = true;
> +				break;
> +			}
> +
> +			haystack = s;
> +		}
> +
> +		if (!found) {
> +			fprintf(stderr, "Test requires %s\n", needle);
> +			piglit_report_result(PIGLIT_SKIP);
> +		}
> +	} else {
> +		piglit_require_glx_extension(dpy, "GLX_EXT_import_context");
> +	}
> +
> +	piglit_glx_get_all_proc_addresses(procedures, names, ARRAY_SIZE(names));
> +
> +	visinfo = piglit_get_glx_visual(dpy);
> +
> +	directCtx = glXCreateContext(dpy, visinfo, NULL, True);
> +	if (directCtx == NULL) {
> +		fprintf(stderr,
> +			"Could not create initial direct-rendering context.\n");
> +		piglit_report_result(PIGLIT_FAIL);
> +	}
> +
> +	if (!glXIsDirect(dpy, directCtx)) {
> +		glXDestroyContext(dpy, directCtx);
> +		directCtx = NULL;
> +	}
> +
> +	indirectCtx = glXCreateContext(dpy, visinfo, NULL, False);
> +	if (indirectCtx == NULL) {
> +		fprintf(stderr,
> +			"Could not create initial indirect-rendering "
> +			"context.\n");
> +		piglit_report_result(PIGLIT_FAIL);
> +	}
> +
> +	piglit_glx_get_error(dpy, NULL);
> +	old_handler = XSetErrorHandler(x_error_handler);
> +}
> +
> +void GLX_EXT_import_context_teardown(void)
> +{
> +	if (directCtx != NULL) {
> +		glXDestroyContext(dpy, directCtx);
> +		directCtx = NULL;
> +	}
> +
> +	if (indirectCtx != NULL) {
> +		glXDestroyContext(dpy, indirectCtx);
> +		indirectCtx = NULL;
> +	}
> +
> +	XFree(visinfo);
> +	visinfo = NULL;
> +
> +        XSetErrorHandler(old_handler);
> +}

Indentation.


> +
> +void get_context_IDs(void)
> +{
> +	directID = None;
> +	if (directCtx != NULL) {
> +		directID =  glXGetContextIDEXT(directCtx);
> +	}
> +
> +	indirectID = None;
> +	if (indirectCtx != NULL) {
> +		indirectID =  glXGetContextIDEXT(indirectCtx);
> +	}
> +}
> +
> +const char *context_mode_name(enum context_mode mode)
> +{
> +	switch (mode) {
> +	case direct_rendering:
> +		return "direct-rendering";
> +	case indirect_rendering:
> +		return "indirect-rendering";
> +	case invalid:
> +		return "invalid";
> +	default:
> +		assert(!"Should not get here.");
> +		piglit_report_result(PIGLIT_FAIL);
> +	}
> +
> +	return "";
> +}
> +
> +bool try_import_context(GLXContextID id, enum context_mode mode)
> +{
> +	const int expected_glx_error = (mode == invalid) ? GLXBadContext : -1;
> +	bool pass = true;
> +	GLXContext ctx = glXImportContextEXT(dpy, id);
> +
> +	XSync(dpy, 0);
> +
> +	switch (mode) {
> +	case direct_rendering:
> +		if (ctx != NULL) {
> +			fprintf(stderr,
> +				"Could import direct-rendering context, "
> +				"but should have failed.\n");
> +			pass = false;
> +		}
> +		break;
> +
> +	case indirect_rendering:
> +		if (ctx == NULL) {
> +			fprintf(stderr,
> +				"Could not import indirect-rendering context, "
> +				"but should have succeeded.\n");
> +			pass = false;
> +		}
> +		break;
> +
> +	case invalid:
> +		if (ctx != NULL) {
> +			fprintf(stderr,
> +				"Could import invalid context (0x%08x), "
> +				"but should have failed.\n",
> +				(int) id);
> +			pass = false;
> +		}
> +		break;
> +	}
> +
> +	assert(mode != invalid || expected_glx_error != -1);
> +	pass = validate_glx_error_code(Success, expected_glx_error)&&  pass;
> +
> +	if (!pass)
> +		fprintf(stderr, "Context ID = 0x%08x.\n", (int) id);
> +
> +	if (ctx != NULL)
> +		glXFreeContextEXT(dpy, ctx);
> +
> +	return pass;
> +}
> +
> +bool validate_glx_error_code(int expected_x_error, int expected_glx_error)
> +{
> +	bool pass = true;
> +
> +	if (expected_glx_error == -1
> +	&&  expected_x_error == Success
> +	&&  (glx_error_code != -1 || x_error_code != Success)) {
> +		fprintf(stderr,
> +			"X error %d (%s (%d)) was generated, but "
> +			"no error was expected.\n",
> +			x_error_code,
> +			piglit_glx_error_string(glx_error_code),
> +			glx_error_code);
> +		pass = false;
> +	}
> +
> +	if (expected_glx_error != -1
> +	&&  glx_error_code != expected_glx_error) {
> +		fprintf(stderr,
> +			"X error %d (%s (%d)) was generated, but "
> +			"%s (%d) was expected.\n",
> +			x_error_code,
> +			piglit_glx_error_string(glx_error_code),
> +			glx_error_code,
> +			piglit_glx_error_string(expected_glx_error),
> +			expected_glx_error);
> +		pass = false;
> +	} else if (expected_x_error != Success
> +		&&  x_error_code != expected_x_error) {
> +		fprintf(stderr,
> +			"X error %d (%s (%d)) was generated, but "
> +			"X error %d was expected.\n",
> +			x_error_code,
> +			piglit_glx_error_string(glx_error_code),
> +			glx_error_code,
> +			expected_x_error);
> +		pass = false;
> +	}
> +
> +	x_error_code = Success;
> +	glx_error_code = -1;
> +	return pass;
> +}
> diff --git a/tests/spec/glx_ext_import_context/common.h b/tests/spec/glx_ext_import_context/common.h
> new file mode 100644
> index 0000000..ec906a2
> --- /dev/null
> +++ b/tests/spec/glx_ext_import_context/common.h
> @@ -0,0 +1,66 @@
> +/* 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 PFNGLXGETCURRENTDISPLAYEXTPROC __piglit_glXGetCurrentDisplayEXT;
> +#define glXGetCurrentDisplayEXT() (*__piglit_glXGetCurrentDisplayEXT)()
> +
> +extern PFNGLXQUERYCONTEXTINFOEXTPROC __piglit_glXQueryContextInfoEXT;
> +#define glXQueryContextInfoEXT(dpy, ctx, attrib, value) \
> +  (*__piglit_glXQueryContextInfoEXT)(dpy, ctx, attrib, value)
> +
> +extern PFNGLXGETCONTEXTIDEXTPROC __piglit_glXGetContextIDEXT;
> +#define glXGetContextIDEXT(ctx) (*__piglit_glXGetContextIDEXT)(ctx)
> +
> +extern PFNGLXIMPORTCONTEXTEXTPROC __piglit_glXImportContextEXT;
> +#define glXImportContextEXT(dpy, ctx) (*__piglit_glXImportContextEXT)(dpy, ctx)
> +
> +extern PFNGLXFREECONTEXTEXTPROC __piglit_glXFreeContextEXT;
> +#define glXFreeContextEXT(dpy, ctx) (*__piglit_glXFreeContextEXT)(dpy, ctx)
> +
> +extern Display *dpy;
> +extern XVisualInfo *visinfo;
> +extern GLXContext directCtx;
> +extern GLXContextID directID;
> +extern GLXContext indirectCtx;
> +extern GLXContextID indirectID;
> +extern int glx_error_code;
> +extern int x_error_code;
> +
> +extern void GLX_EXT_import_context_setup(void);
> +
> +extern void GLX_EXT_import_context_teardown(void);
> +
> +extern void GLX_EXT_import_context_setup_for_child(void);
> +
> +extern void get_context_IDs(void);
> +
> +enum context_mode {
> +	direct_rendering = 0,
> +	indirect_rendering,
> +	invalid
> +};
> +
> +extern bool validate_glx_error_code(int expected_x_error, int expected_glx_error);
> +
> +extern const char *context_mode_name(enum context_mode mode);
> +
> +extern bool try_import_context(GLXContextID id, enum context_mode mode);

Looks good otherwise.

-Brian


More information about the Piglit mailing list