]> git.cworth.org Git - apitrace/commitdiff
Factor the proc address wrapping into gltrace.py
authorJosé Fonseca <jose.r.fonseca@gmail.com>
Sun, 15 Apr 2012 13:33:00 +0000 (14:33 +0100)
committerJosé Fonseca <jose.r.fonseca@gmail.com>
Sun, 15 Apr 2012 13:33:00 +0000 (14:33 +0100)
13 files changed:
specs/stdapi.py
wrappers/cgltrace.py
wrappers/d3d10_1trace.py
wrappers/d3d10trace.py
wrappers/d3d11trace.py
wrappers/d3d8trace.py
wrappers/d3d9trace.py
wrappers/ddrawtrace.py
wrappers/egltrace.py
wrappers/gltrace.py
wrappers/glxtrace.py
wrappers/trace.py
wrappers/wgltrace.py

index 60e287dadc1cfa816f1c49504be43769f4a95980..745ea259586c88641ca2c93f468608c3c0c0f16b 100644 (file)
@@ -837,7 +837,7 @@ class API:
         self.addFunctions(api.functions)
         self.addInterfaces(api.interfaces)
 
-    def get_function_by_name(self, name):
+    def getFunctionByName(self, name):
         for function in self.functions:
             if function.name == name:
                 return function
index ea2267cf1c5ff1c1bb817f9a3069cbc2e3b58b55..e9dee975db9c212eb22883d835f2b8ede48c3aff 100644 (file)
@@ -24,7 +24,7 @@
 ##########################################################################/
 
 
-"""Cgl tracing generator."""
+"""CGL tracing generator."""
 
 
 from gltrace import GlTracer
@@ -36,7 +36,7 @@ from specs.cglapi import cglapi
 class CglTracer(GlTracer):
 
     def isFunctionPublic(self, function):
-        # The symbols visible in libGL.dylib can vary, so expose them all
+        # all OpenGL symbols are visible on MacOSX
         return True
 
 
@@ -58,7 +58,7 @@ if __name__ == '__main__':
     api.addApi(cglapi)
     api.addApi(glapi)
     tracer = CglTracer()
-    tracer.trace_api(api)
+    tracer.traceApi(api)
 
     print r'''
 
index 1a4443b09110d0482660a01b31cd785fb13194fc..666228e6fff9ea120ecf8d624cc694eac991452b 100644 (file)
@@ -43,4 +43,4 @@ if __name__ == '__main__':
     print '#include <d3dx10.h>'
     print
     tracer = DllTracer('d3d10_1.dll')
-    tracer.trace_api(d3d10_1)
+    tracer.traceApi(d3d10_1)
index 1d6576977af426a9fe2adf429a332952491e309b..cc81265afad57069083f2fad845acc0de3f28ad8 100644 (file)
@@ -43,4 +43,4 @@ if __name__ == '__main__':
     print '#include <d3dx10.h>'
     print
     tracer = DllTracer('d3d10.dll')
-    tracer.trace_api(d3d10)
+    tracer.traceApi(d3d10)
index a4ccd6b22c3131b1ae24e999ad356601d99a9555..12eec869404f858a0f9780220e478cdb1bbf3a76 100644 (file)
@@ -43,4 +43,4 @@ if __name__ == '__main__':
     print '#include <d3dx11.h>'
     print
     tracer = DllTracer('d3d11.dll')
-    tracer.trace_api(d3d11)
+    tracer.traceApi(d3d11)
index 09377cb3dc3f3e9019e17a8f740a80abfd55ff48..5219094b3e7d56d1e27658985b9abd3df750349a 100644 (file)
@@ -50,5 +50,5 @@ if __name__ == '__main__':
     print '#include "os.hpp"'
     print
     tracer = D3D8Tracer('d3d8.dll')
-    tracer.trace_api(d3d8)
+    tracer.traceApi(d3d8)
 
index 4f40194ec5af3a4841f4e21148fa5f494a3388ea..804e90f20bd282a721bb6497e3a3da3d70eaa92e 100644 (file)
@@ -90,5 +90,5 @@ _declCount(const D3DVERTEXELEMENT9 *pVertexElements) {
 }
 '''
     tracer = D3D9Tracer('d3d9.dll')
-    tracer.trace_api(d3d9)
+    tracer.traceApi(d3d9)
 
