]> git.cworth.org Git - apitrace/commitdiff
Fallback to d3d9.dll when d3d9d.dll can't be found.
authorJosé Fonseca <jose.r.fonseca@gmail.com>
Sun, 22 Apr 2012 09:12:46 +0000 (10:12 +0100)
committerJosé Fonseca <jose.r.fonseca@gmail.com>
Sun, 22 Apr 2012 09:12:46 +0000 (10:12 +0100)
dispatch/dispatch.py
dispatch/glproc.py
retrace/d3dretrace.py
retrace/d3dretrace_main.cpp
retrace/dllretrace.py
wrappers/dlltrace.py

index 647454208d0cc75344bf482962cf6c30d8d3fa03..4580166b18a25cff806a2dbaea61bda02bfa283a 100644 (file)
@@ -58,9 +58,9 @@ class Dispatcher:
         #
         raise NotImplementedError
 
-    def dispatch_api(self, api):
+    def dispatchApi(self, api):
         for function in api.functions:
-            self.invokeFunction(function)
+            self.dispatchFunction(api, function)
         
         # define standard name aliases for convenience, but only when not
         # tracing, as that would cause symbol clashing with the tracing
@@ -71,7 +71,7 @@ class Dispatcher:
         print '#endif /* RETRACE */'
         print
 
-    def invokeFunction(self, function):
+    def dispatchFunction(self, api, function):
         ptype = function_pointer_type(function)
         pvalue = function_pointer_value(function)
         print 'typedef ' + function.prototype('* %s' % ptype) + ';'
@@ -83,23 +83,26 @@ class Dispatcher:
             ret = ''
         else:
             ret = 'return '
-        self.get_true_pointer(function)
+        self.invokeGetProcAddress(api, function)
         print '    %s%s(%s);' % (ret, pvalue, ', '.join([str(arg.name) for arg in function.args]))
         print '}'
         print
 
-    def isFunctionPublic(self, function):
+    def isFunctionPublic(self, api, function):
         return True
 
-    def get_true_pointer(self, function):
+    def getProcAddressName(self, api, function):
+        if self.isFunctionPublic(api, function):
+            return '_getPublicProcAddress'
+        else:
+            return '_getPrivateProcAddress'
+
+    def invokeGetProcAddress(self, api, function):
         ptype = function_pointer_type(function)
         pvalue = function_pointer_value(function)
-        if self.isFunctionPublic(function):
-            get_proc_address = '_getPublicProcAddress'
-        else:
-            get_proc_address = '_getPrivateProcAddress'
+        getProcAddressName = self.getProcAddressName(api, function)
         print '    if (!%s) {' % (pvalue,)
-        print '        %s = (%s)%s(_name);' % (pvalue, ptype, get_proc_address)
+        print '        %s = (%s)%s(_name);' % (pvalue, ptype, getProcAddressName)
         print '        if (!%s) {' % (pvalue,)
         self.failFunction(function)
         print '        }'
index 7065995ff08ea61eea5e55fe5161e15ceb4721c5..abf4f00e20063a824373083f9de4c363694694b7 100644 (file)
@@ -503,7 +503,7 @@ void * _getPublicProcAddress(const char *procName);
 void * _getPrivateProcAddress(const char *procName);
 '''
         
-    def isFunctionPublic(self, function):
+    def isFunctionPublic(self, api, function):
         return function.name in public_symbols or function.name.startswith('CGL')
 
 
@@ -519,25 +519,25 @@ if __name__ == '__main__':
     print
     dispatcher.header()
     print
-    dispatcher.dispatch_api(eglapi)
+    dispatcher.dispatchApi(eglapi)
     print
     print '#if defined(_WIN32)'
     print
-    dispatcher.dispatch_api(wglapi)
+    dispatcher.dispatchApi(wglapi)
     print
     print '#elif defined(__APPLE__)'
     print
-    dispatcher.dispatch_api(cglapi)
+    dispatcher.dispatchApi(cglapi)
     print
     print '#elif defined(HAVE_X11)'
     print
-    dispatcher.dispatch_api(glxapi)
+    dispatcher.dispatchApi(glxapi)
     print
     print '#endif'
     print
-    dispatcher.dispatch_api(glapi)
+    dispatcher.dispatchApi(glapi)
     print
-    dispatcher.dispatch_api(glesapi)
+    dispatcher.dispatchApi(glesapi)
     print
 
     print '#endif /* !_GLPROC_HPP_ */'
index 4a78e96a7206b4c7def25ca13e3ba848802b48f7..586335cc268fffeb8ec1d4216d36d2c5923f60b3 100644 (file)
@@ -225,6 +225,5 @@ found:
 }
 '''
 
