X-Git-Url: https://git.cworth.org/git?p=apitrace-tests;a=blobdiff_plain;f=driver.py;h=9894c9c80447cc806401361b9bf497b8fc4267ab;hp=dcf64dac1fbfa8c819ac655d0ff971d0d3231aeb;hb=25dbf53f26766ce9ff3adea306cbd0996b45574a;hpb=2c1f5e25cb70c1586389d48206cdb4fc4d18fba9 diff --git a/driver.py b/driver.py index dcf64da..9894c9c 100755 --- a/driver.py +++ b/driver.py @@ -140,7 +140,7 @@ class TraceChecker: sys.stdout.write(line + '\n') mo = self.call_re.match(line) if mo: - self.call_no = int(mo.group(1)) + self.callNo = int(mo.group(1)) function_name = mo.group(2) if function_name.find('SwapBuffers') != -1 or \ line.find('kCGLPFADoubleBuffer') != -1: @@ -310,6 +310,7 @@ class TestCase: if not match: prefix = '%s.%u' % (self.getNamePrefix(), callNo) srcImageFileName = prefix + '.src.png' + srcImage.save(srcImageFileName) diffImageFileName = prefix + '.diff.png' comparer.write_diff(diffImageFileName) fail('snapshot from call %u does not match %s' % (callNo, refImageFileName)) @@ -332,13 +333,11 @@ class TestCase: differ.visit(refState, srcState) fail('state from call %u does not match %s' % (callNo, refStateFileName)) - # Allo non-standard JS comments in JSON - json_comment_re = re.compile(r'//.*$', re.MULTILINE) - def getRefState(self, refStateFileName): - data = open(refStateFileName, 'rt').read() - data = self.json_comment_re.sub('', data) - return json.loads(data, strict=False) + stream = open(refStateFileName, 'rt') + from jsondiff import load + state = load(stream) + return state def getNamePrefix(self): name = os.path.basename(self.ref_dump) @@ -398,10 +397,63 @@ class TestCase: if p.returncode != 0: fail('retrace returned code %i' % (p.returncode)) + self.adjustSrcState(state) + self.stateCache[callNo] = state return state + def adjustSrcState(self, state): + # Do some adjustments on the obtained state to eliminate failures from + # bugs/issues outside of apitrace + + try: + parameters = state['parameters'] + except KeyError: + return + + # On NVIDIA drivers glGetIntegerv(GL_INDEX_WRITEMASK) returns -1 + 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 + + try: + parameters = state['parameters'] + except KeyError: + return + + if platform.system() == 'Darwin' or True: + # Mac OS X drivers fail on GL_COLOR_SUM + # XXX: investigate this + self.removeState(parameters, 'GL_COLOR_SUM') + + def replaceState(self, obj, key, srcValue, dstValue): + try: + value = obj[key] + except KeyError: + pass + else: + if value == srcValue: + obj[key] = dstValue + + def removeState(self, obj, key): + try: + del obj[key] + except KeyError: + pass + def _retrace(self, args = None, stdout=subprocess.PIPE): retrace = self.api_map[self.api] + 'retrace' cmd = [_get_build_program(retrace)]