]> git.cworth.org Git - apitrace/blobdiff - retrace/dxgiretrace.py
specs: Ensure query ids are swizzled when replaying.
[apitrace] / retrace / dxgiretrace.py
index 69bc3bac0966fe27c4cd08a5bacba013dd197ec8..1be70fe9db7e9f3aee46d554dffc2eaa58afa42a 100644 (file)
@@ -95,7 +95,16 @@ createWindow(DXGI_SWAP_CHAIN_DESC *pSwapChainDesc) {
                 # Toggle debugging
                 print r'    Flags &= ~D3D11_CREATE_DEVICE_DEBUG;'
                 print r'    if (retrace::debug) {'
-                print r'        if (LoadLibraryA("d3d11sdklayers")) {'
+                print r'        OSVERSIONINFO osvi;'
+                print r'        BOOL bIsWindows8orLater;'
+                print r'        ZeroMemory(&osvi, sizeof osvi);'
+                print r'        osvi.dwOSVersionInfoSize = sizeof osvi;'
+                print r'        GetVersionEx(&osvi);'
+                print r'        bIsWindows8orLater = '
+                print r'            (osvi.dwMajorVersion > 6) ||'
+                print r'            (osvi.dwMajorVersion == 6 && osvi.dwMinorVersion >= 2);'
+                print r'        const char *szD3d11SdkLayers = bIsWindows8orLater ? "d3d11_1sdklayers" : "d3d11sdklayers";'
+                print r'        if (LoadLibraryA(szD3d11SdkLayers)) {'
                 print r'            Flags |= D3D11_CREATE_DEVICE_DEBUG;'
                 print r'        }'
                 print r'    }'
@@ -105,6 +114,22 @@ createWindow(DXGI_SWAP_CHAIN_DESC *pSwapChainDesc) {
 
         Retracer.invokeFunction(self, function)
 
+        if function.name in self.createDeviceFunctionNames:
+            print r'    if (FAILED(_result)) {'
+
+            if function.name.startswith('D3D10CreateDevice'):
+                print r'        if (_result == E_FAIL && (Flags & D3D10_CREATE_DEVICE_DEBUG)) {'
+                print r'            retrace::warning(call) << "debug layer (d3d10sdklayers.dll) not installed\n";'
+                print r'        }'
+
+            if function.name.startswith('D3D11CreateDevice'):
+                print r'        if (_result == E_FAIL && (Flags & D3D11_CREATE_DEVICE_DEBUG)) {'
+                print r'            retrace::warning(call) << "debug layer (d3d11sdklayers.dll for Windows 7, d3d11_1sdklayers.dll for Windows 8 or Windows 7 with KB 2670838) not properly installed\n";'
+                print r'        }'
+
+            print r'        exit(1);'
+            print r'    }'
+
     def forceDriver(self, enum):
         # This can only work when pAdapter is NULL. For non-NULL pAdapter we
         # need to override inside the EnumAdapters call below
@@ -156,7 +181,7 @@ createWindow(DXGI_SWAP_CHAIN_DESC *pSwapChainDesc) {
                 print r'    d3d10Dumper.unbindDevice(_this);'
             else:
                 print r'    d3d10Dumper.bindDevice(_this);'
-        if interface.name in ('ID3D11DeviceContext',):
+        if interface.name in ('ID3D11DeviceContext', 'ID3D11DeviceContext1'):
             if method.name == 'Release':
                 print r'    d3d11Dumper.unbindDevice(_this);'
             else:
@@ -244,8 +269,17 @@ createWindow(DXGI_SWAP_CHAIN_DESC *pSwapChainDesc) {
             '''
             print r'    _result = _this->CreateTexture2D(&Desc, &InitialData, (ID3D10Texture2D**)ppResource);'
             self.checkResult(method.type)
-        else:
-            Retracer.invokeInterfaceMethod(self, interface, method)
+            return
+
+        if method.name == 'Map':
+            # Reset _DO_NOT_WAIT flags. Otherwise they may fail, and we have no
+            # way to cope with it (other than retry).
+            mapFlagsArg = method.getArgByName('MapFlags')
+            for flag in mapFlagsArg.type.values:
+                if flag.endswith('_MAP_FLAG_DO_NOT_WAIT'):
+                    print r'    MapFlags &= ~%s;' % flag
+
+        Retracer.invokeInterfaceMethod(self, interface, method)
 
         # process events after presents
         if method.name == 'Present':