]> git.cworth.org Git - apitrace/blobdiff - retrace/d3dretrace.py
Rename d3dsize.hpp to d3d9size.hpp
[apitrace] / retrace / d3dretrace.py
index 0d6374684f3807324edabdfe25bb17509b8302e7..14b92ab4fe7503f50945412b4f34453273388865 100644 (file)
 ##########################################################################/
 
 
-"""GL retracer generator."""
+"""D3D retracer generator."""
 
 
 from dllretrace import DllRetracer as Retracer
 import specs.stdapi as stdapi
-from specs.d3d9 import d3d9
+from specs.d3d9 import *
 
 
 class D3DRetracer(Retracer):
 
-    table_name = 'd3dretrace::d3d9_callbacks'
+    def retraceApi(self, api):
+        print '// Swizzling mapping for lock addresses'
+        print 'static std::map<void *, void *> _locks;'
+        print
 
-    bufferInterfaceNames = [
-        'IDirect3DVertexBuffer9',
-        'IDirect3DIndexBuffer9',
-    ]
+        self.table_name = 'd3dretrace::%s_callbacks' % api.name.lower()
+
+        Retracer.retraceApi(self, api)
 
     def invokeInterfaceMethod(self, interface, method):
-        if interface.name == 'IDirect3D9' and method.name == 'CreateDevice':
-            print 'HWND hWnd = createWindow(pPresentationParameters->BackBufferWidth, pPresentationParameters->BackBufferHeight);'
-            print 'pPresentationParameters->hDeviceWindow = hWnd;'
-            print 'hFocusWindow = hWnd;'
+        # 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', 'CreateAdditionalSwapChain'):
+            print r'    HWND hWnd = d3dretrace::createWindow(pPresentationParameters->BackBufferWidth, pPresentationParameters->BackBufferHeight);'
+            print r'    pPresentationParameters->hDeviceWindow = hWnd;'
+            if 'hFocusWindow' in method.argNames():
+                print r'    hFocusWindow = hWnd;'
+
+        if method.name in ('Reset', 'ResetEx'):
+            print r'    if (pPresentationParameters->Windowed) {'
+            print r'        d3dretrace::resizeWindow(pPresentationParameters->hDeviceWindow, pPresentationParameters->BackBufferWidth, pPresentationParameters->BackBufferHeight);'
+            print r'    }'
+
+        # notify frame has been completed
+        if method.name == 'Present':
+            print r'    retrace::frameComplete(call);'
+            print r'    hDestWindowOverride = NULL;'
+
+        if 'pSharedHandle' in method.argNames():
+            print r'    if (pSharedHandle) {'
+            print r'        retrace::warning(call) << "shared surfaces unsupported\n";'
+            print r'        pSharedHandle = NULL;'
+            print r'    }'
 
         Retracer.invokeInterfaceMethod(self, interface, method)
 
+        # process events after presents
+        if method.name == 'Present':
+            print r'    d3dretrace::processEvents();'
+
+        # 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':
-            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 method.name in ('Lock', 'LockRect', 'LockBox'):
+            print '    VOID *_pbData = NULL;'
+            print '    size_t _LockedSize = 0;'
+            print '    _getLockInfo(_this, %s, _pbData, _LockedSize);' % ', '.join(method.argNames()[:-1])
+            print '    _locks[_this] = _pbData;'
+        
+        if method.name in ('Unlock', 'UnlockRect', 'UnlockBox'):
+            print '    VOID *_pbData = 0;'
+            print '    _pbData = _locks[_this];'
+            print '    if (_pbData) {'
+            print '        retrace::delRegionByPointer(_pbData);'
+            print '    }'
 
 
 if __name__ == '__main__':
@@ -74,82 +104,10 @@ if __name__ == '__main__':
 #include <iostream>
 
 #include "d3d9imports.hpp"
+#include "d3d9size.hpp"
 #include "d3dretrace.hpp"
 
-
-// XXX: Don't duplicate this code.
-
-static LRESULT CALLBACK
-WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
-{
-    MINMAXINFO *pMMI;
-    switch (uMsg) {
-    case WM_GETMINMAXINFO:
-        // Allow to create a window bigger than the desktop
-        pMMI = (MINMAXINFO *)lParam;
-        pMMI->ptMaxSize.x = 60000;
-        pMMI->ptMaxSize.y = 60000;
-        pMMI->ptMaxTrackSize.x = 60000;
-        pMMI->ptMaxTrackSize.y = 60000;
-        break;
-    default:
-        break;
-    }
-
-    return DefWindowProc(hWnd, uMsg, wParam, lParam);
-}
-
-
-static HWND
-createWindow(int width, int height) {
-    static bool first = TRUE;
-    RECT rect;
-
-    if (first) {
-        WNDCLASS wc;
-        memset(&wc, 0, sizeof wc);
-        wc.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1);
-        wc.hCursor = LoadCursor(NULL, IDC_ARROW);
-        wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
-        wc.lpfnWndProc = WndProc;
-        wc.lpszClassName = "d3dretrace";
-        wc.style = CS_OWNDC | CS_HREDRAW | CS_VREDRAW;
-        RegisterClass(&wc);
-        first = FALSE;
-    }
-
-    DWORD dwExStyle;
-    DWORD dwStyle;
-    HWND hWnd;
-
-    dwExStyle = 0;
-    dwStyle = WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_OVERLAPPEDWINDOW;
-
-    int x = 0, y = 0;
-
-    rect.left = x;
-    rect.top = y;
-    rect.right = rect.left + width;
-    rect.bottom = rect.top + height;
-
-    AdjustWindowRectEx(&rect, dwStyle, FALSE, dwExStyle);
-
-    hWnd = CreateWindowEx(dwExStyle,
-                          "d3dretrace", /* wc.lpszClassName */
-                          NULL,
-                          dwStyle,
-                          0, /* x */
-                          0, /* y */
-                          rect.right - rect.left, /* width */
-                          rect.bottom - rect.top, /* height */
-                          NULL,
-                          NULL,
-                          NULL,
-                          NULL);
-    ShowWindow(hWnd, SW_SHOW);
-    return hWnd;
-}
-
 '''
+
     retracer = D3DRetracer()
     retracer.retraceApi(d3d9)