X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=retrace%2Fd3dcommonretrace.py;h=4496b2c2376ebfc9cc76f58313bfe0997ed09e01;hb=8739fa62b41d54455447a27c4185371366bd726e;hp=75262c2c62a1457db7dbb677d82a8cf7be640c6a;hpb=81301939f025407ceb284a9dcd5d5a1f05d27b8f;p=apitrace diff --git a/retrace/d3dcommonretrace.py b/retrace/d3dcommonretrace.py index 75262c2..4496b2c 100644 --- a/retrace/d3dcommonretrace.py +++ b/retrace/d3dcommonretrace.py @@ -27,32 +27,65 @@ """D3D retracer generator.""" +import sys from dllretrace import DllRetracer as Retracer -import specs.stdapi as stdapi +from specs.stdapi import API +from specs.dxgi import dxgi +from specs.d3d10 import d3d10 +from specs.d3d10_1 import d3d10_1 +from specs.d3d11 import d3d11 class D3DRetracer(Retracer): - def retraceModule(self, api): + def retraceApi(self, api): 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.retraceModule(self, api) + 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': @@ -74,21 +107,64 @@ 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 ' }' + + +def main(): + print r'''#include ''' + print + print r'#include ' + print + print r'#include "d3dretrace.hpp"' + print + + moduleNames = sys.argv[1:] + + api = API() + if moduleNames: + api.addModule(dxgi) + if 'd3d10' in moduleNames: + if 'd3d10_1' in moduleNames: + print r'#include "d3d10_1imports.hpp"' + # D3D10CreateBlob is duplicated in d3d10 and d3d10_1 + d3d10_1.functions = [function for function in d3d10_1.functions if function.name != 'D3D10CreateBlob'] + api.addModule(d3d10_1) + else: + print r'#include "d3d10imports.hpp"' + print r'#include "d3d10size.hpp"' + api.addModule(d3d10) + if 'd3d11' in moduleNames: + print r'#include "d3d11imports.hpp"' + if 'd3d11_1' in moduleNames: + 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) + + +if __name__ == '__main__': + main()