Am 24.09.2018 um 15:56 schrieb Ian Romanick: > From: Ian Romanick <[email protected]> > > As people dig up other games, we can (and should) easily add them. > > Signed-off-by: Ian Romanick <[email protected]> > Cc: Federico Dossena <[email protected]> > Cc: Roland Scheidegger <[email protected]> > --- > 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 <[email protected]> > + */ > + "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); > +} > _______________________________________________ Piglit mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/piglit
