[Piglit] [PATCH 1/3] framework: Add a driver classifier based on the renderer string.
Eric Anholt
eric at anholt.net
Wed Sep 14 10:03:29 UTC 2016
For the apitrace test runner, I need to be able to store known-good
images for various drivers, which means I need some way to group
drivers. Not all Mesa drivers we care about are covered here, but
this is a sample to get things started.
v2: Apply feedback from Dylan, add classification for my Skylake.
---
framework/driver_classifier.py | 121 ++++++++++++++++++++++++++
unittests/framework/test_driver_classifier.py | 60 +++++++++++++
2 files changed, 181 insertions(+)
create mode 100644 framework/driver_classifier.py
create mode 100644 unittests/framework/test_driver_classifier.py
diff --git a/framework/driver_classifier.py b/framework/driver_classifier.py
new file mode 100644
index 000000000000..af25665ef42d
--- /dev/null
+++ b/framework/driver_classifier.py
@@ -0,0 +1,121 @@
+# Copyright (c) 2016 Broadcom
+#
+# 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.
+
+from __future__ import (
+ absolute_import, division, print_function, unicode_literals
+)
+import re
+import subprocess
+
+__all__ = [
+ 'DriverClassifier',
+]
+
+class DriverClassifier(object):
+ def __init__(self):
+ self.categories = []
+
+ self.collect_driver_info()
+ self.find_categories()
+
+
+ def collect_driver_info(self):
+ """Method for collecting the GL driver renderer string.
+
+ Currently only glxinfo is used.
+ """
+ self.renderer = ''
+
+ self.collect_glxinfo()
+
+
+ def collect_glxinfo(self):
+ """Calls glxinfo and parses the output to find the GL driver
+
+ vendor/renderer strings.
+ """
+
+ try:
+ output = subprocess.check_output(['glxinfo'],
+ stderr=subprocess.STDOUT)
+ except OSError as e:
+ if e.errno not in [errno.ENOENT, errno.EACCES]:
+ raise
+ return
+ except subprocess.CalledProcessError:
+ return
+
+ for line in output.splitlines():
+ m = re.match('OpenGL renderer string: (.*)', line)
+ if m is not None:
+ self.renderer = m.group(1)
+ break
+
+
+ def find_categories(self):
+ """Parses the vendor/renderer strings to decide what categories
+
+ the driver falls under.
+ """
+ if self.renderer.startswith(('Mesa ', 'Gallium ')):
+ self.categories.append('mesa')
+
+ m = re.match('.* VC4(.*)', self.renderer)
+ if m is not None:
+ self.categories.append('vc4')
+ m = re.match(' V3D ([0-9])+\.([0-9])+', m.group(1))
+ if m is not None:
+ self.categories.append('vc4-{}.{}'.format(m.group(1),
+ m.group(2)))
+
+ m = re.match('Mesa DRI R200 ', self.renderer)
+ if m is not None:
+ self.categories.append('r200')
+
+ m = re.match('Mesa DRI Intel[^ ]* (.*)', self.renderer)
+ if m is not None:
+ tail = m.group(1)
+
+ i965_chipdict = {
+ '965': 'brw',
+ '946': 'brw',
+ '.*[GQ]4[35]': 'g4x',
+ 'Ironlake': 'ilk',
+ 'Sandybridge': 'snb',
+ 'Ivybridge': 'ivb',
+ 'Haswell': 'hsw',
+ 'Baytrail': 'byt',
+ 'Broadwell': 'bdw',
+ 'Skylake': 'skl',
+ 'HD Graphics .* \(Skylake': 'skl',
+ 'Kabylake': 'kbl',
+ '.*Cherryview': 'chv',
+ '.*Broxton': 'bxt',
+ }
+
+ for chip, abbrev in i965_chipdict.items():
+ m = re.match(chip, tail)
+ if m is not None:
+ self.categories.append('i965')
+ self.categories.append('i965-{}'.format(abbrev))
+ break
+
+ self.categories.reverse()
diff --git a/unittests/framework/test_driver_classifier.py b/unittests/framework/test_driver_classifier.py
new file mode 100644
index 000000000000..a4b043a13ad6
--- /dev/null
+++ b/unittests/framework/test_driver_classifier.py
@@ -0,0 +1,60 @@
+# Copyright (c) 2016 Broadcom
+#
+# 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.
+
+import pytest
+import six
+from framework import driver_classifier
+
+class DriverClassifierTester(driver_classifier.DriverClassifier):
+ """Test class for the driver classifier, taking in a fixed
+
+ renderer string instead of calling glxinfo.
+ """
+
+ def __init__(self, renderer):
+ self.override_renderer = renderer
+ super(DriverClassifierTester, self).__init__()
+
+
+ def collect_driver_info(self):
+ self.renderer = self.override_renderer
+
+
+class TestDriverClassifier(object):
+ """Tests for the DriverClassifier class."""
+
+ @pytest.mark.parametrize(
+ "renderer, categories",
+ [
+ ('Mesa DRI Intel(R) Haswell Mobile', ['i965-hsw', 'i965', 'mesa']),
+ ('Mesa DRI Intel(R) HD Graphics 530 (Skylake GT2)', ['i965-skl', 'i965', 'mesa']),
+ # Old VC4 string
+ ('Gallium 0.4 on VC4', ['vc4', 'mesa']),
+ # Modern VC4 string
+ ('Gallium 0.4 on VC4 V3D 2.1', ['vc4-2.1', 'vc4', 'mesa']),
+ ],
+ ids=six.text_type)
+ def test_renderer_categorization(self, renderer, categories):
+ """Test that when given a certain renderer string, the correct
+
+ categories list comes back.
+ """
+ assert DriverClassifierTester(renderer).categories == categories
--
2.9.3
More information about the Piglit
mailing list