from dlltrace import DllTracer
-from specs.d3d9 import d3d9
+from specs.stdapi import API
+from specs.d3d9 import d3d9, D3DSHADER9
+
+import specs.d3d9dxva2
class D3D9Tracer(DllTracer):
def serializeArgValue(self, function, arg):
# Dump shaders as strings
- if function.name in ('CreateVertexShader', 'CreatePixelShader') and arg.name == 'pFunction':
+ if arg.type is D3DSHADER9:
print ' DumpShader(trace::localWriter, %s);' % (arg.name)
return
DllTracer.serializeArgValue(self, function, arg)
- def declareWrapperInterfaceVariables(self, interface):
- DllTracer.declareWrapperInterfaceVariables(self, interface)
+ def enumWrapperInterfaceVariables(self, interface):
+ variables = DllTracer.enumWrapperInterfaceVariables(self, interface)
- if interface.name == 'IDirect3DVertexBuffer9':
- print ' UINT m_SizeToLock;'
- print ' VOID *m_pbData;'
+ # 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 interface.name == 'IDirect3DVertexBuffer9' and method.name == 'Unlock':
- print ' if (m_pbData) {'
- self.emit_memcpy('(LPBYTE)m_pbData', '(LPBYTE)m_pbData', 'm_SizeToLock')
+ 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 interface.name == 'IDirect3DVertexBuffer9' and method.name == 'Lock':
+ if method.name in ('Lock', 'LockRect', 'LockBox'):
# FIXME: handle recursive locks
- print ' if (__result == D3D_OK && !(Flags & D3DLOCK_READONLY)) {'
- print ' if (SizeToLock) {'
- print ' m_SizeToLock = SizeToLock;'
- print ' } else {'
- print ' D3DVERTEXBUFFER_DESC Desc;'
- print ' m_pInstance->GetDesc(&Desc);'
- print ' m_SizeToLock = Desc.Size;'
- print ' }'
- print ' m_pbData = *ppbData;'
+ 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 ' }'
print '#include "os.hpp"'
print
print '#include "d3d9imports.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)