-    d3d9.name = 'd3d9d'
     retracer = D3DRetracer()
     retracer.retraceApi(d3d9)
index e4a8986d925f60bdd898f8bdc0bf621eafc0ad89..15053e4d1369f953b8f00d6b7fe115ad8bb681b2 100644 (file)
 #include "d3dretrace.hpp"
 
 
+extern const char *g_szD3D9DllName;
+
+
 void
 retrace::setUp(void) {
+    if (retrace::debug) {
+        g_szD3D9DllName = "d3d9d.dll";
+    }
 }
 
 
index abcd2028b98b2d7b308e20501a1bf74481a9e069..318741c63dbf6c0ec6b8ffc403dd0ab390eccf39 100644 (file)
@@ -28,32 +28,43 @@ from retrace import Retracer
 from dispatch import Dispatcher
 
 
+class DllDispatcher(Dispatcher):
+
+    def dispatchApi(self, api):
+        tag = api.name.upper()
+        print r'const char *g_sz%sDllName = NULL;' % (tag,)
+        print r'HMODULE g_h%sModule = NULL;' % (tag,)
+        print r''
+        print r'static PROC'
+        print r'_getPublicProcAddress(LPCSTR lpProcName) {'
+        print r'    if (!g_h%sModule) {' % tag
+        print r'        if (g_sz%sDllName) {' % tag
+        print r'            g_h%sModule = LoadLibraryA(g_sz%sDllName);' % (tag, tag)
+        print r'            if (!g_h%sModule) {' % tag
+        print r'                os::log("warning: failed to load %%s\n", g_sz%sDllName);' % tag 
+        print r'            }'
+        print r'        }'
+        print r'        if (!g_h%sModule) {' % tag
+        print r'            g_h%sModule = LoadLibraryA("%s.dll");' % (tag, api.name)
+        print r'        }'
+        print r'        if (!g_h%sModule) {' % tag
+        print r'            os::log("error: failed to load %s.dll\n");' % api.name
+        print r'            exit(1);'
+        print r'            return NULL;'
+        print r'        }'
+        print r'    }'
+        print r'    return GetProcAddress(g_h%sModule, lpProcName);' % tag
+        print r'}'
+        print r''
+
+        Dispatcher.dispatchApi(self, api)
+
+
 class DllRetracer(Retracer):
 
     def retraceApi(self, api):
-        print r'''
-static LPCSTR g_szDll = "%s";
-static HMODULE g_hDll = NULL;
-
-static PROC
-_getPublicProcAddress(LPCSTR lpProcName)
-{
-    if (!g_hDll) {
-        g_hDll = LoadLibraryA(g_szDll);
-        if (!g_hDll) {
-            os::log("error: failed to load %%s\n", g_szDll);
-            exit(1);
-            return NULL;
-        }
-    }
-        
-    return GetProcAddress(g_hDll, lpProcName);
-}
-
-''' % api.name.upper()
-
-        dispatcher = Dispatcher()
-        dispatcher.dispatch_api(api)
+        dispatcher = DllDispatcher()
+        dispatcher.dispatchApi(api)
 
         Retracer.retraceApi(self, api)
 
index 7dc96910cf9ce038aa60507ee6aceafb1f139274..8456d5f7a63a4052129e69aef305582ceeb240ad 100644 (file)
@@ -63,7 +63,7 @@ _getPublicProcAddress(LPCSTR lpProcName)
 ''' % self.dllname
 
         dispatcher = Dispatcher()
-        dispatcher.dispatch_api(api)
+        dispatcher.dispatchApi(api)
 
         Tracer.header(self, api)