]> git.cworth.org Git - apitrace/commitdiff
Trace/retrace IDirect3DVertexBuffer9 locks
authorJosé Fonseca <jose.r.fonseca@gmail.com>
Wed, 18 Apr 2012 18:58:32 +0000 (19:58 +0100)
committerJosé Fonseca <jose.r.fonseca@gmail.com>
Wed, 18 Apr 2012 18:58:32 +0000 (19:58 +0100)
retrace/d3dretrace.py
specs/stdapi.py
wrappers/d3d9trace.py

index ca936f2556ce0f38d4f5cd537957b05ae9662a00..0d6374684f3807324edabdfe25bb17509b8302e7 100644 (file)
@@ -36,6 +36,11 @@ class D3DRetracer(Retracer):
 
     table_name = 'd3dretrace::d3d9_callbacks'
 
+    bufferInterfaceNames = [
+        'IDirect3DVertexBuffer9',
+        'IDirect3DIndexBuffer9',
+    ]
+
     def invokeInterfaceMethod(self, interface, method):
         if interface.name == 'IDirect3D9' and method.name == 'CreateDevice':
             print 'HWND hWnd = createWindow(pPresentationParameters->BackBufferWidth, pPresentationParameters->BackBufferHeight);'
@@ -49,9 +54,14 @@ class D3DRetracer(Retracer):
             print r'        retrace::warning(call) << "failed\n";'
             print r'    }'
 
-        if interface.name == 'IDirect3DVertexBuffer9' and method.name == 'Lock':
+        if interface.name in self.bufferInterfaceNames and method.name == 'Lock':
+            getDescMethod = interface.getMethodByName('GetDesc')
+            descArg = getDescMethod.args[0]
+            assert descArg.output
+            descType = getDescMethod.args[0].type.type
+
             print '        if (!SizeToLock) {'
-            print '            D3DVERTEXBUFFER_DESC Desc;'
+            print '            %s Desc;' % descType
             print '            _this->GetDesc(&Desc);'
             print '            SizeToLock = Desc.Size;'
             print '        }'
index b0995783f8f9aea4c210fc3b96dcf5b676d3ce92..ff7508b7021257e4c57f6edd6660bd33e35ec6fc 100644 (file)
@@ -401,6 +401,12 @@ class Interface(Type):
     def visit(self, visitor, *args, **kwargs):
         return visitor.visitInterface(self, *args, **kwargs)
 
+    def getMethodByName(self, name):
+        for methods in self.methods:
+            if methods.name == name:
+                return methods
+        return None
+
     def iterMethods(self):
         if self.base is not None:
             for method in self.base.iterMethods():
index 804e90f20bd282a721bb6497e3a3da3d70eaa92e..9fb290d6674673ef9331332420a930c2888e6d76 100644 (file)
@@ -38,28 +38,39 @@ class D3D9Tracer(DllTracer):
 
         DllTracer.serializeArgValue(self, function, arg)
 
+    bufferInterfaceNames = [
+        'IDirect3DVertexBuffer9',
+        'IDirect3DIndexBuffer9',
+    ]
+
     def declareWrapperInterfaceVariables(self, interface):
         DllTracer.declareWrapperInterfaceVariables(self, interface)
         
-        if interface.name == 'IDirect3DVertexBuffer9':
+        if interface.name in self.bufferInterfaceNames:
             print '    UINT m_SizeToLock;'
             print '    VOID *m_pbData;'
 
     def implementWrapperInterfaceMethodBody(self, interface, base, method):
-        if interface.name == 'IDirect3DVertexBuffer9' and method.name == 'Unlock':
+        if interface.name in self.bufferInterfaceNames and method.name == 'Unlock':
             print '    if (m_pbData) {'
             self.emit_memcpy('(LPBYTE)m_pbData', '(LPBYTE)m_pbData', 'm_SizeToLock')
             print '    }'
 
         DllTracer.implementWrapperInterfaceMethodBody(self, interface, base, method)
 
-        if interface.name == 'IDirect3DVertexBuffer9' and method.name == 'Lock':
+        if interface.name in self.bufferInterfaceNames and method.name == 'Lock':
             # FIXME: handle recursive locks
+
+            getDescMethod = interface.getMethodByName('GetDesc')
+            descArg = getDescMethod.args[0]
+            assert descArg.output
+            descType = getDescMethod.args[0].type.type
+
             print '    if (__result == D3D_OK && !(Flags & D3DLOCK_READONLY)) {'
             print '        if (SizeToLock) {'
             print '            m_SizeToLock = SizeToLock;'
             print '        } else {'
-            print '            D3DVERTEXBUFFER_DESC Desc;'
+            print '            %s Desc;' % descType
             print '            m_pInstance->GetDesc(&Desc);'
             print '            m_SizeToLock = Desc.Size;'
             print '        }'