[Piglit] [PATCH] all.py: filter directories traversed to find shader tests
Brian Paul
brianp at vmware.com
Fri Nov 10 04:18:10 UTC 2017
The script searches all files under tests/ and generated_tests/ for
files ending in ".shader_test". For each match, a ShaderTest() object
is created and added to the test list.
For GL extensions or versions not supported by the driver, this is
wasted effort.
This patch looks for directories under spec/ and tries to determine if
the extension/feature is actually supported by the current driver. If
not, it's skipped.
This, with other recent optimizations, reduces Piglit startup time for a
Windows VM from nearly 5 minutes to 45 seconds.
v2:
- replace os.path.walk() with my own walk_dir_tree() which avoids
decending into subdirs when the parent directory/feature is not supported.
- Use env var to enable/disable shader directory filtering
- Also, fix naming conventions and minor formatting issues.
v3:
- minor Piglit style changes, per Dylan
- handle ES cases in is_feature_directory_supported()
---
tests/all.py | 81 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 80 insertions(+), 1 deletion(-)
diff --git a/tests/all.py b/tests/all.py
index ae4a995..6c89d7a 100644
--- a/tests/all.py
+++ b/tests/all.py
@@ -13,7 +13,9 @@ import six
from six.moves import range
from framework import grouptools
+from framework.test import opengl
from framework import options
+from framework import wflinfo
from framework.profile import TestProfile
from framework.driver_classifier import DriverClassifier
from framework.test import (PiglitGLTest, GleanTest, PiglitBaseTest,
@@ -210,9 +212,86 @@ profile = TestProfile() # pylint: disable=invalid-name
shader_tests = collections.defaultdict(list)
+wfl_info = wflinfo.WflInfo()
+
+
+def gl_extension_supported(ext_name):
+ """Is the named OpenGL extension supported?"""
+ return ext_name in wfl_info.gl_extensions
+
+
+def is_feature_directory_supported(dir_name):
+ """Determine if dir_name specifies an OpenGL feature (extension or GL
+ version) which is supported by the host. If we return False, it means
+ the extension/version is definitely not supported. If we return True,
+ it means the extension/version is possibly suppported. We're a little
+ fuzzy because we don't yet parse all the directory name possibilities
+ (like ES tests).
+ """
+ if dir_name[:4] in {"amd_", "arb_", "ati_", "ext_", "khr_", "oes_"}:
+ # The directory is a GL extension name, but of the format "arb_foo_bar"
+ # instead of "GL_ARB_foo_bar". We convert the former into the later
+ # and check if the extension is supported.
+ ext_name = "GL_" + dir_name[0:4].upper() + dir_name[4:]
+ return gl_extension_supported(ext_name)
+ elif dir_name[:5] == "gles-":
+ # OpenGL ES test
+ version = dir_name[5:]
+ return float(version) <= float(wfl_info.gles_version)
+ elif dir_name[:8] == "glsl-es-":
+ # OpenGL ES shader test
+ version = dir_name[8:]
+ return float(version) <= float(wfl_info.glsl_es_version)
+ elif dir_name[:3] == "gl-":
+ # The directory is a GL version
+ version = dir_name[3:]
+ return float(version) <= float(wfl_info.gl_version)
+ elif dir_name[:5] == "glsl-":
+ # The directory is a GLSL version
+ version = dir_name[5:]
+ return float(version) <= float(wfl_info.glsl_version)
+ else:
+ # The directory is something else. Don't skip it.
+ return True
+
+
+def walk_filter_dir_tree(root):
+ """Recursively walk the directory tree rooted at 'root'.
+ If we find a directory path of the form ".../spec/foo/" we'll check if
+ 'foo' is a supported extension/feature/version. If not, we do not
+ traverse foo/. Otherwise, we add continue traversing.
+ The return value is a list of (dirpath, filename) tuples.
+ """
+ curdir = os.path.split(root)[1]
+ files = []
+ retval = []
+
+ for entry in os.listdir(root):
+ full_path = os.path.join(root, entry)
+ if os.path.isdir(full_path):
+ # Check if we're in a "spec/" direcotry
+ if curdir == "spec" and not is_feature_directory_supported(entry):
+ # The directory's tests aren't supported by the driver.
+ print("Skipping spec/{}".format(entry))
+ else:
+ # recursively walk the subdirectory
+ retval += walk_filter_dir_tree(full_path)
+ elif os.path.isfile(full_path):
+ # Add the file to the files list
+ files += [entry]
+
+ retval += [(root, [], files)]
+
+ return retval
+
+
# Find and add all shader tests.
for basedir in [TESTS_DIR, GENERATED_TESTS_DIR]:
- for dirpath, _, filenames in os.walk(basedir):
+ if os.environ.get("PIGLIT_FILTER_DIRECTORIES"):
+ files = walk_filter_dir_tree(basedir)
+ else:
+ files = os.walk(basedir)
+ for dirpath, _, filenames in files:
groupname = grouptools.from_path(os.path.relpath(dirpath, basedir))
for filename in filenames:
testname, ext = os.path.splitext(filename)
--
1.9.1
More information about the Piglit
mailing list