| --- piglit/framework/exectest.py 2013-01-17 16:03:17.677165077 -0800 |
| +++ piglit/framework/exectest.py 2013-01-17 17:17:40.666633122 -0800 |
| @@ -40,6 +40,13 @@ |
| ############################################################################# |
| |
| class ExecTest(Test): |
| + |
| + # Variables for tracking hangs and hardware acceleration status. |
| + software = False |
| + glxinfo = '' |
| + hangs = {} |
| + _HANGCHECK = 'drm:i915_hangcheck_elapsed' |
| + |
| def __init__(self, command): |
| Test.__init__(self) |
| self.command = command |
| @@ -56,6 +63,39 @@ |
| return out |
| |
| def run(self, valgrind): |
| + print "Command: " |
| + print self.command |
| + # Check if we are on software rendering (considered unrecoverable). |
| + if not self.software: |
| + cmd = 'DISPLAY=:0 glxinfo | grep "OpenGL renderer string"' |
| + proc = subprocess.Popen( |
| + cmd, |
| + stdout=subprocess.PIPE, |
| + shell=True |
| + ) |
| + self.glxinfo = proc.communicate()[0] |
| + if 'llvmpipe' in self.glxinfo.lower() or 'soft' in self.glxinfo.lower(): |
| + self.software = True |
| + # Don't run test if we are on software rendering. |
| + if self.software: |
| + results = {} |
| + results['result'] = 'skip' |
| + results['note'] = self.glxinfo |
| + print "Results:" |
| + print results |
| + return results |
| + # Make a dictionary of all hangs we have seen so far. |
| + cmd = 'dmesg | grep "' + self._HANGCHECK + '"' |
| + proc = subprocess.Popen( |
| + cmd, |
| + stdout=subprocess.PIPE, |
| + shell=True |
| + ) |
| + dmesg = proc.communicate()[0] |
| + for line in dmesg.split('\n'): |
| + if self._HANGCHECK in line: |
| + self.hangs[line] = line |
| + |
| fullenv = os.environ.copy() |
| for e in self.env: |
| fullenv[e] = str(self.env[e]) |
| @@ -159,6 +199,21 @@ |
| if 'result' not in results: |
| results['result'] = 'skip' |
| |
| + # Check for GPU hangs again and report the new ones. |
| + cmd = 'dmesg | grep "' + self._HANGCHECK + '"' |
| + proc = subprocess.Popen( |
| + cmd, |
| + stdout=subprocess.PIPE, |
| + shell=True |
| + ) |
| + dmesg = proc.communicate()[0] |
| + for line in dmesg.split('\n'): |
| + if self._HANGCHECK in line: |
| + if not line in self.hangs.keys(): |
| + results['note'] = 'Saw GPU hang during test. ' + line |
| + |
| + print "Results:" |
| + print results |
| return results |
| |
| def check_for_skip_scenario(self, command): |