]> git.cworth.org Git - apitrace-tests/blobdiff - app_driver.py
Rename checker.py -> tracematch.py
[apitrace-tests] / app_driver.py
index 56d839cd89971e0229e8b38513953132960f9e0e..e5536b83729ffc4bbc8e84478295def6146e48ca 100755 (executable)
@@ -42,99 +42,96 @@ except ImportError:
     from StringIO import StringIO
 
 
+import tracematch
 from base_driver import *
 
 
-class TraceChecker:
+class RefTraceParser(tracematch.RefTraceParser):
 
-    def __init__(self, srcStream, refFileName, verbose=False):
-        self.srcStream = srcStream
-        self.refFileName = refFileName
-        if refFileName:
-            self.refStream = open(refFileName, 'rt')
-        else:
-            self.refStream = None
-        self.verbose = verbose
-        self.doubleBuffer = False
-        self.callNo = 0
-        self.refLine = ''
+    def __init__(self, fileName):
+        tracematch.RefTraceParser.__init__(self, open(fileName, 'rt'))
+        self.fileName = fileName
         self.images = []
         self.states = []
+        self.pragmaNo = 0
 
-    call_re = re.compile(r'^([0-9]+) (\w+)\(')
-
-    def check(self):
-
-        swapbuffers = 0
-        flushes = 0
-
-        srcLines = []
-        self.consumeRefLine()
-        for line in self.srcStream:
-            line = line.rstrip()
-            if self.verbose:
-                sys.stdout.write(line + '\n')
-            mo = self.call_re.match(line)
-            if mo:
-                self.callNo = int(mo.group(1))
-                function_name = mo.group(2)
-                if function_name.find('SwapBuffers') != -1 or \
-                   line.find('kCGLPFADoubleBuffer') != -1:
-                    swapbuffers += 1
-                if function_name in ('glFlush', 'glFinish'):
-                    flushes += 1
-                srcLine = line[mo.start(2):]
-            else:
-                srcLine = line
-            if self.refLine:
-                if srcLine == self.refLine:
-                    self.consumeRefLine()
-                    srcLines = []
-                else:
-                    srcLines.append(srcLine)
-
-        if self.refLine:
-            if srcLines:
-                fail('missing call `%s` (found `%s`)' % (self.refLine, srcLines[0]))
+    def handlePragma(self, line):
+        if self.calls:
+            lastCall = self.calls[-1]
+            if lastCall.callNo is None:
+                paramName = 'pragma%u' % self.pragmaNo
+                lastCall.callNo = tracematch.WildcardMatcher(paramName)
             else:
-                fail('missing call %s' % self.refLine)
-
-        if swapbuffers:
-            self.doubleBuffer = True
+                paramName = lastCall.callNo.name
         else:
-            self.doubleBuffer = False
+            paramName = 0
+            self.pragmaNo += 1
 
-    def consumeRefLine(self):
-        if not self.refStream:
-            self.refLine = ''
-            return
-
-        while True:
-            line = self.refStream.readline()
-            if not line:
-                break
-            line = line.rstrip()
-            if line.startswith('#'):
-                self.handlePragma(line)
-            else:
-                break
-        self.refLine = line
-
-    def handlePragma(self, line):
         pragma, rest = line.split(None, 1)
         if pragma == '#image':
             imageFileName = self.getAbsPath(rest)
-            self.images.append((self.callNo, imageFileName))
+            self.images.append((paramName, imageFileName))
         elif pragma == '#state':
             stateFileName = self.getAbsPath(rest)
-            self.states.append((self.callNo, stateFileName))
+            self.states.append((paramName, stateFileName))
         else:
             assert False
 
     def getAbsPath(self, path):
         '''Get the absolute from a path relative to the reference filename'''
-        return os.path.abspath(os.path.join(os.path.dirname(self.refFileName), path))
+        return os.path.abspath(os.path.join(os.path.dirname(self.fileName), path))
+
+
+class SrcTraceParser(tracematch.SrcTraceParser):
+
+    def __init__(self, stream):
+        tracematch.SrcTraceParser.__init__(self, stream)
+        self.swapbuffers = 0
 