index c95a018886f4e9186e708eb7cfd8bb951d9130e7..b575c77092eda1c2af80ad9ede0b18da56fdfd4a 100644 (file)
@@ -67,4 +67,4 @@ if __name__ == '__main__':
     print '#include "os.hpp"'
     print
     tracer = DDrawTracer('ddraw.dll')
-    tracer.trace_api(ddraw)
+    tracer.traceApi(ddraw)
index 65c14efdb69415d67bb7f10f254697b5969dd8a4..4972528fe0e09ed21ff35307696824d0864215cb 100644 (file)
@@ -33,7 +33,6 @@
 
 
 from gltrace import GlTracer
-from dispatch import function_pointer_type, function_pointer_value
 from specs.stdapi import API
 from specs.glapi import glapi
 from specs.eglapi import eglapi
@@ -46,6 +45,10 @@ class EglTracer(GlTracer):
         # The symbols visible in libEGL.so can vary, so expose them all
         return True
 
+    getProcAddressFunctionNames = [
+        "eglGetProcAddress",
+    ]
+
     def traceFunctionImplBody(self, function):
         GlTracer.traceFunctionImplBody(self, function)
 
@@ -64,12 +67,6 @@ class EglTracer(GlTracer):
             print '            tr->profile = gltrace::PROFILE_ES2;'
             print '    }'
 
-    def wrapRet(self, function, instance):
-        GlTracer.wrapRet(self, function, instance)
-
-        if function.name == "eglGetProcAddress":
-            print '    %s = __unwrap_proc_addr(procname, %s);' % (instance, instance)
-
 
 if __name__ == '__main__':
     print '#include <stdlib.h>'
@@ -85,31 +82,14 @@ if __name__ == '__main__':
     print '#include "glproc.hpp"'
     print '#include "glsize.hpp"'
     print
-    print 'static __eglMustCastToProperFunctionPointerType __unwrap_proc_addr(const char * procname, __eglMustCastToProperFunctionPointerType procPtr);'
-    print
-
+    
     api = API()
     api.addApi(eglapi)
     api.addApi(glapi)
     api.addApi(glesapi)
     tracer = EglTracer()
