Quoting Eric Anholt (2016-08-22 18:41:34) > 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. > --- > framework/driver_classifier.py | 126 > ++++++++++++++++++++++++++ > unittests/framework/test_driver_classifier.py | 59 ++++++++++++ > 2 files changed, 185 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..e35c40c5f3fd > --- /dev/null > +++ b/framework/driver_classifier.py > @@ -0,0 +1,126 @@ > +# 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 re, subprocess
Style nit: Generally we import modules one per line, things from modules
on in a single line,
ex:
import os
import re
from framework.grouptools import join, split
Also, you need to import errno, since you're using it.
Finally, can you copy the 'from __future__ import (...' from one of the
other modules?
> +
> +__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:
> + if e.errno not in [errno.ENOENT, errno.EACCES]:
> + raise
The if statement above looks like a copy-and-paste error
> + return
> +
> + for line in output.splitlines():
> + m = re.match('OpenGL renderer string: (.*)', line)
> + if m is not None:
> + self.renderer = m.group(1)
> + break
I wonder if we can share some of the code in core.collect_system_info
for some of this work? Obviously this does more work than just
collecting the contents of glxinfo. Maybe extend collect_system_info to
take a parameter?
> +
> +
> + 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',
> + '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()
> +
> +
> + def get_categories(self):
> +
> + """Returns a list of the driver's categories, from most specific
> + specific to least specific."""
> +
> + return self.categories
I don't know that this method is all that valuable, since categories is
already a public attribute.
> diff --git a/unittests/framework/test_driver_classifier.py
> b/unittests/framework/test_driver_classifier.py
> new file mode 100644
> index 000000000000..e846be996d37
> --- /dev/null
> +++ b/unittests/framework/test_driver_classifier.py
> @@ -0,0 +1,59 @@
> +# Copyright © 2016 Broadcom
you either need to adding an encoding string above this line
('# encoding=utf-8' will work), or replace the copyright symbol with (c)
or similar
> +#
> +# 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']),
> + # 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).get_categories() ==
> categories
> --
> 2.9.3
Thanks for writing tests, I really appreciate that a lot.
>
> _______________________________________________
> Piglit mailing list
> [email protected]
> https://lists.freedesktop.org/mailman/listinfo/piglit
signature.asc
Description: signature
_______________________________________________ Piglit mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/piglit