+    def handleCall(self, callNo, functionName, args, ret):
+        tracematch.SrcTraceParser.handleCall(self, callNo, functionName, args, ret)
+
+        if functionName.find('SwapBuffers') != -1 or \
+           repr(args).find('kCGLPFADoubleBuffer') != -1:
+            self.swapbuffers += 1
+
+
+class TraceChecker:
+
+    def __init__(self, srcStream, refFileName):
+        self.srcStream = srcStream
+        self.refFileName = refFileName
+        self.doubleBuffer = False
+        self.callNo = 0
+        self.images = []
+        self.states = []
+
+    def check(self):
+        srcParser = SrcTraceParser(self.srcStream)
+        srcTrace = srcParser.parse()
+        self.doubleBuffer = srcParser.swapbuffers > 0
+
+        if self.refFileName:
+            refParser = RefTraceParser(self.refFileName)
+            refTrace = refParser.parse()
+
+            try:
+                mo = refTrace.match(srcTrace)
+            except tracematch.TraceMismatch, ex:
+                self.fail(str(ex))
+
+            for paramName, imageFileName in refParser.images:
+                if isinstance(paramName, int):
+                    callNo = paramName
+                else:
+                    callNo = mo.params[paramName]
+                self.images.append((callNo, imageFileName))
+            for paramName, stateFileName in refParser.states:
+                if isinstance(paramName, int):
+                    callNo = paramName
+                else:
+                    callNo = mo.params[paramName]
+                self.states.append((callNo, stateFileName))
 
 
 class AppDriver(Driver):
@@ -167,7 +164,7 @@ class AppDriver(Driver):
 
         p = popen(self.cmd, cwd=self.cwd)
         p.wait()
-        if p.returncode:
+        if p.returncode != 0:
             skip('application returned code %i' % p.returncode)
 
     api_trace_map = {
@@ -189,7 +186,12 @@ class AppDriver(Driver):
         'egl_gl': 'eglretrace',
         'egl_gles1': 'eglretrace',
         'egl_gles2': 'eglretrace',
+        #'d3d8': 'd3dretrace',
         'd3d9': 'd3dretrace',
+        'd3d10': 'd3dretrace',
+        'd3d10_1': 'd3dretrace',
+        'd3d11': 'd3dretrace',
+        'd3d11_1': 'd3dretrace',
     }
 
     def traceApp(self):
@@ -226,6 +228,8 @@ class AppDriver(Driver):
 
         p = popen(cmd, env=env, cwd=self.cwd)
         p.wait()
+        if p.returncode != 0:
+            fail('`apitrace trace` returned code %i' % p.returncode)
 
         if not os.path.exists(self.trace_file):
             fail('no trace file generated\n')
@@ -234,7 +238,7 @@ class AppDriver(Driver):
         cmd = [options.apitrace, 'dump', '--color=never', self.trace_file]
         p = popen(cmd, stdout=subprocess.PIPE)
 
-        checker = TraceChecker(p.stdout, self.ref_dump, self.verbose)
+        checker = TraceChecker(p.stdout, self.ref_dump)
         checker.check()
         p.wait()
         if p.returncode != 0:
@@ -373,19 +377,9 @@ class AppDriver(Driver):
         except KeyError:
             return
 
-        # On NVIDIA drivers glGetIntegerv(GL_INDEX_WRITEMASK) returns -1
+        # On NVIDIA drivers glGetIntegerv(GL_INDEX_WRITEMASK) returns 255
         self.replaceState(parameters, 'GL_INDEX_WRITEMASK', 255, -1)
 
-        # On Gallium 
-        if 'Gallium' in parameters['GL_RENDERER'].split():
-            # Gallium drivers have wrong defaults for draw/read buffer state
-            self.replaceState(parameters, 'GL_DRAW_BUFFER', 'GL_BACK_LEFT', 'GL_BACK')
-            self.replaceState(parameters, 'GL_DRAW_BUFFER0', 'GL_BACK_LEFT', 'GL_BACK')
-            self.replaceState(parameters, 'GL_READ_BUFFER', 'GL_BACK_LEFT', 'GL_BACK')
-            self.replaceState(parameters, 'GL_DRAW_BUFFER', 'GL_FRONT_LEFT', 'GL_FRONT')
-            self.replaceState(parameters, 'GL_DRAW_BUFFER0', 'GL_FRONT_LEFT', 'GL_FRONT')
-            self.replaceState(parameters, 'GL_READ_BUFFER', 'GL_FRONT_LEFT', 'GL_FRONT')
-
     def adjustRefState(self, state):
         # Do some adjustments on reference state to eliminate failures from
         # bugs/issues outside of apitrace
@@ -417,7 +411,8 @@ class AppDriver(Driver):
 
     def _retrace(self, args = None, stdout=subprocess.PIPE):
         retrace = self.api_retrace_map[self.api]
-        cmd = [get_build_program(retrace)]
+        #cmd = [get_build_program(retrace)]
+        cmd = [options.apitrace, 'retrace']
         if self.doubleBuffer:
             cmd += ['-db']
         else: