]> git.cworth.org Git - apitrace/blobdiff - retrace/dxgiretrace.py
Update downloads link.
[apitrace] / retrace / dxgiretrace.py
index a412c3aeb8b86a6b53a61d56740bcc978a78b126..8de3c989efa5f46057c6b04c19cbee22665af4f0 100644 (file)
@@ -74,14 +74,6 @@ createWindow(DXGI_SWAP_CHAIN_DESC *pSwapChainDesc) {
             if 'pSwapChainDesc' in function.argNames():
                 print r'    createWindow(pSwapChainDesc);'
 
-            # Compensate for the fact we don't trace the software renderer
-            # module LoadLibrary call
-            if 'Software' in function.argNames():
-                print r'    if (Software) {'
-                print r'        retrace::warning(call) << "using WARP for software device\n";'
-                print r'        Software = LoadLibraryA("d3d10warp");'
-                print r'    }'
-
             # Compensate for the fact we don't trace DXGI object creation
             if function.name.startswith('D3D11CreateDevice'):
                 print r'    if (DriverType == D3D_DRIVER_TYPE_UNKNOWN && !pAdapter) {'
@@ -89,52 +81,73 @@ createWindow(DXGI_SWAP_CHAIN_DESC *pSwapChainDesc) {
                 print r'    }'
 
             if function.name.startswith('D3D10CreateDevice'):
+                # Toggle debugging
+                print r'    Flags &= ~D3D10_CREATE_DEVICE_DEBUG;'
+                print r'    if (retrace::debug) {'
+                print r'        if (LoadLibraryA("d3d10sdklayers")) {'
+                print r'            Flags |= D3D10_CREATE_DEVICE_DEBUG;'
+                print r'        }'
+                print r'    }'
+
+                # Force driver
                 self.forceDriver('D3D10_DRIVER_TYPE')
+
             if function.name.startswith('D3D11CreateDevice'):
+                # Toggle debugging
+                print r'    Flags &= ~D3D11_CREATE_DEVICE_DEBUG;'
+                print r'    if (retrace::debug) {'
+                print r'        if (LoadLibraryA("d3d11sdklayers")) {'
+                print r'            Flags |= D3D11_CREATE_DEVICE_DEBUG;'
+                print r'        }'
+                print r'    }'
+
+                # Force driver
                 self.forceDriver('D3D_DRIVER_TYPE')
 
         Retracer.invokeFunction(self, function)
 
     def forceDriver(self, enum):
-        print r'    switch (retrace::driver) {'
-        print r'    case retrace::DRIVER_HARDWARE:'
-        print r'        DriverType = %s_HARDWARE;' % enum
-        print r'        Software = NULL;'
-        print r'        break;'
-        print r'    case retrace::DRIVER_SOFTWARE:'
-        print r'        pAdapter = NULL;'
-        print r'        DriverType = %s_WARP;' % enum
-        print r'        Software = NULL;'
-        print r'        break;'
-        print r'    case retrace::DRIVER_REFERENCE:'
-        print r'        pAdapter = NULL;'
-        print r'        DriverType = %s_REFERENCE;' % enum
-        print r'        Software = NULL;'
-        print r'        break;'
-        print r'    case retrace::DRIVER_NULL:'
-        print r'        pAdapter = NULL;'
-        print r'        DriverType = %s_NULL;' % enum
-        print r'        Software = NULL;'
-        print r'        break;'
-        print r'    case retrace::DRIVER_MODULE:'
-        print r'        pAdapter = NULL;'
-        print r'        DriverType = %s_SOFTWARE;' % enum
-        print r'        Software = LoadLibraryA(retrace::driverModule);'
-        print r'        if (!Software) {'
-        print r'            retrace::warning(call) << "failed to load " << retrace::driverModule << "\n";'
-        print r'        }'
-        print r'        break;'
-        print r'    default:'
-        print r'        assert(0);'
-        print r'        /* fall-through */'
-        print r'    case retrace::DRIVER_DEFAULT:'
-        print r'        if (DriverType == %s_SOFTWARE) {' % enum
-        print r'            Software = LoadLibraryA("d3d10warp");'
+        # This can only work when pAdapter is NULL. For non-NULL pAdapter we
+        # need to override inside the EnumAdapters call below
+        print r'    if (pAdapter == NULL) {'
+        print r'        switch (retrace::driver) {'
+        print r'        case retrace::DRIVER_HARDWARE:'
+        print r'            DriverType = %s_HARDWARE;' % enum
+        print r'            Software = NULL;'
+        print r'            break;'
+        print r'        case retrace::DRIVER_SOFTWARE:'
+        print r'            DriverType = %s_WARP;' % enum
+        print r'            Software = NULL;'
+        print r'            break;'
+        print r'        case retrace::DRIVER_REFERENCE:'
+        print r'            DriverType = %s_REFERENCE;' % enum
+        print r'            Software = NULL;'
+        print r'            break;'
+        print r'        case retrace::DRIVER_NULL:'
+        print r'            DriverType = %s_NULL;' % enum
+        print r'            Software = NULL;'
+        print r'            break;'
+        print r'        case retrace::DRIVER_MODULE:'
+        print r'            DriverType = %s_SOFTWARE;' % enum
+        print r'            Software = LoadLibraryA(retrace::driverModule);'
         print r'            if (!Software) {'
-        print r'                retrace::warning(call) << "failed to load d3d10warp.dll\n";'
+        print r'                retrace::warning(call) << "failed to load " << retrace::driverModule << "\n";'
         print r'            }'
+        print r'            break;'
+        print r'        default:'
+        print r'            assert(0);'
+        print r'            /* fall-through */'
+        print r'        case retrace::DRIVER_DEFAULT:'
+        print r'            if (DriverType == %s_SOFTWARE) {' % enum
+        print r'                Software = LoadLibraryA("d3d10warp");'
+        print r'                if (!Software) {'
+        print r'                    retrace::warning(call) << "failed to load d3d10warp.dll\n";'
+        print r'                }'
+        print r'            }'
+        print r'            break;'
         print r'        }'
-        print r'        break;'
+        print r'    } else {'
+        print r'        Software = NULL;'
         print r'    }'
 
     def invokeInterfaceMethod(self, interface, method):
@@ -164,6 +177,34 @@ createWindow(DXGI_SWAP_CHAIN_DESC *pSwapChainDesc) {
             print r'        pSharedResource = NULL;'
             print r'    }'
 
+        # Force driver
+        if interface.name.startswith('IDXGIFactory') and method.name == 'EnumAdapters':
+            print r'    const char *szSoftware = NULL;'
+            print r'    switch (retrace::driver) {'
+            print r'    case retrace::DRIVER_REFERENCE:'
+            print r'    case retrace::DRIVER_SOFTWARE:'
+            print r'        szSoftware = "d3d10warp.dll";'
+            print r'        break;'
+            print r'    case retrace::DRIVER_MODULE:'
+            print r'        szSoftware = retrace::driverModule;'
+            print r'        break;'
+            print r'    default:'
+            print r'        break;'
+            print r'    }'
+            print r'    HMODULE hSoftware = NULL;'
+            print r'    if (szSoftware) {'
+            print r'        hSoftware = LoadLibraryA(szSoftware);'
+            print r'        if (!hSoftware) {'
+            print r'            retrace::warning(call) << "failed to load " << szSoftware << "\n";'
+            print r'        }'
+            print r'    }'
+            print r'    if (hSoftware) {'
+            print r'        _result = _this->CreateSoftwareAdapter(hSoftware, ppAdapter);'
+            print r'    } else {'
+            Retracer.invokeInterfaceMethod(self, interface, method)
+            print r'    }'
+            return
+
         Retracer.invokeInterfaceMethod(self, interface, method)
 
         # process events after presents