python/trace: Control the interpreter from command line options.

This commit is contained in:
José Fonseca
2009-03-25 13:31:27 +00:00
parent 5743483778
commit 9d97c3d0be
2 changed files with 80 additions and 40 deletions

View File

@@ -75,15 +75,6 @@ def show_image(surface):
root.mainloop() root.mainloop()
# Verbosity level: 0, 1, 2
verbose = 1
# Dump images to disk instead of showing: True, False
images = False
image_no = 0
class Struct: class Struct:
"""C-like struct""" """C-like struct"""
@@ -381,7 +372,7 @@ class Context(Object):
self.real.set_clip(_state) self.real.set_clip(_state)
def dump_constant_buffer(self, buffer): def dump_constant_buffer(self, buffer):
if verbose < 2: if not self.interpreter.verbosity(2):
return return
data = buffer.read() data = buffer.read()
@@ -447,7 +438,7 @@ class Context(Object):
pass pass
def dump_vertices(self, start, count): def dump_vertices(self, start, count):
if verbose < 2: if not self.interpreter.verbosity(2):
return return
for index in range(start, start + count): for index in range(start, start + count):
@@ -474,7 +465,7 @@ class Context(Object):
sys.stdout.write('\t},\n') sys.stdout.write('\t},\n')
def dump_indices(self, ibuf, isize, start, count): def dump_indices(self, ibuf, isize, start, count):
if verbose < 2: if not self.interpreter.verbosity(2):
return return
format = { format = {
@@ -506,51 +497,48 @@ class Context(Object):
self.dump_vertices(start, count) self.dump_vertices(start, count)
self.real.draw_arrays(mode, start, count) self.real.draw_arrays(mode, start, count)
self._set_dirty()
self.dirty = True
def draw_elements(self, indexBuffer, indexSize, mode, start, count): def draw_elements(self, indexBuffer, indexSize, mode, start, count):
if verbose >= 2: if self.interpreter.verbosity(2):
minindex, maxindex = self.dump_indices(indexBuffer, indexSize, start, count) minindex, maxindex = self.dump_indices(indexBuffer, indexSize, start, count)
self.dump_vertices(minindex, maxindex - minindex) self.dump_vertices(minindex, maxindex - minindex)
self.real.draw_elements(indexBuffer, indexSize, mode, start, count) self.real.draw_elements(indexBuffer, indexSize, mode, start, count)
self._set_dirty()
self.dirty = True
def draw_range_elements(self, indexBuffer, indexSize, minIndex, maxIndex, mode, start, count): def draw_range_elements(self, indexBuffer, indexSize, minIndex, maxIndex, mode, start, count):
if verbose >= 2: if self.interpreter.verbosity(2):
minindex, maxindex = self.dump_indices(indexBuffer, indexSize, start, count) minindex, maxindex = self.dump_indices(indexBuffer, indexSize, start, count)
minindex = min(minindex, minIndex) minindex = min(minindex, minIndex)
maxindex = min(maxindex, maxIndex) maxindex = min(maxindex, maxIndex)
self.dump_vertices(minindex, maxindex - minindex) self.dump_vertices(minindex, maxindex - minindex)
self.real.draw_range_elements(indexBuffer, indexSize, minIndex, maxIndex, mode, start, count) self.real.draw_range_elements(indexBuffer, indexSize, minIndex, maxIndex, mode, start, count)
self._set_dirty()
def _set_dirty(self):
if self.interpreter.options.step:
self._present()
else:
self.dirty = True self.dirty = True
def flush(self, flags): def flush(self, flags):
self.real.flush(flags) self.real.flush(flags)
if self.dirty: if self.dirty:
if flags & gallium.PIPE_FLUSH_FRAME: if flags & gallium.PIPE_FLUSH_FRAME:
self._update() self._present()
self.dirty = False self.dirty = False
return None return None
def clear(self, surface, value): def clear(self, surface, value):
self.real.surface_clear(surface, value) self.real.surface_clear(surface, value)
def _update(self): def _present(self):
self.real.flush() self.real.flush()
if self.cbufs and self.cbufs[0]: if self.cbufs and self.cbufs[0]:
if images: self.interpreter.present(self.cbufs[0], "cbuf")
global image_no
image_no += 1
filename = 'cbuf_%04u.png' % image_no
save_image(filename, self.cbufs[0])
else:
show_image(self.cbufs[0])
class Interpreter(parser.TraceDumper): class Interpreter(parser.TraceDumper):
@@ -561,11 +549,13 @@ class Interpreter(parser.TraceDumper):
('pipe_screen', 'get_paramf'), ('pipe_screen', 'get_paramf'),
)) ))
def __init__(self, stream): def __init__(self, stream, options):
parser.TraceDumper.__init__(self, stream) parser.TraceDumper.__init__(self, stream)
self.options = options
self.objects = {} self.objects = {}
self.result = None self.result = None
self.globl = Global(self, None) self.globl = Global(self, None)
self.image_no = 0
def register_object(self, address, object): def register_object(self, address, object):
self.objects[address] = object self.objects[address] = object
@@ -586,7 +576,7 @@ class Interpreter(parser.TraceDumper):
if (call.klass, call.method) in self.ignore_calls: if (call.klass, call.method) in self.ignore_calls:
return return
if verbose >= 1: if self.verbosity(1):
parser.TraceDumper.handle_call(self, call) parser.TraceDumper.handle_call(self, call)
args = [self.interpret_arg(arg) for name, arg in call.args] args = [self.interpret_arg(arg) for name, arg in call.args]
@@ -607,6 +597,32 @@ class Interpreter(parser.TraceDumper):
translator = Translator(self) translator = Translator(self)
return translator.visit(node) return translator.visit(node)
def verbosity(self, level):
return self.options.verbosity >= level
def present(self, surface, description):
if self.options.images:
self.image_no += 1
filename = '%s_%04u.png' % (description, self.image_no)
save_image(filename, surface)
else:
show_image(surface)
class Main(parser.Main):
def get_optparser(self):
optparser = parser.Main.get_optparser(self)
optparser.add_option("-q", "--quiet", action="store_const", const=0, dest="verbosity", help="no messages")
optparser.add_option("-v", "--verbose", action="count", dest="verbosity", default=1, help="increase verbosity level")
optparser.add_option("-i", "--images", action="store_true", dest="images", default=False, help="save images instead of showing them")
optparser.add_option("-s", "--step", action="store_true", dest="step", default=False, help="step trhough every draw")
return optparser
def process_arg(self, stream, options):
parser = Interpreter(stream, options)
parser.parse()
if __name__ == '__main__': if __name__ == '__main__':
parser.main(Interpreter) Main().main()

