X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=retrace%2Fd3d9retrace.py;h=9bc9628d59e7f398e4c6f791b8756e715fc336d9;hb=52cd6f0c427a1345ffeb578c01294bf602f16894;hp=c175705e2dd036f21b4903cb672856dca29e5945;hpb=81301939f025407ceb284a9dcd5d5a1f05d27b8f;p=apitrace diff --git a/retrace/d3d9retrace.py b/retrace/d3d9retrace.py index c175705..9bc9628 100644 --- a/retrace/d3d9retrace.py +++ b/retrace/d3d9retrace.py @@ -27,21 +27,19 @@ """D3D retracer generator.""" +import sys from dllretrace import DllRetracer as Retracer -import specs.stdapi as stdapi -from specs.d3d9 import * +from specs.stdapi import API class D3DRetracer(Retracer): - def retraceModule(self, api): + def retraceApi(self, api): print '// Swizzling mapping for lock addresses' - print 'static std::map _locks;' + print 'static std::map _maps;' print - self.table_name = 'd3dretrace::d3d_callbacks' - - Retracer.retraceModule(self, api) + Retracer.retraceApi(self, api) def invokeFunction(self, function): if function.name in ('Direct3DCreate9', 'Direct3DCreate9Ex'): @@ -60,7 +58,10 @@ class D3DRetracer(Retracer): 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 method.name == 'Release': + print r' d3d9Dumper.unbindDevice(_this);' + else: + print r' d3d9Dumper.bindDevice(_this);' # create windows as neccessary if method.name in ('CreateDevice', 'CreateDeviceEx', 'CreateAdditionalSwapChain'): @@ -91,37 +92,63 @@ 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 _LockedSize = 0;' - print ' _getLockInfo(_this, %s, _pbData, _LockedSize);' % ', '.join(method.argNames()[:-1]) - print ' _locks[_this] = _pbData;' + print ' size_t _MappedSize = 0;' + print ' _getMapInfo(_this, %s, _pbData, _MappedSize);' % ', '.join(method.argNames()[:-1]) + print ' if (_MappedSize) {' + print ' _maps[_this] = _pbData;' + print ' } else {' + print ' return;' + print ' }' if method.name in ('Unlock', 'UnlockRect', 'UnlockBox'): print ' VOID *_pbData = 0;' - print ' _pbData = _locks[_this];' + print ' _pbData = _maps[_this];' print ' if (_pbData) {' print ' retrace::delRegionByPointer(_pbData);' + print ' _maps[_this] = 0;' print ' }' -if __name__ == '__main__': - print r''' -#include +def main(): + print r'#include ' + print + print r'#include ' + print + print r'#include "d3dretrace.hpp"' + print + + moduleName = sys.argv[1] + support = int(sys.argv[2]) + + api = API() + + if support: + if moduleName == 'd3d9': + from specs.d3d9 import d3d9 + print r'#include "d3d9imports.hpp"' + print r'#include "d3d9size.hpp"' + api.addModule(d3d9) + print + print '''static d3dretrace::D3DDumper d3d9Dumper;''' + print + elif moduleName == 'd3d8': + from specs.d3d8 import d3d8 + print r'#include ' + print r'#include ' + print r'#include "d3d8size.hpp"' + api.addModule(d3d8) + print + #print '''static d3dretrace::D3DDumper d3d8Dumper;''' + print + else: + assert False -#include - -#include "d3d9imports.hpp" -#include "d3d9size.hpp" -#include "d3dretrace.hpp" + retracer = D3DRetracer() + retracer.table_name = 'd3dretrace::%s_callbacks' % moduleName + retracer.retraceApi(api) -''' - retracer = D3DRetracer() - retracer.retraceModule(d3d9) +if __name__ == '__main__': + main()