X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=retrace%2Fd3dcommonretrace.py;h=4496b2c2376ebfc9cc76f58313bfe0997ed09e01;hb=cdefc48190b163312dc42ddae99025cdeae845d9;hp=9cd5da51f579cad0011edc22e80aa7071a351862;hpb=6f81033cecdb1b5663a3eaefba42fd4bd36211c1;p=apitrace diff --git a/retrace/d3dcommonretrace.py b/retrace/d3dcommonretrace.py index 9cd5da5..4496b2c 100644 --- a/retrace/d3dcommonretrace.py +++ b/retrace/d3dcommonretrace.py @@ -39,39 +39,53 @@ from specs.d3d11 import d3d11 class D3DRetracer(Retracer): def retraceApi(self, api): - print ''' -image::Image * -retrace::getSnapshot(void) { - return NULL; -} - - -bool -retrace::dumpState(std::ostream &os) -{ - return false; -} -''' - print '// Swizzling mapping for lock addresses' print 'static std::map _maps;' print - self.table_name = 'd3dretrace::d3d_callbacks' + self.table_name = 'd3dretrace::d3d10_callbacks' Retracer.retraceApi(self, api) + createDeviceFunctionNames = [ + "D3D10CreateDevice", + "D3D10CreateDeviceAndSwapChain", + "D3D10CreateDevice1", + "D3D10CreateDeviceAndSwapChain1", + "D3D11CreateDevice", + "D3D11CreateDeviceAndSwapChain", + ] + def invokeFunction(self, function): - # create windows as neccessary - if function.name in ('D3D10CreateDeviceAndSwapChain', 'D3D10CreateDeviceAndSwapChain1', 'D3D11CreateDeviceAndSwapChain'): - print r' pSwapChainDesc->OutputWindow = d3dretrace::createWindow(512, 512);' + 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) + def invokeInterfaceMethod(self, interface, method): # keep track of the last used device for state dumping - #if interface.name in ('IDirect3DDevice9', 'IDirect3DDevice9Ex'): - # print r' d3dretrace::pLastDirect3DDevice9 = _this;' + if interface.name in ('ID3D11DeviceContext',): + if method.name == 'Release': + print r' d3d11Dumper.unbindDevice(_this);' + else: + print r' d3d11Dumper.bindDevice(_this);' # create windows as neccessary if method.name == 'CreateSwapChain': @@ -93,23 +107,22 @@ retrace::dumpState(std::ostream &os) 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 ' }' @@ -142,7 +155,12 @@ def main(): print '#include ' import specs.d3d11_1 print r'#include "d3d11size.hpp"' + print r'#include "d3dstate.hpp"' api.addModule(d3d11) + + print + print '''static d3dretrace::D3DDumper d3d11Dumper;''' + print retracer = D3DRetracer() retracer.retraceApi(api)