from dlltrace import DllTracer
-from specs.d3d8 import d3d8
+from specs.stdapi import API
+from specs.d3d8 import d3d8, D3DSHADER8
class D3D8Tracer(DllTracer):
def serializeArgValue(self, function, arg):
# Dump shaders as strings
- if function.name in ('CreateVertexShader', 'CreatePixelShader') and arg.name == 'pFunction':
+ if arg.type is D3DSHADER8:
print ' DumpShader(trace::localWriter, %s);' % (arg.name)
return
DllTracer.serializeArgValue(self, function, arg)
+ def enumWrapperInterfaceVariables(self, interface):
+ variables = DllTracer.enumWrapperInterfaceVariables(self, interface)
+
+ # Add additional members to track locks
+ if interface.getMethodByName('Lock') is not None or \
+ interface.getMethodByName('LockRect') is not None or \
+ interface.getMethodByName('LockBox') is not None:
+ variables += [
+ ('size_t', '_MappedSize', '0'),
+ ('VOID *', 'm_pbData', '0'),
+ ]
+
+ return variables
+
+ def implementWrapperInterfaceMethodBody(self, interface, base, method):
+ if method.name in ('Unlock', 'UnlockRect', 'UnlockBox'):
+ print ' if (_MappedSize && m_pbData) {'
+ self.emit_memcpy('(LPBYTE)m_pbData', '(LPBYTE)m_pbData', '_MappedSize')
+ print ' }'
+
+ DllTracer.implementWrapperInterfaceMethodBody(self, interface, base, method)
+
+ if method.name in ('Lock', 'LockRect', 'LockBox'):
+ # FIXME: handle recursive locks
+ print ' if (SUCCEEDED(_result) && !(Flags & D3DLOCK_READONLY)) {'
+ print ' _getMapInfo(_this, %s, m_pbData, _MappedSize);' % ', '.join(method.argNames()[:-1])
+ print ' } else {'
+ print ' m_pbData = NULL;'
+ print ' _MappedSize = 0;'
+ print ' }'
+
if __name__ == '__main__':
print '#define INITGUID'
print
- print '#include <windows.h>'
- print '#include <d3d8.h>'
- print '#include "d3d9shader.hpp"'
- print
print '#include "trace_writer_local.hpp"'
print '#include "os.hpp"'
print
- tracer = D3D8Tracer('d3d8.dll')
- tracer.traceApi(d3d8)
+ print '#include "d3d8imports.hpp"'
+ print '#include "d3d8size.hpp"'
+ print '#include "d3d9shader.hpp"'
+ print
+ api = API()
+ api.addModule(d3d8)
+ tracer = D3D8Tracer()
+ tracer.traceApi(api)