X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=wrappers%2Fd3d8trace.py;h=fd2c8f5303fc759c7712f03cdef8c235f7bc3e0c;hb=cccdffb093041c7dd507e3d523103a0c623c6ddd;hp=2abaf4e54f27923f45bfa66964ebacfe6a53c624;hpb=ebb75cb923eafe61a1a6dc585a5d7384ee0083c7;p=apitrace diff --git a/wrappers/d3d8trace.py b/wrappers/d3d8trace.py index 2abaf4e..fd2c8f5 100644 --- a/wrappers/d3d8trace.py +++ b/wrappers/d3d8trace.py @@ -26,31 +26,62 @@ from dlltrace import DllTracer from specs.stdapi import API -from specs.d3d8 import d3d8 +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 "trace_writer_local.hpp"' + print '#include "os.hpp"' + print print '#include ' print '#include ' + print '#include "d3d8size.hpp"' print '#include "d3d9shader.hpp"' print - print '#include "trace_writer_local.hpp"' - print '#include "os.hpp"' - print - api = API() api.addModule(d3d8)