From: José Fonseca Date: Tue, 8 May 2012 22:23:38 +0000 (+0100) Subject: Refactor d3d9 lock tracking code further. X-Git-Url: https://git.cworth.org/git?p=apitrace;a=commitdiff_plain;h=945dff19caa3e325573e8a479bce49234d5a9668 Refactor d3d9 lock tracking code further. --- diff --git a/helpers/d3dsize.hpp b/helpers/d3dsize.hpp index 9a1102a..156fdd2 100644 --- a/helpers/d3dsize.hpp +++ b/helpers/d3dsize.hpp @@ -187,45 +187,57 @@ _getLockSize(D3DFORMAT Format, UINT Width, UINT Height, INT RowPitch, UINT Depth #if DIRECT3D_VERSION >= 0x0900 -static inline size_t -_getLockSize(IDirect3DVertexBuffer9 *pBuffer, UINT OffsetToLock, UINT SizeToLock, void ** ppbData) { +static inline void +_getLockInfo(IDirect3DVertexBuffer9 *pBuffer, UINT OffsetToLock, UINT SizeToLock, void ** ppbData, + void * & pLockedData, size_t & LockedSize) { + pLockedData = *ppbData; + LockedSize = 0; + if (SizeToLock == 0) { D3DVERTEXBUFFER_DESC Desc; HRESULT hr = pBuffer->GetDesc(&Desc); if (FAILED(hr)) { - return 0; - } - SizeToLock = Desc.Size; + return; + } + LockedSize = Desc.Size; + } else { + LockedSize = SizeToLock; } - - return SizeToLock; } -static inline size_t -_getLockSize(IDirect3DIndexBuffer9 *pBuffer, UINT OffsetToLock, UINT SizeToLock, void ** ppbData) { +static inline void +_getLockInfo(IDirect3DIndexBuffer9 *pBuffer, UINT OffsetToLock, UINT SizeToLock, void ** ppbData, + void * & pLockedData, size_t & LockedSize) { + pLockedData = *ppbData; + LockedSize = 0; + if (SizeToLock == 0) { D3DINDEXBUFFER_DESC Desc; HRESULT hr = pBuffer->GetDesc(&Desc); if (FAILED(hr)) { - return 0; - } - SizeToLock = Desc.Size; + return; + } + LockedSize = Desc.Size; + } else { + LockedSize = SizeToLock; } - - return SizeToLock; } -static inline size_t -_getLockSize(IDirect3DSurface9 *pSurface, const D3DLOCKED_RECT *pLockedRect, const RECT *pRect) { +static inline void +_getLockInfo(IDirect3DSurface9 *pSurface, const D3DLOCKED_RECT *pLockedRect, const RECT *pRect, + void * & pLockedData, size_t & LockedSize) { + pLockedData = pLockedRect->pBits; + LockedSize = 0; + HRESULT hr; D3DSURFACE_DESC Desc; hr = pSurface->GetDesc(&Desc); if (FAILED(hr)) { - return 0; - } + return; + } UINT Width; UINT Height; @@ -237,18 +249,22 @@ _getLockSize(IDirect3DSurface9 *pSurface, const D3DLOCKED_RECT *pLockedRect, con Height = Desc.Height; } - return _getLockSize(Desc.Format, Width, Height, pLockedRect->Pitch); + LockedSize = _getLockSize(Desc.Format, Width, Height, pLockedRect->Pitch); } -static inline size_t -_getLockSize(IDirect3DTexture9 *pTexture, UINT Level, const D3DLOCKED_RECT *pLockedRect, const RECT *pRect) { +static inline void +_getLockInfo(IDirect3DTexture9 *pTexture, UINT Level, const D3DLOCKED_RECT *pLockedRect, const RECT *pRect, + void * & pLockedData, size_t & LockedSize) { + pLockedData = pLockedRect->pBits; + LockedSize = 0; + HRESULT hr; D3DSURFACE_DESC Desc; hr = pTexture->GetLevelDesc(Level, &Desc); if (FAILED(hr)) { - return 0; + return; } UINT Width; @@ -261,12 +277,16 @@ _getLockSize(IDirect3DTexture9 *pTexture, UINT Level, const D3DLOCKED_RECT *pLoc Height = Desc.Height; } - return _getLockSize(Desc.Format, Width, Height, pLockedRect->Pitch); + LockedSize = _getLockSize(Desc.Format, Width, Height, pLockedRect->Pitch); } -static inline size_t -_getLockSize(IDirect3DCubeTexture9 *pTexture, D3DCUBEMAP_FACES FaceType, UINT Level, const D3DLOCKED_RECT *pLockedRect, const RECT *pRect) { +static inline void +_getLockInfo(IDirect3DCubeTexture9 *pTexture, D3DCUBEMAP_FACES FaceType, UINT Level, const D3DLOCKED_RECT *pLockedRect, const RECT *pRect, + void * & pLockedData, size_t & LockedSize) { + pLockedData = pLockedRect->pBits; + LockedSize = 0; + HRESULT hr; (void)FaceType; @@ -274,7 +294,7 @@ _getLockSize(IDirect3DCubeTexture9 *pTexture, D3DCUBEMAP_FACES FaceType, UINT Le D3DSURFACE_DESC Desc; hr = pTexture->GetLevelDesc(Level, &Desc); if (FAILED(hr)) { - return 0; + return; } UINT Width; @@ -287,18 +307,22 @@ _getLockSize(IDirect3DCubeTexture9 *pTexture, D3DCUBEMAP_FACES FaceType, UINT Le Height = Desc.Height; } - return _getLockSize(Desc.Format, Width, Height, pLockedRect->Pitch); + LockedSize = _getLockSize(Desc.Format, Width, Height, pLockedRect->Pitch); } -static inline size_t -_getLockSize(IDirect3DVolume9 *pVolume, const D3DLOCKED_BOX *pLockedVolume, const D3DBOX *pBox) { +static inline void +_getLockInfo(IDirect3DVolume9 *pVolume, const D3DLOCKED_BOX *pLockedVolume, const D3DBOX *pBox, + void * & pLockedData, size_t & LockedSize) { + pLockedData = pLockedVolume->pBits; + LockedSize = 0; + HRESULT hr; D3DVOLUME_DESC Desc; hr = pVolume->GetDesc(&Desc); if (FAILED(hr)) { - return 0; + return; } UINT Width; @@ -314,18 +338,22 @@ _getLockSize(IDirect3DVolume9 *pVolume, const D3DLOCKED_BOX *pLockedVolume, cons Depth = Desc.Depth; } - return _getLockSize(Desc.Format, Width, Height, pLockedVolume->RowPitch, Depth, pLockedVolume->SlicePitch); + LockedSize = _getLockSize(Desc.Format, Width, Height, pLockedVolume->RowPitch, Depth, pLockedVolume->SlicePitch); } -static inline size_t -_getLockSize(IDirect3DVolumeTexture9 *pTexture, UINT Level, const D3DLOCKED_BOX *pLockedVolume, const D3DBOX *pBox) { +static inline void +_getLockInfo(IDirect3DVolumeTexture9 *pTexture, UINT Level, const D3DLOCKED_BOX *pLockedVolume, const D3DBOX *pBox, + void * & pLockedData, size_t & LockedSize) { + pLockedData = pLockedVolume->pBits; + LockedSize = 0; + HRESULT hr; D3DVOLUME_DESC Desc; hr = pTexture->GetLevelDesc(Level, &Desc); if (FAILED(hr)) { - return 0; + return; } UINT Width; @@ -341,7 +369,7 @@ _getLockSize(IDirect3DVolumeTexture9 *pTexture, UINT Level, const D3DLOCKED_BOX Depth = Desc.Depth; } - return _getLockSize(Desc.Format, Width, Height, pLockedVolume->RowPitch, Depth, pLockedVolume->SlicePitch); + LockedSize = _getLockSize(Desc.Format, Width, Height, pLockedVolume->RowPitch, Depth, pLockedVolume->SlicePitch); } diff --git a/retrace/d3dretrace.py b/retrace/d3dretrace.py index fd0e573..cbf57d4 100644 --- a/retrace/d3dretrace.py +++ b/retrace/d3dretrace.py @@ -71,25 +71,18 @@ class D3DRetracer(Retracer): print r' }' if method.name in ('Lock', 'LockRect', 'LockBox'): - print ' size_t _LockedSize = _getLockSize(_this, %s);' % ', '.join(method.argNames()[:-1]) - if method.name == 'Lock': - # FIXME: handle recursive locks - print ' VOID *_pbData = *ppbData;' - elif method.name == 'LockRect': - print ' VOID *_pbData = pLockedRect->pBits;' - elif method.name == 'LockBox': - print ' VOID *_pbData = pLockedVolume->pBits;' - else: - raise NotImplementedError - print ' _this->SetPrivateData(GUID_APITRACE, &_pbData, sizeof _pbData, 0);' + print ' VOID *_pbData = NULL;' + print ' size_t _LockedSize = 0;' + print ' _getLockInfo(_this, %s, _pbData, _LockedSize);' % ', '.join(method.argNames()[:-1]) + print ' _this->SetPrivateData(GUID_APITRACE, &_pbData, sizeof _pbData, 0);' if method.name in ('Unlock', 'UnlockRect', 'UnlockBox'): - print ' VOID *_pbData = 0;' - print ' DWORD dwSizeOfData = sizeof _pbData;' - print ' _this->GetPrivateData(GUID_APITRACE, &_pbData, &dwSizeOfData);' - print ' if (_pbData) {' - print ' retrace::delRegionByPointer(_pbData);' - print ' }' + print ' VOID *_pbData = 0;' + print ' DWORD dwSizeOfData = sizeof _pbData;' + print ' _this->GetPrivateData(GUID_APITRACE, &_pbData, &dwSizeOfData);' + print ' if (_pbData) {' + print ' retrace::delRegionByPointer(_pbData);' + print ' }' if __name__ == '__main__': diff --git a/wrappers/d3d9trace.py b/wrappers/d3d9trace.py index c82d525..8d71a3c 100644 --- a/wrappers/d3d9trace.py +++ b/wrappers/d3d9trace.py @@ -60,19 +60,12 @@ class D3D9Tracer(DllTracer): 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 ' _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 = pLockedVolume->pBits;' - else: - raise NotImplementedError + print ' _getLockInfo(_this, %s, m_pbData, _LockedSize);' % ', '.join(method.argNames()[:-1]) print ' } else {' print ' m_pbData = NULL;' + print ' _LockedSize = 0;' print ' }'