]> git.cworth.org Git - apitrace/blobdiff - retrace/d3dretrace.py
Factor out the lock rect size computation.
[apitrace] / retrace / d3dretrace.py
index 194ae4439d35d3411003ca111a5c1c881f78b466..f1e8a68781a5d5d708fe143c59bcaae040d37a4d 100644 (file)
@@ -41,41 +41,40 @@ class D3DRetracer(Retracer):
         'IDirect3DIndexBuffer9',
     ]
 
-    def extractArg(self, function, arg, arg_type, lvalue, rvalue):
-        if arg.type is D3DSHADER9:
-            print r'    %s = extractShader((%s).toString());' % (lvalue, rvalue)
-            print r'    if (!%s) {' % lvalue
-            print r'        retrace::warning(call) << "failed to assemble shader\n";'
-            print r'        return;'
-            print r'    }'
-            return
-            
-        Retracer.extractArg(self, function, arg, arg_type, lvalue, rvalue)
-
     def invokeInterfaceMethod(self, interface, method):
-        if interface.name == 'IDirect3D9' and method.name == 'CreateDevice':
+        # keep track of the last used device for state dumping
+        if interface.name in ('IDirect3DDevice9', 'IDirect3DDevice9Ex'):
+            print r'    d3dretrace::pLastDirect3DDevice9 = _this;'
+
+        # create windows as neccessary
+        if method.name in ('CreateDevice', 'CreateDeviceEx'):
             print r'    HWND hWnd = createWindow(pPresentationParameters->BackBufferWidth, pPresentationParameters->BackBufferHeight);'
-            print r'    pPresentationParameters->hDeviceWindow = hWnd;'
             print r'    hFocusWindow = hWnd;'
+            print r'    pPresentationParameters->hDeviceWindow = hWnd;'
 
         Retracer.invokeInterfaceMethod(self, interface, method)
 
+        # check errors
         if str(method.type) == 'HRESULT':
-            print r'    if (_result != S_OK) {'
+            print r'    if (FAILED(_result)) {'
             print r'        retrace::warning(call) << "failed\n";'
             print r'    }'
 
-        if interface.name in self.bufferInterfaceNames and method.name == 'Lock':
+        if interface.name in self.bufferInterfaceNames and method.name == 'Lock' or \
+           interface.name == 'IDirect3DSurface9' and method.name == 'LockRect':
             getDescMethod = interface.getMethodByName('GetDesc')
             descArg = getDescMethod.args[0]
             assert descArg.output
             descType = getDescMethod.args[0].type.type
 
-            print '        if (!SizeToLock) {'
-            print '            %s Desc;' % descType
-            print '            _this->GetDesc(&Desc);'
-            print '            SizeToLock = Desc.Size;'
-            print '        }'
+            if interface.name in self.bufferInterfaceNames:
+                print '        if (!SizeToLock) {'
+                print '            %s Desc;' % descType
+                print '            _this->GetDesc(&Desc);'
+                print '            SizeToLock = Desc.Size;'
+                print '        }'
+            elif interface.name == 'IDirect3DSurface9':
+                print '        size_t m_SizeToLock = _lockSize(_this, pLockedRect, pRect);'
 
 
 if __name__ == '__main__':
@@ -85,6 +84,7 @@ if __name__ == '__main__':
 #include <iostream>
 
 #include "d3d9imports.hpp"
+#include "d3dsize.hpp"
 #include "d3dretrace.hpp"
 
 
@@ -225,6 +225,5 @@ found:
 }
 '''
 
-    d3d9.name = 'd3d9d'
     retracer = D3DRetracer()
     retracer.retraceApi(d3d9)