From: José Fonseca Date: Sun, 29 Apr 2012 22:22:52 +0000 (+0100) Subject: Factor out the lock rect size computation. X-Git-Url: https://git.cworth.org/git?p=apitrace;a=commitdiff_plain;h=a0e97860386786fcdb106471a3908b4ba66242e6 Factor out the lock rect size computation. --- diff --git a/helpers/d3dsize.hpp b/helpers/d3dsize.hpp index ef3bdff..1697dd6 100644 --- a/helpers/d3dsize.hpp +++ b/helpers/d3dsize.hpp @@ -116,7 +116,69 @@ _shaderSize(const DWORD *pFunction) } } + +static size_t +_formatSize(D3DFORMAT Format, UINT Width, UINT Height, INT Pitch) { + switch ((DWORD)Format) { + case D3DFMT_DXT1: + case D3DFMT_DXT2: + case D3DFMT_DXT3: + case D3DFMT_DXT4: + case D3DFMT_DXT5: + case D3DFMT_ATI1: + case D3DFMT_ATI2: + Width /= 4; + Height /= 4; + break; + + case D3DFMT_UYVY: + case D3DFMT_R8G8_B8G8: + case D3DFMT_YUY2: + case D3DFMT_G8R8_G8B8: + Width /= 2; + break; + + case D3DFMT_NV12: + return (Height + ((Height + 1) / 2)) * Pitch; + + case D3DFMT_NULL: + return 0; + + default: + break; + } + + (void)Width; + + return Height * Pitch; +} + + #endif /* DIRECT3D_VERSION >= 0x0800 */ +#if DIRECT3D_VERSION >= 0x0900 + +static inline size_t +_lockSize(IDirect3DSurface9 *pSurface, const D3DLOCKED_RECT *pLockedRect, const RECT *pRect) { + D3DSURFACE_DESC Desc; + pSurface->GetDesc(&Desc); + + UINT Width; + UINT Height; + if (pRect) { + Width = pRect->right - pRect->left; + Height = pRect->bottom - pRect->top; + } else { + Width = Desc.Width; + Height = Desc.Height; + } + + return _formatSize(Desc.Format, Width, Height, pLockedRect->Pitch); +} + + +#endif /* DIRECT3D_VERSION >= 0x0900 */ + + #endif /* _D3D_SIZE_HPP_ */ diff --git a/retrace/d3dretrace.py b/retrace/d3dretrace.py index c3bec0e..f1e8a68 100644 --- a/retrace/d3dretrace.py +++ b/retrace/d3dretrace.py @@ -74,20 +74,7 @@ class D3DRetracer(Retracer): print ' SizeToLock = Desc.Size;' print ' }' elif interface.name == 'IDirect3DSurface9': - print ' UINT Width;' - print ' UINT Height;' - print ' if (pRect) {' - print ' Width = pRect->right - pRect->left;' - print ' Height = pRect->bottom - pRect->top;' - print ' } else {' - print ' %s Desc;' % descType - print ' _this->GetDesc(&Desc);' - print ' Width = Desc.Width;' - print ' Height = Desc.Height;' - print ' }' - print ' UINT m_SizeToLock = Height * pLockedRect->Pitch;' - # TODO: take in consideration the width and pixels and blocks - print ' (void)Width;' + print ' size_t m_SizeToLock = _lockSize(_this, pLockedRect, pRect);' if __name__ == '__main__': @@ -97,6 +84,7 @@ if __name__ == '__main__': #include #include "d3d9imports.hpp" +#include "d3dsize.hpp" #include "d3dretrace.hpp" diff --git a/wrappers/d3d9trace.py b/wrappers/d3d9trace.py index 300cfa2..566ac76 100644 --- a/wrappers/d3d9trace.py +++ b/wrappers/d3d9trace.py @@ -80,20 +80,7 @@ class D3D9Tracer(DllTracer): print ' }' print ' m_pbData = *ppbData;' elif interface.name == 'IDirect3DSurface9': - print ' UINT Width;' - print ' UINT Height;' - print ' if (pRect) {' - print ' Width = pRect->right - pRect->left;' - print ' Height = pRect->bottom - pRect->top;' - print ' } else {' - print ' %s Desc;' % descType - print ' m_pInstance->GetDesc(&Desc);' - print ' Width = Desc.Width;' - print ' Height = Desc.Height;' - print ' }' - print ' m_SizeToLock = Height * pLockedRect->Pitch;' - # TODO: take in consideration the width and pixels and blocks - print ' (void)Width;' + print ' m_SizeToLock = _lockSize(_this, pLockedRect, pRect);' print ' m_pbData = pLockedRect->pBits;' else: raise NotImplementedError diff --git a/wrappers/trace.py b/wrappers/trace.py index 8bffbfb..eea2fdc 100644 --- a/wrappers/trace.py +++ b/wrappers/trace.py @@ -564,6 +564,9 @@ class Tracer: def implementWrapperInterfaceMethodBody(self, interface, base, method): print ' static const char * _args[%u] = {%s};' % (len(method.args) + 1, ', '.join(['"this"'] + ['"%s"' % arg.name for arg in method.args])) print ' static const trace::FunctionSig _sig = {%u, "%s", %u, _args};' % (method.id, interface.name + '::' + method.name, len(method.args) + 1) + + print ' %s *_this = static_cast<%s *>(m_pInstance);' % (base, base) + print ' unsigned _call = trace::localWriter.beginEnter(&_sig);' print ' trace::localWriter.beginArg(0);' print ' trace::localWriter.writePointer((uintptr_t)m_pInstance);' @@ -647,7 +650,7 @@ class Tracer: result = '' else: result = '_result = ' - print ' %sstatic_cast<%s *>(m_pInstance)->%s(%s);' % (result, base, method.name, ', '.join([str(arg.name) for arg in method.args])) + print ' %s_this->%s(%s);' % (result, method.name, ', '.join([str(arg.name) for arg in method.args])) def emit_memcpy(self, dest, src, length): print ' unsigned _call = trace::localWriter.beginEnter(&trace::memcpy_sig);'