From 6d5372b819f636f36b6390158a1ccacb4ca95c28 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Jos=C3=A9=20Fonseca?= Date: Mon, 30 Apr 2012 23:33:02 +0100 Subject: [PATCH] Use same logic for both Lock and LockRect. --- helpers/d3dsize.hpp | 30 ++++++++++++++++++++++++++++++ retrace/d3dretrace.py | 19 ++----------------- specs/d3d9.py | 4 ++-- wrappers/d3d9trace.py | 29 +++++------------------------ 4 files changed, 39 insertions(+), 43 deletions(-) diff --git a/helpers/d3dsize.hpp b/helpers/d3dsize.hpp index 97fccd3..92503fe 100644 --- a/helpers/d3dsize.hpp +++ b/helpers/d3dsize.hpp @@ -160,6 +160,36 @@ _formatSize(D3DFORMAT Format, UINT Width, UINT Height, INT Pitch) { #if DIRECT3D_VERSION >= 0x0900 +static inline size_t +_getLockSize(IDirect3DVertexBuffer9 *pBuffer, UINT OffsetToLock, UINT SizeToLock, void ** ppbData) { + if (SizeToLock == 0) { + D3DVERTEXBUFFER_DESC Desc; + HRESULT hr = pBuffer->GetDesc(&Desc); + if (FAILED(hr)) { + return 0; + } + SizeToLock = Desc.Size; + } + + return SizeToLock; +} + + +static inline size_t +_getLockSize(IDirect3DIndexBuffer9 *pBuffer, UINT OffsetToLock, UINT SizeToLock, void ** ppbData) { + if (SizeToLock == 0) { + D3DINDEXBUFFER_DESC Desc; + HRESULT hr = pBuffer->GetDesc(&Desc); + if (FAILED(hr)) { + return 0; + } + SizeToLock = Desc.Size; + } + + return SizeToLock; +} + + static inline size_t _getLockSize(IDirect3DSurface9 *pSurface, const D3DLOCKED_RECT *pLockedRect, const RECT *pRect) { HRESULT hr; diff --git a/retrace/d3dretrace.py b/retrace/d3dretrace.py index 36b75b1..8af5265 100644 --- a/retrace/d3dretrace.py +++ b/retrace/d3dretrace.py @@ -60,23 +60,8 @@ class D3DRetracer(Retracer): print r' retrace::warning(call) << "failed\n";' print r' }' - if interface.name in self.bufferInterfaceNames and method.name == 'Lock' or \ - method.name == 'LockRect': - - if interface.name in self.bufferInterfaceNames: - getDescMethod = interface.getMethodByName('GetDesc') - descArg = getDescMethod.args[0] - assert descArg.output - descType = getDescMethod.args[0].type.type - print ' if (!SizeToLock) {' - print ' %s Desc;' % descType - print ' _this->GetDesc(&Desc);' - print ' SizeToLock = Desc.Size;' - print ' }' - elif method.name == 'LockRect': - print ' size_t _LockedSize = _getLockSize(_this, %s);' % ', '.join(method.argNames()[:-1]) - else: - raise NotImplementedError + if method.name in ('Lock', 'LockRect'): + print ' size_t _LockedSize = _getLockSize(_this, %s);' % ', '.join(method.argNames()[:-1]) if __name__ == '__main__': diff --git a/specs/d3d9.py b/specs/d3d9.py index 2fd7755..78bd7da 100644 --- a/specs/d3d9.py +++ b/specs/d3d9.py @@ -347,13 +347,13 @@ IDirect3DCubeTexture9.methods += [ ] IDirect3DVertexBuffer9.methods += [ - Method(HRESULT, "Lock", [(UINT, "OffsetToLock"), (UINT, "SizeToLock"), Out(Pointer(LinearPointer(Void, "SizeToLock")), "ppbData"), (D3DLOCK, "Flags")]), + Method(HRESULT, "Lock", [(UINT, "OffsetToLock"), (UINT, "SizeToLock"), Out(Pointer(LinearPointer(Void, "_LockedSize")), "ppbData"), (D3DLOCK, "Flags")]), Method(HRESULT, "Unlock", []), Method(HRESULT, "GetDesc", [Out(Pointer(D3DVERTEXBUFFER_DESC), "pDesc")], sideeffects=False), ] IDirect3DIndexBuffer9.methods += [ - Method(HRESULT, "Lock", [(UINT, "OffsetToLock"), (UINT, "SizeToLock"), Out(Pointer(LinearPointer(Void, "SizeToLock")), "ppbData"), (D3DLOCK, "Flags")]), + Method(HRESULT, "Lock", [(UINT, "OffsetToLock"), (UINT, "SizeToLock"), Out(Pointer(LinearPointer(Void, "_LockedSize")), "ppbData"), (D3DLOCK, "Flags")]), Method(HRESULT, "Unlock", []), Method(HRESULT, "GetDesc", [Out(Pointer(D3DINDEXBUFFER_DESC), "pDesc")], sideeffects=False), ] diff --git a/wrappers/d3d9trace.py b/wrappers/d3d9trace.py index b2afdf9..dbace8f 100644 --- a/wrappers/d3d9trace.py +++ b/wrappers/d3d9trace.py @@ -38,49 +38,30 @@ class D3D9Tracer(DllTracer): DllTracer.serializeArgValue(self, function, arg) - bufferInterfaceNames = [ - 'IDirect3DVertexBuffer9', - 'IDirect3DIndexBuffer9', - ] - def declareWrapperInterfaceVariables(self, interface): DllTracer.declareWrapperInterfaceVariables(self, interface) - if interface.name in self.bufferInterfaceNames or \ + if interface.getMethodByName('Lock') is not None or \ interface.getMethodByName('LockRect') is not None: print ' size_t _LockedSize;' print ' VOID *m_pbData;' def implementWrapperInterfaceMethodBody(self, interface, base, method): - if interface.name in self.bufferInterfaceNames and method.name == 'Unlock' or \ - method.name == 'UnlockRect': + if method.name in ('Unlock', 'UnlockRect'): print ' if (m_pbData) {' self.emit_memcpy('(LPBYTE)m_pbData', '(LPBYTE)m_pbData', '_LockedSize') print ' }' DllTracer.implementWrapperInterfaceMethodBody(self, interface, base, method) - if interface.name in self.bufferInterfaceNames and method.name == 'Lock' or \ - method.name == 'LockRect': - + if method.name in ('Lock', 'LockRect'): print ' if (SUCCEEDED(_result) && !(Flags & D3DLOCK_READONLY)) {' - if interface.name in self.bufferInterfaceNames: + print ' _LockedSize = _getLockSize(_this, %s);' % ', '.join(method.argNames()[:-1]) + if method.name == 'Lock': # FIXME: handle recursive locks - getDescMethod = interface.getMethodByName('GetDesc') - descArg = getDescMethod.args[0] - assert descArg.output - descType = getDescMethod.args[0].type.type - print ' if (SizeToLock) {' - print ' _LockedSize = SizeToLock;' - print ' } else {' - print ' %s Desc;' % descType - print ' m_pInstance->GetDesc(&Desc);' - print ' _LockedSize = Desc.Size;' - print ' }' print ' m_pbData = *ppbData;' elif method.name == 'LockRect': - print ' _LockedSize = _getLockSize(_this, %s);' % ', '.join(method.argNames()[:-1]) print ' m_pbData = pLockedRect->pBits;' else: raise NotImplementedError -- 2.43.0