[Piglit] [PATCH] Add tests for GL_EXTENSION_STRING vs. old idTech2 / idTech3 games

Roland Scheidegger sroland at vmware.com
Mon Sep 24 20:24:56 UTC 2018


Am 24.09.2018 um 15:56 schrieb Ian Romanick:
> From: Ian Romanick <ian.d.romanick at intel.com>
> 
> As people dig up other games, we can (and should) easily add them.
> 
> Signed-off-by: Ian Romanick <ian.d.romanick at intel.com>
> Cc: Federico Dossena <info at fdossena.com>
> Cc: Roland Scheidegger <sroland at vmware.com>
> ---
>  tests/general/CMakeLists.gl.txt          |   1 +
>  tests/general/idtech-extension-strings.c | 149 +++++++++++++++++++++++++++++++
>  2 files changed, 150 insertions(+)
>  create mode 100644 tests/general/idtech-extension-strings.c
> 
> diff --git a/tests/general/CMakeLists.gl.txt b/tests/general/CMakeLists.gl.txt
> index ceec9f0b6..83189fc42 100644
> --- a/tests/general/CMakeLists.gl.txt
> +++ b/tests/general/CMakeLists.gl.txt
> @@ -65,6 +65,7 @@ if (UNIX)
>  	target_link_libraries (hiz m)
>  endif (UNIX)
>  piglit_add_executable (early-z early-z.c)
> +piglit_add_executable (idtech-extension-strings idtech-extension-strings.c)
>  piglit_add_executable (infinite-spot-light infinite-spot-light.c)
>  piglit_add_executable (isbufferobj isbufferobj.c)
>  piglit_add_executable (linestipple linestipple.c)
> diff --git a/tests/general/idtech-extension-strings.c b/tests/general/idtech-extension-strings.c
> new file mode 100644
> index 000000000..cff54416b
> --- /dev/null
> +++ b/tests/general/idtech-extension-strings.c
> @@ -0,0 +1,149 @@
> +/*
> + * Copyright © 2018 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.
> + *
> + */
> +
> +/**
> + * \file idtech-extensoin-strings.c
extension


> + * Verify extensions used by idTech2 and idTech3 games occur in the first 4k
> + *
> + * For a long time idTech2- and idTech3-based games contained a bug in
> + * extension string handling.  The engine would copy the extension string
> + * returned by the driver into a 4k buffer.  The engine would not be able to
> + * detect the existence of any extensions that occured after the 4k boundry.
boundary



> + *
> + * For a variety of known games, this test verifies that extensions known to
> + * be used by each game occurs below the 4k boundry.
> + *
> + * A 2011 Wine bug
> + * (https://na01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fwww.winehq.org%2Fpipermail%2Fwine-bugs%2F2011-June%2F280463.html&data=02%7C01%7Csroland%40vmware.com%7Cc108d7c276d7454160cb08d6222598df%7Cb39138ca3cee4b4aa4d6cd83d9dd62f0%7C1%7C0%7C636733942205163850&sdata=niqmepi%2BsBkOooa%2BefO3ZNI9z847n2SB4b88tbeNUsA%3D&reserved=0) suggests
> + * that the limit for at least Return to Castle Wofenstein is 4k.  Some other
> + * evidence suggests that other games may have limits as low as 2k.
> + */
> +#include "piglit-util-gl.h"
> +
> +PIGLIT_GL_TEST_CONFIG_BEGIN
> +
> +	config.supports_gl_compat_version = 10;
> +
> +	config.window_visual = PIGLIT_GL_VISUAL_RGB;
> +
> +PIGLIT_GL_TEST_CONFIG_END
> +
> +enum piglit_result
> +piglit_display(void)
> +{
> +	/* UNREACHABLE */
> +	return PIGLIT_FAIL;
> +}
> +
> +/* List of extensions scraped from the Quake3 demo found in
> + * linuxq3ademo-1.11-6.x86.gz.sh.  The Return to Castle Wolfenstein demo found
> + * in wolfspdemo-linux-1.1b.x86.run had the same list.
> + */
> +const char *const q3demo_list[] = {
> +	"GL_S3_s3tc",
> +	"GL_EXT_texture_env_add",
> +	"GL_ARB_multitexture",
> +	"GL_EXT_compiled_vertex_array",
> +};
> +
> +/* List of extensions used by the game "Star Trek Voyager" provided by
> + * Federico Dossena.
> + */
> +const char *const star_trek_voyager_list[] = {
> +	"GL_S3_s3tc",
> +	"GL_EXT_texture_compression_s3tc",
> +	"GL_EXT_texture_env_add"
> +	"GL_EXT_texture_filter_anisotropic",
> +	"GL_EXT_texture_edge_clamp",
> +	"GL_ARB_multitexture",
> +	"GL_EXT_compiled_vertex_array",
> +
> +	/* GL_ARB_texture_compression wasn't listed in the output of the
> +	 * application, but since GL_EXT_texture_compression_s3tc is layered
> +	 * on top of it, it really should check for it too...
Well, it can safely omit such a check - since EXT_tc_s3tc can't be
present if ARB_tc isn't present...
That said, indeed it's probably a good idea to put this in this list
here too (who knows if some id tech 3 game DOES check for it too...).

Otherwise looks alright to me. Although I'm not sure it's worth
bothering about 2 separate lists.
And I think we really should enforce the 2k limit instead.
The evidence for Star Trek Elite Force using only a 2kB buffer is quite
overwhelming (not only is the printed out string cut right there, I'm
also near certain with llvmpipe 4kB would have been (just) enough for
EXT_compiled_vertex_array, which it didn't find neither).

Roland

Reviewed-by: Roland Scheidegger <sroland at vmware.com>


> +	 */
> +	"GL_ARB_texture_compression",
> +};
> +
> +static bool
> +check_extension_list(const char *application_name,
> +		     const char *extension_string,
> +		     const char *const list[],
> +		     unsigned num_extensions)
> +{
> +	bool pass = true;
> +
> +	for (unsigned i = 0; i < num_extensions; i++) {
> +		const unsigned len = strlen(list[i]);
> +		const char *ptr = strstr(extension_string, list[i]);
> +
> +		while (ptr != NULL && ptr[len] != '\0' && ptr[len] != ' ')
> +			ptr = strstr(ptr + len, list[i]);
> +
> +		if (ptr == NULL) {
> +			if (!piglit_automatic) {
> +				printf("Extension %s is not supported.\n",
> +				       list[i]);
> +			}
> +
> +			continue;
> +		}
> +
> +		const ptrdiff_t offset = (ptr - extension_string) + len;
> +		if (offset >= 4096) {
> +			printf("Extension %s is at offset %ld.  Too far!\n",
> +			       list[i], (long) offset);
> +			pass = false;
> +		} else if (!piglit_automatic) {
> +			printf("Extension %s is at offset %ld.\n",
> +			       list[i], (long) offset);
> +		}
> +	}
> +
> +	piglit_report_subtest_result(pass ? PIGLIT_PASS : PIGLIT_FAIL,
> +				     application_name);
> +	return pass;
> +}
> +
> +void
> +piglit_init(int argc, char **argv)
> +{
> +	bool pass = true;
> +	const char *const extension_string =
> +		(const char *) glGetString(GL_EXTENSIONS);
> +
> +	pass = check_extension_list("linuxq3ademo-1.11-6.x86.gz.sh",
> +				    extension_string,
> +				    q3demo_list,
> +				    ARRAY_SIZE(q3demo_list))
> +		&& pass;
> +
> +	pass = check_extension_list("Star Trek: Voyager - Elite Force",
> +				    extension_string,
> +				    star_trek_voyager_list,
> +				    ARRAY_SIZE(star_trek_voyager_list))
> +		&& pass;
> +
> +	piglit_report_result(pass ? PIGLIT_PASS : PIGLIT_FAIL);
> +}
> 



More information about the Piglit mailing list