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 '// Swizzling mapping for lock addresses'
- print 'static std::map<void *, void *> _locks;'
+ print 'static std::map<void *, void *> _maps;'
print
self.table_name = 'd3dretrace::d3d_callbacks'
Retracer.retraceApi(self, api)
+ def invokeFunction(self, function):
+ if function.name in ('Direct3DCreate9', 'Direct3DCreate9Ex'):
+ print 'if (retrace::debug && !g_szD3D9DllName) {'
+ print ' /* '
+ print ' * XXX: D3D9D only works for simple things, it often introduces errors'
+ print ' * on complex traces, or traces which use unofficial D3D9 features.'
+ print ' */'
+ print ' if (0) {'
+ print ' g_szD3D9DllName = "d3d9d.dll";'
+ print ' }'
+ print '}'
+
+ 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;'
+ print r' pLastDirect3DDevice9 = _this;'
# create windows as neccessary
if method.name in ('CreateDevice', 'CreateDeviceEx', 'CreateAdditionalSwapChain'):
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 ' _maps[_this] = _pbData;'
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 ' }'
#include "d3d9imports.hpp"
#include "d3d9size.hpp"
#include "d3dretrace.hpp"
+#include "d3d9state.hpp"
'''
retracer = D3DRetracer()
- retracer.retraceApi(d3d9)
+ retracer.retraceModule(d3d9)