X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=helpers%2Fd3dsize.hpp;h=156fdd225a3d51a3e52401e04435804ee8f9d8f5;hb=dd2a1c0627d0a64903878bec5d6dcb2cd69fd443;hp=79095011873501ad6791988fbb25247775102b16;hpb=e32a797c854b8f7b281fc9e5a4b6e3cafda58f25;p=apitrace diff --git a/helpers/d3dsize.hpp b/helpers/d3dsize.hpp index 7909501..156fdd2 100644 --- a/helpers/d3dsize.hpp +++ b/helpers/d3dsize.hpp @@ -37,6 +37,8 @@ /* We purposedly don't include any D3D header, so that this header can be used * with all D3D versions. */ +#include + #include "os.hpp" @@ -87,4 +89,291 @@ _indexDataSize(D3DPRIMITIVETYPE PrimitiveType, UINT PrimitiveCount, D3DFORMAT In } +#if DIRECT3D_VERSION >= 0x0800 + +/* + * Return the number of tokens for a given shader. + */ +static inline size_t +_shaderSize(const DWORD *pFunction) +{ + DWORD dwLength = 0; + + while (true) { + DWORD dwToken = pFunction[dwLength++]; + + switch (dwToken & D3DSI_OPCODE_MASK) { + case D3DSIO_COMMENT: + dwLength += (dwToken & D3DSI_COMMENTSIZE_MASK) >> D3DSI_COMMENTSIZE_SHIFT; + break; + + case D3DSIO_END: + if (dwToken != D3DSIO_END) { + os::log("apitrace: warning: %s: malformed END token\n", __FUNCTION__); + } + return dwLength * sizeof *pFunction; + } + } +} + + +static size_t +_getLockSize(D3DFORMAT Format, UINT Width, UINT Height, INT RowPitch, UINT Depth = 1, INT SlicePitch = 0) { + if (Width == 0 || Height == 0 || Depth == 0) { + return 0; + } + + if (RowPitch < 0) { + os::log("apitrace: warning: %s: negative row pitch %i\n", __FUNCTION__, RowPitch); + return 0; + } + + if (SlicePitch < 0) { + os::log("apitrace: warning: %s: negative slice pitch %i\n", __FUNCTION__, SlicePitch); + return 0; + } + + switch ((DWORD)Format) { + case D3DFMT_DXT1: + case D3DFMT_DXT2: + case D3DFMT_DXT3: + case D3DFMT_DXT4: + case D3DFMT_DXT5: + Width = (Width + 3) / 4; + Height = (Height + 3) / 4; + break; + + case D3DFMT_ATI1N: + case D3DFMT_ATI2N: + /* + * Because these are unsupported formats, RowPitch is not set to the + * number of bytes between row of blocks, but instead in such way that + * Height * RowPitch will match the expected size. + */ + break; + + case D3DFMT_UYVY: + case D3DFMT_R8G8_B8G8: + case D3DFMT_YUY2: + case D3DFMT_G8R8_G8B8: + Width = (Width + 1) / 2; + break; + + case D3DFMT_NV12: + return (Height + ((Height + 1) / 2)) * RowPitch; + + case D3DFMT_NULL: + return 0; + + default: + break; + } + + (void)Width; + + size_t size = Height * RowPitch; + + if (Depth > 1) { + size += (Depth - 1) * SlicePitch; + } + + return size; +} + + +#endif /* DIRECT3D_VERSION >= 0x0800 */ + + +#if DIRECT3D_VERSION >= 0x0900 + + +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; + } + LockedSize = Desc.Size; + } else { + LockedSize = SizeToLock; + } +} + + +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; + } + LockedSize = Desc.Size; + } else { + LockedSize = SizeToLock; + } +} + + +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; + } + + UINT Width; + UINT Height; + if (pRect) { + Width = pRect->right - pRect->left; + Height = pRect->bottom - pRect->top; + } else { + Width = Desc.Width; + Height = Desc.Height; + } + + LockedSize = _getLockSize(Desc.Format, Width, Height, pLockedRect->Pitch); +} + + +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; + } + + UINT Width; + UINT Height; + if (pRect) { + Width = pRect->right - pRect->left; + Height = pRect->bottom - pRect->top; + } else { + Width = Desc.Width; + Height = Desc.Height; + } + + LockedSize = _getLockSize(Desc.Format, Width, Height, pLockedRect->Pitch); +} + + +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; + + D3DSURFACE_DESC Desc; + hr = pTexture->GetLevelDesc(Level, &Desc); + if (FAILED(hr)) { + return; + } + + UINT Width; + UINT Height; + if (pRect) { + Width = pRect->right - pRect->left; + Height = pRect->bottom - pRect->top; + } else { + Width = Desc.Width; + Height = Desc.Height; + } + + LockedSize = _getLockSize(Desc.Format, Width, Height, pLockedRect->Pitch); +} + + +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; + } + + UINT Width; + UINT Height; + UINT Depth; + if (pBox) { + Width = pBox->Right - pBox->Left; + Height = pBox->Bottom - pBox->Top; + Depth = pBox->Back - pBox->Front; + } else { + Width = Desc.Width; + Height = Desc.Height; + Depth = Desc.Depth; + } + + LockedSize = _getLockSize(Desc.Format, Width, Height, pLockedVolume->RowPitch, Depth, pLockedVolume->SlicePitch); +} + + +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; + } + + UINT Width; + UINT Height; + UINT Depth; + if (pBox) { + Width = pBox->Right - pBox->Left; + Height = pBox->Bottom - pBox->Top; + Depth = pBox->Back - pBox->Front; + } else { + Width = Desc.Width; + Height = Desc.Height; + Depth = Desc.Depth; + } + + LockedSize = _getLockSize(Desc.Format, Width, Height, pLockedVolume->RowPitch, Depth, pLockedVolume->SlicePitch); +} + + +#endif /* DIRECT3D_VERSION >= 0x0900 */ + + #endif /* _D3D_SIZE_HPP_ */