From: Cass Everitt Date: Thu, 20 Jun 2013 00:30:32 +0000 (-0500) Subject: glretrace: swizzle locations into uniform arrays. X-Git-Url: https://git.cworth.org/git?a=commitdiff_plain;h=3b595cb6b1f5a7a93ceb17cfe0b9785ebfb992c6;p=apitrace glretrace: swizzle locations into uniform arrays. Where slot number is inferred. Fixes issue #139. v2: Prevent dereference of end() iterator -- Jose --- diff --git a/retrace/retrace.py b/retrace/retrace.py index aa20364..25fa62a 100644 --- a/retrace/retrace.py +++ b/retrace/retrace.py @@ -40,12 +40,15 @@ class UnsupportedType(Exception): pass -def lookupHandle(handle, value): +def lookupHandle(handle, value, lval=False): 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) + if handle.name == "location" and lval == False: + return "_location_map[%s].lookupUniformLocation(%s)" % (key_name, value) + else: + return "_%s_map[%s][%s]" % (handle.name, key_name, value) class ValueAllocator(stdapi.Visitor): @@ -286,7 +289,7 @@ class SwizzledValueRegistrator(stdapi.Visitor, stdapi.ExpanderMixin): OpaqueValueDeserializer().visit(handle.type, '_origResult', rvalue); if handle.range is None: rvalue = "_origResult" - entry = lookupHandle(handle, rvalue) + entry = lookupHandle(handle, rvalue, True) if (entry.startswith('_program_map') or entry.startswith('_shader_map')): print 'if (glretrace::supportsARBShaderObjects) {' print ' _handleARB_map[%s] = %s;' % (rvalue, lvalue) diff --git a/retrace/retrace_swizzle.hpp b/retrace/retrace_swizzle.hpp index 42e5bf6..f013b6a 100644 --- a/retrace/retrace_swizzle.hpp +++ b/retrace/retrace_swizzle.hpp @@ -74,6 +74,27 @@ public: } return it->second; } + + /* + * Handle situations where the application declares an array like + * + * uniform vec4 myMatrix[4]; + * + * then calls glGetUniformLocation(..., "myMatrix") and then infer the slot + * numbers rather than explicitly calling glGetUniformLocation(..., + * "myMatrix[0]"), etc. + */ + T lookupUniformLocation(const T &key) { + typename base_type::const_iterator it; + it = base.upper_bound(key); + if (it != base.begin()) { + --it; + } else { + return (base[key] = key); + } + T t = it->second + (key - it->first); + return t; + } }; @@ -100,3 +121,4 @@ toObjPointer(trace::Call &call, trace::Value &value); } /* namespace retrace */ #endif /* _RETRACE_SWIZZLE_HPP_ */ +