X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;ds=sidebyside;f=retrace%2Fdxgiretrace.py;h=8fa1fdb98d24cab4b2c18bcc3b08eba77cc72f8f;hb=62bce80269d08b94315ce5ca13ed0431137eeef9;hp=e37e49a5395cae4a2c3b2bbef825db9d0d5f6c66;hpb=003b8be61dbaf747100f9e7f788f3b95a55bbd52;p=apitrace diff --git a/retrace/dxgiretrace.py b/retrace/dxgiretrace.py old mode 100644 new mode 100755 index e37e49a..8fa1fdb --- a/retrace/dxgiretrace.py +++ b/retrace/dxgiretrace.py @@ -114,20 +114,31 @@ createWindow(DXGI_SWAP_CHAIN_DESC *pSwapChainDesc) { Retracer.invokeFunction(self, function) + # Debug layers with Windows 8 or Windows 7 Platform update are a mess. + # It's not possible to know before hand whether they are or not + # available, so always retry with debug flag off.. 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' Flags &= ~D3D10_CREATE_DEVICE_DEBUG;' + Retracer.invokeFunction(self, function) print r' }' - - if function.name.startswith('D3D11CreateDevice'): + elif 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' Flags &= ~D3D11_CREATE_DEVICE_DEBUG;' + Retracer.invokeFunction(self, function) print r' }' + else: + assert False + + print r' if (FAILED(_result)) {' + print r' exit(1);' + print r' }' - print r' exit(1);' print r' }' def forceDriver(self, enum): @@ -178,14 +189,20 @@ createWindow(DXGI_SWAP_CHAIN_DESC *pSwapChainDesc) { # keep track of the last used device for state dumping if interface.name in ('ID3D10Device', 'ID3D10Device1'): if method.name == 'Release': - print r' d3d10Dumper.unbindDevice(_this);' + print r' if (call.ret->toUInt() == 0) {' + print r' d3d10Dumper.unbindDevice(_this);' + print r' }' else: print r' d3d10Dumper.bindDevice(_this);' if interface.name in ('ID3D11DeviceContext', 'ID3D11DeviceContext1'): if method.name == 'Release': - print r' d3d11Dumper.unbindDevice(_this);' + print r' if (call.ret->toUInt() == 0) {' + print r' d3d11Dumper.unbindDevice(_this);' + print r' }' else: - print r' d3d11Dumper.bindDevice(_this);' + print r' if (_this->GetType() == D3D11_DEVICE_CONTEXT_IMMEDIATE) {' + print r' d3d11Dumper.bindDevice(_this);' + print r' }' if interface.name == 'IDXGIFactory' and method.name == 'QueryInterface': print r' if (riid == IID_IDXGIFactoryDWM) {' @@ -212,7 +229,7 @@ createWindow(DXGI_SWAP_CHAIN_DESC *pSwapChainDesc) { print r' }' # Force driver - if interface.name.startswith('IDXGIFactory') and method.name == 'EnumAdapters': + if interface.name.startswith('IDXGIFactory') and method.name.startswith('EnumAdapters'): print r' const char *szSoftware = NULL;' print r' switch (retrace::driver) {' print r' case retrace::DRIVER_REFERENCE:' @@ -233,7 +250,7 @@ createWindow(DXGI_SWAP_CHAIN_DESC *pSwapChainDesc) { print r' }' print r' }' print r' if (hSoftware) {' - print r' _result = _this->CreateSoftwareAdapter(hSoftware, ppAdapter);' + print r' _result = _this->CreateSoftwareAdapter(hSoftware, reinterpret_cast(ppAdapter));' print r' } else {' Retracer.invokeInterfaceMethod(self, interface, method) print r' }'