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)
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<Trace::Null *>(&%s)) {' % rvalue
- print ' %s = 0;' % (lvalue)
- print ' } else {'
- print ' %s = (%s)(uintptr_t)(%s);' % (lvalue, arg_type, rvalue)
- print ' }'
+ print ' if (dynamic_cast<Trace::Null *>(&%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__':
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):
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)
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):
pass
-
class Retracer:
def retrace_function(self, function):
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
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)
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)