X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=wrappers%2Fd3d8trace.py;h=9ce3aad08f802144c7ec3ebf7441b0b051aa9c82;hb=HEAD;hp=09377cb3dc3f3e9019e17a8f740a80abfd55ff48;hpb=452d3256a3ba7f249222ef857d69c8caaaa753f3;p=apitrace diff --git a/wrappers/d3d8trace.py b/wrappers/d3d8trace.py index 09377cb..9ce3aad 100644 --- a/wrappers/d3d8trace.py +++ b/wrappers/d3d8trace.py @@ -25,30 +25,64 @@ 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 ' - print '#include ' - print '#include "d3dshader.hpp"' - print print '#include "trace_writer_local.hpp"' print '#include "os.hpp"' print - tracer = D3D8Tracer('d3d8.dll') - tracer.trace_api(d3d8) + print '#include "d3d8imports.hpp"' + print '#include "d3d8size.hpp"' + print '#include "d3d9shader.hpp"' + print + api = API() + api.addModule(d3d8) + tracer = D3D8Tracer() + tracer.traceApi(api)