View File

@@ -30,6 +30,7 @@
import sys import sys
import xml.parsers.expat import xml.parsers.expat
import binascii import binascii
import optparse
from model import * from model import *
@@ -342,16 +343,39 @@ class TraceDumper(TraceParser):
self.formatter.newline() self.formatter.newline()
def main(ParserFactory): class Main:
for arg in sys.argv[1:]: '''Common main class for all retrace command line utilities.'''
def __init__(self):
pass
def main(self):
optparser = self.get_optparser()
(options, args) = optparser.parse_args(sys.argv[1:])
if args:
for arg in args:
if arg.endswith('.gz'): if arg.endswith('.gz'):
import gzip from gzip import GzipFile
stream = gzip.GzipFile(arg, 'rt') stream = GzipFile(arg, 'rt')
elif arg.endswith('.bz2'):
from bz2 import BZ2File
stream = BZ2File(arg, 'rt')
else: else:
stream = open(arg, 'rt') stream = open(arg, 'rt')
parser = ParserFactory(stream) self.process_arg(stream, options)
else:
self.process_arg(stream, options)
def get_optparser(self):
optparser = optparse.OptionParser(
usage="\n\t%prog [options] [traces] ...")
return optparser
def process_arg(self, stream, options):
parser = TraceDumper(stream)
parser.parse() parser.parse()
if __name__ == '__main__': if __name__ == '__main__':
main(TraceDumper) Main().main()