from dllretrace import DllRetracer as Retracer
-import specs.stdapi as stdapi
+from specs.stdapi import API
from specs.d3d9 import *
class D3DRetracer(Retracer):
def retraceApi(self, api):
- print '''
-static IDirect3DDevice9 *
-pLastDirect3DDevice9 = NULL;
-
-image::Image *
-retrace::getSnapshot(void) {
- if (!pLastDirect3DDevice9) {
- return NULL;
- }
- return d3dstate::getRenderTargetImage(pLastDirect3DDevice9);
-}
-
-
-bool
-retrace::dumpState(std::ostream &os)
-{
- if (!pLastDirect3DDevice9) {
- return false;
- }
- d3dstate::dumpDevice(os, pLastDirect3DDevice9);
- return true;
-}
-'''
+ print '''static d3dretrace::D3DDumper<IDirect3DDevice9> d3d9Dumper;'''
+ print
print '// Swizzling mapping for lock addresses'
print 'static std::map<void *, void *> _maps;'
print
- self.table_name = 'd3dretrace::d3d_callbacks'
+ self.table_name = 'd3dretrace::d3d9_callbacks'
Retracer.retraceApi(self, api)
def invokeInterfaceMethod(self, interface, method):
# keep track of the last used device for state dumping
if interface.name in ('IDirect3DDevice9', 'IDirect3DDevice9Ex'):
- print r' 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'):
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;'
#include "d3d9imports.hpp"
#include "d3d9size.hpp"
#include "d3dretrace.hpp"
-#include "d3d9state.hpp"
+#include "d3dstate.hpp"
'''
+ api = API()
+ api.addModule(d3d9)
retracer = D3DRetracer()
- retracer.retraceModule(d3d9)
+ retracer.retraceApi(api)