-    tracer.trace_api(api)
-
-    print 'static __eglMustCastToProperFunctionPointerType __unwrap_proc_addr(const char * procname, __eglMustCastToProperFunctionPointerType procPtr) {'
-    print '    if (!procPtr) {'
-    print '        return procPtr;'
-    print '    }'
-    for f in api.functions:
-        ptype = function_pointer_type(f)
-        pvalue = function_pointer_value(f)
-        print '    if (!strcmp("%s", procname)) {' % f.name
-        print '        %s = (%s)procPtr;' % (pvalue, ptype)
-        print '        return (__eglMustCastToProperFunctionPointerType)&%s;' % (f.name,)
-        print '    }'
-    print '    os::log("apitrace: warning: unknown function \\"%s\\"\\n", procname);'
-    print '    return procPtr;'
-    print '}'
-    print
+    tracer.traceApi(api)
+
     print r'''
 
 
index 128568ffc42288f6166c25a6766907661273a76f..9f60acb9b1a21ebea851c2047f230e9e3badd134 100644 (file)
@@ -28,6 +28,7 @@
 
 
 from trace import Tracer
+from dispatch import function_pointer_type, function_pointer_value
 import specs.stdapi as stdapi
 import specs.glapi as glapi
 import specs.glparams as glparams
@@ -324,6 +325,38 @@ class GlTracer(Tracer):
         print '}'
         print
 
+    getProcAddressFunctionNames = []
+
+    def traceApi(self, api):
+        if self.getProcAddressFunctionNames:
+            # Generate a function to wrap proc addresses
+            getProcAddressFunction = api.getFunctionByName(self.getProcAddressFunctionNames[0])
+            argType = getProcAddressFunction.args[0].type
+            retType = getProcAddressFunction.type
+            
+            print 'static %s _wrapProcAddress(%s procName, %s procPtr);' % (retType, argType, retType)
+            print
+            
+            Tracer.traceApi(self, api)
+            
+            print 'static %s _wrapProcAddress(%s procName, %s procPtr) {' % (retType, argType, retType)
+            print '    if (!procPtr) {'
+            print '        return procPtr;'
+            print '    }'
+            for function in api.functions:
+                ptype = function_pointer_type(function)
+                pvalue = function_pointer_value(function)
+                print '    if (strcmp("%s", (const char *)procName) == 0) {' % function.name
+                print '        %s = (%s)procPtr;' % (pvalue, ptype)
+                print '        return (%s)&%s;' % (retType, function.name,)
+                print '    }'
+            print '    os::log("apitrace: warning: unknown function \\"%s\\"\\n", (const char *)procName);'
+            print '    return procPtr;'
+            print '}'
+            print
+        else:
+            Tracer.traceApi(self, api)
+
     array_pointer_function_names = set((
         "glVertexPointer",
         "glNormalPointer",
@@ -583,7 +616,7 @@ class GlTracer(Tracer):
             print "        if (name[0] != 'g' || name[1] != 'l' || name[2] != '_') {"
             print '            GLint location = __glGetAttribLocation(program, name);'
             print '            if (location >= 0) {'
-            bind_function = glapi.glapi.get_function_by_name('glBindAttribLocation')
+            bind_function = glapi.glapi.getFunctionByName('glBindAttribLocation')
             self.fake_call(bind_function, ['program', 'location', 'name'])
             print '            }'
             print '        }'
@@ -601,7 +634,7 @@ class GlTracer(Tracer):
             print "        if (name[0] != 'g' || name[1] != 'l' || name[2] != '_') {"
             print '            GLint location = __glGetAttribLocationARB(programObj, name);'
             print '            if (location >= 0) {'
-            bind_function = glapi.glapi.get_function_by_name('glBindAttribLocationARB')
+            bind_function = glapi.glapi.getFunctionByName('glBindAttribLocationARB')
             self.fake_call(bind_function, ['programObj', 'location', 'name'])
             print '            }'
             print '        }'
@@ -633,7 +666,7 @@ class GlTracer(Tracer):
         if function.name in ('glXGetProcAddress', 'glXGetProcAddressARB', 'wglGetProcAddress'):
             else_ = ''
             for marker_function in self.marker_functions:
-                if self.api.get_function_by_name(marker_function):
+                if self.api.getFunctionByName(marker_function):
                     print '    %sif (strcmp("%s", (const char *)%s) == 0) {' % (else_, marker_function, function.args[0].name)
                     print '        __result = (%s)&%s;' % (function.type, marker_function)
                     print '    }'
@@ -667,6 +700,10 @@ class GlTracer(Tracer):
     def wrapRet(self, function, instance):
         Tracer.wrapRet(self, function, instance)
 
+        # Replace function addresses with ours
+        if function.name in self.getProcAddressFunctionNames:
+            print '    %s = _wrapProcAddress(%s, %s);' % (instance, function.args[0].name, instance)
+
         # Keep track of buffer mappings
         if function.name in ('glMapBuffer', 'glMapBufferARB'):
             print '    struct buffer_mapping *mapping = get_buffer_mapping(target);'
@@ -816,7 +853,7 @@ class GlTracer(Tracer):
             function_name = 'gl%sPointer' % camelcase_name
             enable_name = 'GL_%s_ARRAY' % uppercase_name
             binding_name = 'GL_%s_ARRAY_BUFFER_BINDING' % uppercase_name
-            function = api.get_function_by_name(function_name)
+            function = api.getFunctionByName(function_name)
 
             print '    // %s' % function.prototype()
             print '  if (%s) {' % profile_check
@@ -881,7 +918,7 @@ class GlTracer(Tracer):
             else:
                 SUFFIX = suffix
             function_name = 'glVertexAttribPointer' + suffix
-            function = api.get_function_by_name(function_name)
+            function = api.getFunctionByName(function_name)
 
             print '    // %s' % function.prototype()
             print '    if (__vertex_attrib == VERTEX_ATTRIB%s) {' % SUFFIX
@@ -984,7 +1021,7 @@ class GlTracer(Tracer):
             print '    }'
 
     def fake_glClientActiveTexture_call(self, api, texture):
-        function = api.get_function_by_name('glClientActiveTexture')
+        function = api.getFunctionByName('glClientActiveTexture')
         self.fake_call(function, [texture])
 
     def fake_call(self, function, args):
index 8c18e0bdf62bee57f30709926ce572931c936690..e4d05180e15b4dd06d4ffe2f11dbf77fe0d80a29 100644 (file)
@@ -29,7 +29,6 @@
 
 
 from gltrace import GlTracer
-from dispatch import function_pointer_type, function_pointer_value
 from specs.stdapi import API
 from specs.glapi import glapi
 from specs.glxapi import glxapi
@@ -41,11 +40,10 @@ class GlxTracer(GlTracer):
         # The symbols visible in libGL.so can vary, so expose them all
         return True
 
-    def wrapRet(self, function, instance):
-        GlTracer.wrapRet(self, function, instance)
-
-        if function.name in ("glXGetProcAddress", "glXGetProcAddressARB"):
-            print '    %s = __unwrap_proc_addr(procName, %s);' % (instance, instance)
+    getProcAddressFunctionNames = [
+        "glXGetProcAddress",
+        "glXGetProcAddressARB",
+    ]
 
 
 if __name__ == '__main__':
@@ -67,30 +65,13 @@ if __name__ == '__main__':
     print '#include "glproc.hpp"'
     print '#include "glsize.hpp"'
     print
-    print 'static __GLXextFuncPtr __unwrap_proc_addr(const GLubyte * procName, __GLXextFuncPtr procPtr);'
-    print
 
     api = API()
     api.addApi(glxapi)
     api.addApi(glapi)
     tracer = GlxTracer()
-    tracer.trace_api(api)
-
-    print 'static __GLXextFuncPtr __unwrap_proc_addr(const GLubyte * procName, __GLXextFuncPtr procPtr) {'
-    print '    if (!procPtr) {'
-    print '        return procPtr;'
-    print '    }'
-    for f in api.functions:
-        ptype = function_pointer_type(f)
-        pvalue = function_pointer_value(f)
-        print '    if (strcmp("%s", (const char *)procName) == 0) {' % f.name
-        print '        %s = (%s)procPtr;' % (pvalue, ptype)
-        print '        return (__GLXextFuncPtr)&%s;' % (f.name,)
-        print '    }'
-    print '    os::log("apitrace: warning: unknown function \\"%s\\"\\n", (const char *)procName);'
-    print '    return procPtr;'
-    print '}'
-    print
+    tracer.traceApi(api)
+
     print r'''
 
 
