X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=wrappers%2Fd3d9trace.py;h=df401da5d090e7cd67b75018d8ba13f35cf20335;hb=d6c02fd58feb2b48be13a2405d0eb738ed62925a;hp=ef5a14c6f436aacdab461f6622af0bbfc85eacbd;hpb=93fa73af855d48fbd95ed50930bdb8ec50602ed6;p=apitrace diff --git a/wrappers/d3d9trace.py b/wrappers/d3d9trace.py index ef5a14c..df401da 100644 --- a/wrappers/d3d9trace.py +++ b/wrappers/d3d9trace.py @@ -25,7 +25,10 @@ from dlltrace import DllTracer -from specs.d3d9 import d3d9, D3DSHADER9 +from specs.stdapi import API, Pointer, ObjPointer +from specs.d3d9 import d3d9, D3DSHADER9, IDirect3DSwapChain9Ex + +import specs.d3d9dxva2 class D3D9Tracer(DllTracer): @@ -38,38 +41,45 @@ class D3D9Tracer(DllTracer): DllTracer.serializeArgValue(self, function, arg) - def declareWrapperInterfaceVariables(self, interface): - DllTracer.declareWrapperInterfaceVariables(self, interface) + def wrapArg(self, function, arg): + # Correctly handle the wrapping of IDirect3DSwapChain9Ex objects + if function.name in ('GetSwapChain', 'CreateAdditionalSwapChain') \ + and self.interface.name == 'IDirect3DDevice9Ex' \ + and arg.name == 'pSwapChain': + self.wrapValue(Pointer(ObjPointer(IDirect3DSwapChain9Ex)), '((IDirect3DSwapChain9Ex**)pSwapChain)') + return + + DllTracer.wrapArg(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: - print ' size_t _LockedSize;' - print ' VOID *m_pbData;' + 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 (m_pbData) {' - self.emit_memcpy('(LPBYTE)m_pbData', '(LPBYTE)m_pbData', '_LockedSize') + 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', 'LockedBox'): + if method.name in ('Lock', 'LockRect', 'LockBox'): + # FIXME: handle recursive locks print ' if (SUCCEEDED(_result) && !(Flags & D3DLOCK_READONLY)) {' - print ' _LockedSize = _getLockSize(_this, %s);' % ', '.join(method.argNames()[:-1]) - if method.name == 'Lock': - # FIXME: handle recursive locks - print ' m_pbData = *ppbData;' - elif method.name == 'LockRect': - print ' m_pbData = pLockedRect->pBits;' - elif method.name == 'LockBox': - print ' m_pbData = pLockedBox->pBits;' - else: - raise NotImplementedError + print ' _getMapInfo(_this, %s, m_pbData, _MappedSize);' % ', '.join(method.argNames()[:-1]) print ' } else {' print ' m_pbData = NULL;' + print ' _MappedSize = 0;' print ' }' @@ -80,20 +90,12 @@ if __name__ == '__main__': print '#include "os.hpp"' print print '#include "d3d9imports.hpp"' - print '#include "d3dsize.hpp"' - print '#include "d3dshader.hpp"' + print '#include "d3d9size.hpp"' + print '#include "d3d9shader.hpp"' + print '#include "dxvaint.h"' print - print ''' -static inline size_t -_declCount(const D3DVERTEXELEMENT9 *pVertexElements) { - size_t count = 0; - if (pVertexElements) { - while (pVertexElements[count++].Stream != 0xff) - ; - } - return count; -} -''' - tracer = D3D9Tracer('d3d9.dll') - tracer.traceApi(d3d9) + api = API() + api.addModule(d3d9) + tracer = D3D9Tracer() + tracer.traceApi(api)