python/trace: Control the interpreter from command line options.
This commit is contained in:
@@ -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()
|
||||||
|
@@ -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()
|
||||||
|
Reference in New Issue
Block a user