index eb9e4affa213a7a18989d0415c4541f90dba9044..6cb7934bfc684e4c153cca24fd3ef7b05561befe 100644 (file)
@@ -348,7 +348,7 @@ class Tracer:
 
         return ValueSerializer()
 
-    def trace_api(self, api):
+    def traceApi(self, api):
         self.api = api
 
         self.header(api)
index 22db6f062856f3775b52a35bae862b120b12d636..f345869b684f4e6090ad5c169d02f2699a272903 100644 (file)
@@ -28,8 +28,6 @@
 
 
 from gltrace import GlTracer
-from dispatch import function_pointer_type, function_pointer_value
-from codegen import *
 from specs.stdapi import API
 from specs.glapi import glapi
 from specs.wglapi import wglapi
@@ -37,26 +35,9 @@ from specs.wglapi import wglapi
 
 class WglTracer(GlTracer):
 
-    def wrapRet(self, function, instance):
-        GlTracer.wrapRet(self, function, instance)
-
-        if function.name == "wglGetProcAddress":
-            print '    if (%s) {' % instance
-        
-            func_dict = dict([(f.name, f) for f in glapi.functions + wglapi.functions])
-
-            def handle_case(function_name):
-                f = func_dict[function_name]
-                ptype = function_pointer_type(f)
-                pvalue = function_pointer_value(f)
-                print '    %s = (%s)%s;' % (pvalue, ptype, instance)
-                print '    %s = (%s)&%s;' % (instance, function.type, f.name);
-        
-            def handle_default():
-                print '    os::log("apitrace: warning: unknown function \\"%s\\"\\n", lpszProc);'
-
-            string_switch('lpszProc', func_dict.keys(), handle_case, handle_default)
-            print '    }'
+    getProcAddressFunctionNames = [
+        "wglGetProcAddress",
+    ]
 
 
 if __name__ == '__main__':
@@ -80,4 +61,4 @@ if __name__ == '__main__':
     api.addApi(glapi)
     api.addApi(wglapi)
     tracer = WglTracer()
-    tracer.trace_api(api)
+    tracer.traceApi(api)