From 4f49d21974343e282dbbe784ccc36ae29ddcbcfc Mon Sep 17 00:00:00 2001 From: =?utf8?q?Jos=C3=A9=20Fonseca?= Date: Wed, 14 Nov 2012 14:02:35 +0000 Subject: [PATCH] d3dretrace: More robust against DXGI missing calls. --- retrace/d3d9retrace.py | 6 ----- retrace/d3dcommonretrace.py | 49 +++++++++++++++++++++++++------------ retrace/retrace.py | 8 ++++++ 3 files changed, 41 insertions(+), 22 deletions(-) diff --git a/retrace/d3d9retrace.py b/retrace/d3d9retrace.py index 7c292f9..1b89b68 100644 --- a/retrace/d3d9retrace.py +++ b/retrace/d3d9retrace.py @@ -97,12 +97,6 @@ class D3DRetracer(Retracer): if method.name == 'Present': print r' d3dretrace::processEvents();' - # check errors - if str(method.type) == 'HRESULT': - print r' if (FAILED(_result)) {' - print r' retrace::warning(call) << "failed\n";' - print r' }' - if method.name in ('Lock', 'LockRect', 'LockBox'): print ' VOID *_pbData = NULL;' print ' size_t _MappedSize = 0;' diff --git a/retrace/d3dcommonretrace.py b/retrace/d3dcommonretrace.py index d3d68d1..4496b2c 100644 --- a/retrace/d3dcommonretrace.py +++ b/retrace/d3dcommonretrace.py @@ -47,16 +47,34 @@ class D3DRetracer(Retracer): Retracer.retraceApi(self, api) - def invokeFunction(self, function): - # create windows as neccessary - if function.name in ('D3D10CreateDeviceAndSwapChain', 'D3D10CreateDeviceAndSwapChain1', 'D3D11CreateDeviceAndSwapChain'): - print r' pSwapChainDesc->OutputWindow = d3dretrace::createWindow(512, 512);' + createDeviceFunctionNames = [ + "D3D10CreateDevice", + "D3D10CreateDeviceAndSwapChain", + "D3D10CreateDevice1", + "D3D10CreateDeviceAndSwapChain1", + "D3D11CreateDevice", + "D3D11CreateDeviceAndSwapChain", + ] - if 'Software' in function.argNames(): - print r' if (Software) {' - print r' retrace::warning(call) << "software device\n";' - print r' Software = LoadLibraryA("d3d10warp");' - print r' }' + def invokeFunction(self, function): + if function.name in self.createDeviceFunctionNames: + # create windows as neccessary + if 'pSwapChainDesc' in function.argNames(): + print r' pSwapChainDesc->OutputWindow = d3dretrace::createWindow(512, 512);' + + # 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) {' + print r' DriverType = D3D_DRIVER_TYPE_HARDWARE;' + print r' }' Retracer.invokeFunction(self, function) @@ -89,23 +107,22 @@ class D3DRetracer(Retracer): if method.name == 'Present': print r' d3dretrace::processEvents();' - # check errors - if str(method.type) == 'HRESULT': - print r' if (FAILED(_result)) {' - print r' retrace::warning(call) << "failed\n";' - print r' }' - if method.name == 'Map': print ' VOID *_pbData = NULL;' print ' size_t _MappedSize = 0;' print ' _getMapInfo(_this, %s, _pbData, _MappedSize);' % ', '.join(method.argNames()) - print ' _maps[_this] = _pbData;' + print ' if (_MappedSize) {' + print ' _maps[_this] = _pbData;' + print ' } else {' + print ' return;' + print ' }' if method.name == 'Unmap': print ' VOID *_pbData = 0;' print ' _pbData = _maps[_this];' print ' if (_pbData) {' print ' retrace::delRegionByPointer(_pbData);' + print ' _maps[_this] = 0;' print ' }' diff --git a/retrace/retrace.py b/retrace/retrace.py index 5b5812f..c4ad2d2 100644 --- a/retrace/retrace.py +++ b/retrace/retrace.py @@ -434,6 +434,7 @@ class Retracer: if function.type is not stdapi.Void: print ' _result = %s(%s);' % (function.name, arg_names) print ' (void)_result;' + self.checkResult(function.type) else: print ' %s(%s);' % (function.name, arg_names) @@ -450,9 +451,16 @@ class Retracer: if method.type is not stdapi.Void: print ' _result = _this->%s(%s);' % (method.name, arg_names) print ' (void)_result;' + self.checkResult(method.type) else: print ' _this->%s(%s);' % (method.name, arg_names) + def checkResult(self, resultType): + if str(resultType) == 'HRESULT': + print r' if (FAILED(_result)) {' + print r' retrace::warning(call) << "failed\n";' + print r' }' + def filterFunction(self, function): return True -- 2.43.0