]> git.cworth.org Git - apitrace/blobdiff - wrappers/d3d9trace.py
Fix compressed texture size computation.
[apitrace] / wrappers / d3d9trace.py
index 4f40194ec5af3a4841f4e21148fa5f494a3388ea..d3f2e024a0330146d35f79a2de80fd05148fbcf2 100644 (file)
 
 
 from dlltrace import DllTracer
-from specs.d3d9 import d3d9
+from specs.d3d9 import d3d9, D3DSHADER9
 
 
 class D3D9Tracer(DllTracer):
 
     def serializeArgValue(self, function, arg):
         # Dump shaders as strings
-        if function.name in ('CreateVertexShader', 'CreatePixelShader') and arg.name == 'pFunction':
+        if arg.type is D3DSHADER9:
             print '    DumpShader(trace::localWriter, %s);' % (arg.name)
             return
 
         DllTracer.serializeArgValue(self, function, arg)
 
-    def declareWrapperInterfaceVariables(self, interface):
-        DllTracer.declareWrapperInterfaceVariables(self, interface)
+    def enumWrapperInterfaceVariables(self, interface):
+        variables = DllTracer.enumWrapperInterfaceVariables(self, interface)
         
-        if interface.name == 'IDirect3DVertexBuffer9':
-            print '    UINT m_SizeToLock;'
-            print '    VOID *m_pbData;'
+        if interface.getMethodByName('Lock') is not None or \
+           interface.getMethodByName('LockRect') is not None or \
+           interface.getMethodByName('LockBox') is not None:
+            variables += [
+                ('size_t', '_LockedSize', '0'),
+                ('VOID *', 'm_pbData', '0'),
+            ]
+
+        return variables
 
     def implementWrapperInterfaceMethodBody(self, interface, base, method):
-        if interface.name == 'IDirect3DVertexBuffer9' and method.name == 'Unlock':
-            print '    if (m_pbData) {'
-            self.emit_memcpy('(LPBYTE)m_pbData', '(LPBYTE)m_pbData', 'm_SizeToLock')
+        if method.name in ('Unlock', 'UnlockRect', 'UnlockBox'):
+            print '    if (_LockedSize && m_pbData) {'
+            self.emit_memcpy('(LPBYTE)m_pbData', '(LPBYTE)m_pbData', '_LockedSize')
             print '    }'
 
         DllTracer.implementWrapperInterfaceMethodBody(self, interface, base, method)
 
-        if interface.name == 'IDirect3DVertexBuffer9' and method.name == 'Lock':
-            # FIXME: handle recursive locks
-            print '    if (__result == D3D_OK && !(Flags & D3DLOCK_READONLY)) {'
-            print '        if (SizeToLock) {'
-            print '            m_SizeToLock = SizeToLock;'
-            print '        } else {'
-            print '            D3DVERTEXBUFFER_DESC Desc;'
-            print '            m_pInstance->GetDesc(&Desc);'
-            print '            m_SizeToLock = Desc.Size;'
-            print '        }'
-            print '        m_pbData = *ppbData;'
+        if method.name in ('Lock', 'LockRect', 'LockedBox'):
+            print '    if (SUCCEEDED(_result) && !(Flags & D3DLOCK_READONLY)) {'
+            print '        _LockedSize = _getLockSize(_this, %s);' % ', '.join(method.argNames()[:-1])
+            if method.name == 'Lock':
+                # FIXME: handle recursive locks
+                print '        m_pbData = *ppbData;'
+            elif method.name == 'LockRect':
+                print '        m_pbData = pLockedRect->pBits;'
+            elif method.name == 'LockBox':
+                print '        m_pbData = pLockedBox->pBits;'
+            else:
+                raise NotImplementedError
             print '    } else {'
             print '        m_pbData = NULL;'
             print '    }'
@@ -76,6 +83,7 @@ if __name__ == '__main__':
     print '#include "os.hpp"'
     print
     print '#include "d3d9imports.hpp"'
+    print '#include "d3dsize.hpp"'
     print '#include "d3dshader.hpp"'
     print
     print '''
@@ -90,5 +98,5 @@ _declCount(const D3DVERTEXELEMENT9 *pVertexElements) {
 }
 '''
     tracer = D3D9Tracer('d3d9.dll')
-    tracer.trace_api(d3d9)
+    tracer.traceApi(d3d9)