From: José Fonseca Date: Mon, 6 Dec 2010 18:50:52 +0000 (+0000) Subject: Handle uniform locations correctly. X-Git-Url: https://git.cworth.org/git?a=commitdiff_plain;h=8a844ae5c0f8a681d027678a2026894586e4e745;p=apitrace Handle uniform locations correctly. It requires a two-level table. --- diff --git a/glapi.py b/glapi.py index 2b66810..8d437e6 100644 --- a/glapi.py +++ b/glapi.py @@ -76,7 +76,7 @@ GLquery = Handle("query", GLuint) GLfenceNV = Handle("fenceNV", GLuint) GLprogram = Handle("program", GLuint) GLshader = Handle("shader", GLuint) -GLlocation = Handle("location", GLint) +GLlocation = Handle("location", GLint, key=('program', GLuint)) GLlocationARB = Handle("locationARB", GLint) GLprogramARB = Handle("programARB", GLuint) GLprogramEXT = Handle("programEXT", GLuint) diff --git a/glretrace.py b/glretrace.py index e047ed0..f8b425b 100644 --- a/glretrace.py +++ b/glretrace.py @@ -132,15 +132,18 @@ class GlRetracer(Retracer): if (function.name in self.pointer_function_names and arg.name == 'pointer' or function.name in self.draw_elements_function_names and arg.name == 'indices'): self.extract_pointer(function, arg, arg_type, lvalue, rvalue) - else: - Retracer.extract_arg(self, function, arg, arg_type, lvalue, rvalue) - - def extract_pointer(self, function, arg, arg_type, lvalue, rvalue): - print ' if (dynamic_cast(&%s)) {' % rvalue - print ' %s = 0;' % (lvalue) - print ' } else {' - print ' %s = (%s)(uintptr_t)(%s);' % (lvalue, arg_type, rvalue) - print ' }' + print ' if (dynamic_cast(&%s)) {' % rvalue + print ' %s = 0;' % (lvalue) + print ' } else {' + print ' %s = (%s)(uintptr_t)(%s);' % (lvalue, arg_type, rvalue) + print ' }' + return + + if function.name.startswith('glUniform') and function.args[0].name == arg.name == 'location': + print ' GLint program = -1;' + print ' glGetIntegerv(GL_CURRENT_PROGRAM, &program);' + + Retracer.extract_arg(self, function, arg, arg_type, lvalue, rvalue) if __name__ == '__main__': diff --git a/retrace.py b/retrace.py index 5326457..ea2377c 100644 --- a/retrace.py +++ b/retrace.py @@ -43,6 +43,14 @@ class ConstRemover(stdapi.Rebuilder): return stdapi.Opaque(expr) +def handle_entry(handle, value): + if handle.key is None: + return "__%s_map[%s]" % (handle.name, value) + else: + key_name, key_type = handle.key + return "__%s_map[%s][%s]" % (handle.name, key_name, value) + + class ValueExtractor(stdapi.Visitor): def visit_literal(self, literal, lvalue, rvalue): @@ -90,7 +98,7 @@ class ValueExtractor(stdapi.Visitor): print ' }' def visit_handle(self, handle, lvalue, rvalue): - self.visit(handle.type, lvalue, "__%s_map[%s]" %(handle.name, rvalue)); + self.visit(handle.type, lvalue, handle_entry(handle, rvalue)); print ' if (verbosity >= 2)' print ' std::cout << "%s " << static_cast<%s>(%s) << " <- " << %s << "\\n";' % (handle.name, handle.type, rvalue, lvalue) @@ -139,15 +147,20 @@ class ValueWrapper(stdapi.Visitor): def visit_handle(self, handle, lvalue, rvalue): if handle.range is None: - print " __{handle.name}_map[static_cast<{handle.type}>({rvalue})] = {lvalue};".format(**locals()) + rvalue = "static_cast<%s>(%s)" % (handle.type, rvalue) + entry = handle_entry(handle, rvalue) + print " %s = %s;" % (entry, lvalue) print ' if (verbosity >= 2)' - print ' std::cout << "{handle.name} " << static_cast<{handle.type}>({rvalue}) << " -> " << {lvalue} << "\\n";'.format(**locals()) + print ' std::cout << "{handle.name} " << {rvalue} << " -> " << {lvalue} << "\\n";'.format(**locals()) else: i = '__h' + handle.id + lvalue = "%s + %s" % (lvalue, i) + rvalue = "static_cast<%s>(%s) + %s" % (handle.type, rvalue, i) + entry = handle_entry(handle, rvalue) print ' for({handle.type} {i} = 0; {i} < {handle.range}; ++{i}) {{'.format(**locals()) - print ' __{handle.name}_map[static_cast<{handle.type}>({rvalue}) + {i}] = {lvalue} + {i};'.format(**locals()) + print ' {entry} = {lvalue};'.format(**locals()) print ' if (verbosity >= 2)' - print ' std::cout << "{handle.name} " << (static_cast<{handle.type}>({rvalue}) + {i}) << " -> " << ({lvalue} + {i}) << "\\n";'.format(**locals()) + print ' std::cout << "{handle.name} " << ({rvalue}) << " -> " << ({lvalue}) << "\\n";'.format(**locals()) print ' }' def visit_blob(self, blob, lvalue, rvalue): @@ -157,7 +170,6 @@ class ValueWrapper(stdapi.Visitor): pass - class Retracer: def retrace_function(self, function): @@ -256,7 +268,11 @@ class Retracer: handle_names = set() for handle in handles: if handle.name not in handle_names: - print 'static std::map<%s, %s> __%s_map;' % (handle.type, handle.type, handle.name) + if handle.key is None: + print 'static std::map<%s, %s> __%s_map;' % (handle.type, handle.type, handle.name) + else: + key_name, key_type = handle.key + print 'static std::map<%s, std::map<%s, %s> > __%s_map;' % (key_type, handle.type, handle.type, handle.name) handle_names.add(handle.name) print diff --git a/stdapi.py b/stdapi.py index 122b89f..79df2c3 100644 --- a/stdapi.py +++ b/stdapi.py @@ -109,11 +109,12 @@ class Pointer(Type): class Handle(Type): - def __init__(self, name, type, range=None): + def __init__(self, name, type, range=None, key=None): Type.__init__(self, type.expr, 'P' + type.id) self.name = name self.type = type self.range = range + self.key = key def visit(self, visitor, *args, **kwargs): return visitor.visit_handle(self, *args, **kwargs) @@ -434,7 +435,7 @@ class Rebuilder(Visitor): def visit_handle(self, handle): type = self.visit(handle.type) - return Handle(handle.name, type, handle.range) + return Handle(handle.name, type, range=handle.range, key=handle.key) def visit_alias(self, alias): type = self.visit(alias.type)