From 1e6a38967cc09c146e28fce1689a3f48e7d74e6c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20D=C3=B6singer?= Date: Fri, 13 Oct 2006 12:14:59 +0200 Subject: [PATCH] d3d8: Implement CopyRects with BltFast. --- dlls/d3d8/device.c | 59 ++++++++++++- dlls/wined3d/device.c | 144 ------------------------------- include/wine/wined3d_interface.h | 2 - 3 files changed, 55 insertions(+), 150 deletions(-) diff --git a/dlls/d3d8/device.c b/dlls/d3d8/device.c index 380a8ff1651..1532d996ce8 100644 --- a/dlls/d3d8/device.c +++ b/dlls/d3d8/device.c @@ -570,12 +570,63 @@ static HRESULT WINAPI IDirect3DDevice8Impl_CreateImageSurface(LPDIRECT3DDEVICE8 } static HRESULT WINAPI IDirect3DDevice8Impl_CopyRects(LPDIRECT3DDEVICE8 iface, IDirect3DSurface8 *pSourceSurface, CONST RECT *pSourceRects, UINT cRects, IDirect3DSurface8 *pDestinationSurface, CONST POINT *pDestPoints) { - IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface; + IDirect3DSurface8Impl *Source = (IDirect3DSurface8Impl *) pSourceSurface; + IDirect3DSurface8Impl *Dest = (IDirect3DSurface8Impl *) pDestinationSurface; - TRACE("(%p) Relay\n" , This); + HRESULT hr = WINED3D_OK; + WINED3DFORMAT srcFormat, destFormat; + UINT srcWidth, destWidth; + UINT srcHeight, destHeight; + UINT srcSize; + WINED3DSURFACE_DESC winedesc; - return IWineD3DDevice_CopyRects(This->WineD3DDevice, pSourceSurface == NULL ? NULL : ((IDirect3DSurface8Impl *)pSourceSurface)->wineD3DSurface, - pSourceRects, cRects, pDestinationSurface == NULL ? NULL : ((IDirect3DSurface8Impl *)pDestinationSurface)->wineD3DSurface, pDestPoints); + TRACE("(%p) pSrcSur=%p, pSourceRects=%p, cRects=%d, pDstSur=%p, pDestPtsArr=%p\n", iface, + pSourceSurface, pSourceRects, cRects, pDestinationSurface, pDestPoints); + + + /* Check that the source texture is in WINED3DPOOL_SYSTEMMEM and the destination texture is in WINED3DPOOL_DEFAULT */ + memset(&winedesc, 0, sizeof(winedesc)); + + winedesc.Format = &srcFormat; + winedesc.Width = &srcWidth; + winedesc.Height = &srcHeight; + winedesc.Size = &srcSize; + IWineD3DSurface_GetDesc(Source->wineD3DSurface, &winedesc); + + winedesc.Format = &destFormat; + winedesc.Width = &destWidth; + winedesc.Height = &destHeight; + winedesc.Size = NULL; + IWineD3DSurface_GetDesc(Dest->wineD3DSurface, &winedesc); + + /* Check that the source and destination formats match */ + if (srcFormat != destFormat && WINED3DFMT_UNKNOWN != destFormat) { + WARN("(%p) source %p format must match the dest %p format, returning WINED3DERR_INVALIDCALL\n", iface, pSourceSurface, pDestinationSurface); + return WINED3DERR_INVALIDCALL; + } else if (WINED3DFMT_UNKNOWN == destFormat) { + TRACE("(%p) : Converting destination surface from WINED3DFMT_UNKNOWN to the source format\n", iface); + IWineD3DSurface_SetFormat(Dest->wineD3DSurface, srcFormat); + destFormat = srcFormat; + } + + /* Quick if complete copy ... */ + if (cRects == 0 && pSourceRects == NULL && pDestPoints == NULL) { + IWineD3DSurface_BltFast(Dest->wineD3DSurface, 0, 0, Source->wineD3DSurface, NULL, DDBLTFAST_NOCOLORKEY); + } else { + unsigned int i; + /* Copy rect by rect */ + if (NULL != pSourceRects && NULL != pDestPoints) { + for (i = 0; i < cRects; ++i) { + IWineD3DSurface_BltFast(Dest->wineD3DSurface, pDestPoints[i].x, pDestPoints[i].y, Source->wineD3DSurface, (RECT *) &pSourceRects[i], DDBLTFAST_NOCOLORKEY); + } + } else { + for (i = 0; i < cRects; ++i) { + IWineD3DSurface_BltFast(Dest->wineD3DSurface, 0, 0, Source->wineD3DSurface, (RECT *) &pSourceRects[i], DDBLTFAST_NOCOLORKEY); + } + } + } + + return hr; } static HRESULT WINAPI IDirect3DDevice8Impl_UpdateTexture(LPDIRECT3DDEVICE8 iface, IDirect3DBaseTexture8* pSourceTexture, IDirect3DBaseTexture8* pDestinationTexture) { diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c index 5c52ed88eb8..b9216612ca9 100644 --- a/dlls/wined3d/device.c +++ b/dlls/wined3d/device.c @@ -6821,149 +6821,6 @@ static HRESULT WINAPI IWineD3DDeviceImpl_UpdateSurface(IWineD3DDevice *iface, return WINED3D_OK; } -/* Used by DirectX 8 */ -static HRESULT WINAPI IWineD3DDeviceImpl_CopyRects(IWineD3DDevice *iface, - IWineD3DSurface* pSourceSurface, CONST RECT* pSourceRectsArray, UINT cRects, - IWineD3DSurface* pDestinationSurface, CONST POINT* pDestPointsArray) { - - IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; - HRESULT hr = WINED3D_OK; - WINED3DFORMAT srcFormat, destFormat; - UINT srcWidth, destWidth; - UINT srcHeight, destHeight; - UINT srcSize; - WINED3DSURFACE_DESC winedesc; - - TRACE("(%p) pSrcSur=%p, pSourceRects=%p, cRects=%d, pDstSur=%p, pDestPtsArr=%p\n", This, - pSourceSurface, pSourceRectsArray, cRects, pDestinationSurface, pDestPointsArray); - - - /* Check that the source texture is in WINED3DPOOL_SYSTEMMEM and the destination texture is in WINED3DPOOL_DEFAULT */ - memset(&winedesc, 0, sizeof(winedesc)); - - winedesc.Format = &srcFormat; - winedesc.Width = &srcWidth; - winedesc.Height = &srcHeight; - winedesc.Size = &srcSize; - IWineD3DSurface_GetDesc(pSourceSurface, &winedesc); - - winedesc.Format = &destFormat; - winedesc.Width = &destWidth; - winedesc.Height = &destHeight; - winedesc.Size = NULL; - IWineD3DSurface_GetDesc(pDestinationSurface, &winedesc); - - /* Check that the source and destination formats match */ - if (srcFormat != destFormat && WINED3DFMT_UNKNOWN != destFormat) { - WARN("(%p) source %p format must match the dest %p format, returning WINED3DERR_INVALIDCALL\n", This, pSourceSurface, pDestinationSurface); - return WINED3DERR_INVALIDCALL; - } else if (WINED3DFMT_UNKNOWN == destFormat) { - TRACE("(%p) : Converting destination surface from WINED3DFMT_UNKNOWN to the source format\n", This); - IWineD3DSurface_SetFormat(pDestinationSurface, srcFormat); - destFormat = srcFormat; - } - - /* Quick if complete copy ... */ - if (cRects == 0 && pSourceRectsArray == NULL && pDestPointsArray == NULL) { - - if (srcWidth == destWidth && srcHeight == destHeight) { - WINED3DLOCKED_RECT lrSrc; - WINED3DLOCKED_RECT lrDst; - IWineD3DSurface_LockRect(pSourceSurface, &lrSrc, NULL, WINED3DLOCK_READONLY); - IWineD3DSurface_LockRect(pDestinationSurface, &lrDst, NULL, 0L); - TRACE("Locked src and dst, Direct copy as surfaces are equal, w=%d, h=%d\n", srcWidth, srcHeight); - - memcpy(lrDst.pBits, lrSrc.pBits, srcSize); - - IWineD3DSurface_UnlockRect(pSourceSurface); - IWineD3DSurface_UnlockRect(pDestinationSurface); - TRACE("Unlocked src and dst\n"); - - } else { - - FIXME("Wanted to copy all surfaces but size not compatible, returning WINED3DERR_INVALIDCALL\n"); - hr = WINED3DERR_INVALIDCALL; - } - - } else { - - if (NULL != pSourceRectsArray && NULL != pDestPointsArray) { - - int bytesPerPixel = ((IWineD3DSurfaceImpl *) pSourceSurface)->bytesPerPixel; - unsigned int i; - - /* Copy rect by rect */ - for (i = 0; i < cRects; ++i) { - CONST RECT* r = &pSourceRectsArray[i]; - CONST POINT* p = &pDestPointsArray[i]; - int copyperline; - int j; - WINED3DLOCKED_RECT lrSrc; - WINED3DLOCKED_RECT lrDst; - RECT dest_rect; - - TRACE("Copying rect %d (%d,%d),(%d,%d) -> (%d,%d)\n", i, r->left, r->top, r->right, r->bottom, p->x, p->y); - if (srcFormat == WINED3DFMT_DXT1) { - copyperline = ((r->right - r->left) * bytesPerPixel) / 2; /* DXT1 is half byte per pixel */ - } else { - copyperline = ((r->right - r->left) * bytesPerPixel); - } - - IWineD3DSurface_LockRect(pSourceSurface, &lrSrc, r, WINED3DLOCK_READONLY); - dest_rect.left = p->x; - dest_rect.top = p->y; - dest_rect.right = p->x + (r->right - r->left); - dest_rect.bottom= p->y + (r->bottom - r->top); - IWineD3DSurface_LockRect(pDestinationSurface, &lrDst, &dest_rect, 0L); - TRACE("Locked src and dst\n"); - - /* Find where to start */ - for (j = 0; j < (r->bottom - r->top - 1); ++j) { - memcpy((char*) lrDst.pBits + (j * lrDst.Pitch), (char*) lrSrc.pBits + (j * lrSrc.Pitch), copyperline); - } - IWineD3DSurface_UnlockRect(pSourceSurface); - IWineD3DSurface_UnlockRect(pDestinationSurface); - TRACE("Unlocked src and dst\n"); - } - } else { - unsigned int i; - int bytesPerPixel = ((IWineD3DSurfaceImpl *) pSourceSurface)->bytesPerPixel; - int copyperline; - int j; - WINED3DLOCKED_RECT lrSrc; - WINED3DLOCKED_RECT lrDst; - RECT dest_rect; - - for(i=0; i < cRects; i++) { - CONST RECT* r = &pSourceRectsArray[i]; - - TRACE("Copying rect %d (%d,%d),(%d,%d) -> (0, 0)\n", i, r->left, r->top, r->right, r->bottom); - if (srcFormat == WINED3DFMT_DXT1) { - copyperline = ((r->right - r->left) * bytesPerPixel) / 2; /* DXT1 is half byte per pixel */ - } else { - copyperline = ((r->right - r->left) * bytesPerPixel); - } - IWineD3DSurface_LockRect(pSourceSurface, &lrSrc, r, WINED3DLOCK_READONLY); - dest_rect.left = 0; - dest_rect.top = 0; - dest_rect.right = r->right - r->left; - dest_rect.bottom= r->bottom - r->top; - IWineD3DSurface_LockRect(pDestinationSurface, &lrDst, &dest_rect, 0L); - TRACE("Locked src and dst\n"); - /* Find where to start */ - for (j = 0; j < (r->bottom - r->top - 1); ++j) { - memcpy((char*) lrDst.pBits + (j * lrDst.Pitch), (char*) lrSrc.pBits + (j * lrSrc.Pitch), copyperline); - } - IWineD3DSurface_UnlockRect(pSourceSurface); - IWineD3DSurface_UnlockRect(pDestinationSurface); - TRACE("Unlocked src and dst\n"); - } - } - } - - return hr; -} - /* Implementation details at http://developer.nvidia.com/attach/6494 and http://oss.sgi.com/projects/ogl-sample/registry/NV/evaluators.txt @@ -8119,7 +7976,6 @@ const IWineD3DDeviceVtbl IWineD3DDevice_Vtbl = IWineD3DDeviceImpl_ColorFill, IWineD3DDeviceImpl_UpdateTexture, IWineD3DDeviceImpl_UpdateSurface, - IWineD3DDeviceImpl_CopyRects, IWineD3DDeviceImpl_StretchRect, IWineD3DDeviceImpl_GetRenderTargetData, IWineD3DDeviceImpl_GetFrontBufferData, diff --git a/include/wine/wined3d_interface.h b/include/wine/wined3d_interface.h index 1b711a89fae..459f2da2684 100644 --- a/include/wine/wined3d_interface.h +++ b/include/wine/wined3d_interface.h @@ -455,7 +455,6 @@ DECLARE_INTERFACE_(IWineD3DDevice,IWineD3DBase) STDMETHOD(ColorFill)(THIS_ struct IWineD3DSurface* pSurface, CONST WINED3DRECT* pRect, WINED3DCOLOR color) PURE; STDMETHOD(UpdateTexture)(THIS_ struct IWineD3DBaseTexture *pSourceTexture, struct IWineD3DBaseTexture *pDestinationTexture) PURE; STDMETHOD(UpdateSurface)(THIS_ struct IWineD3DSurface* pSourceSurface, CONST RECT* pSourceRect, struct IWineD3DSurface* pDestinationSurface, CONST POINT* pDestPoint) PURE; - STDMETHOD(CopyRects)(THIS_ struct IWineD3DSurface* pSourceSurface, CONST RECT* pSourceRectsArray, UINT cRects, struct IWineD3DSurface* pDestinationSurface, CONST POINT* pDestPointsArray); STDMETHOD(StretchRect)(THIS_ struct IWineD3DSurface* pSourceSurface, CONST RECT* pSourceRect, struct IWineD3DSurface* pDestinationSurface, CONST RECT* pDestRect, WINED3DTEXTUREFILTERTYPE Filter) PURE; STDMETHOD(GetRenderTargetData)(THIS_ struct IWineD3DSurface* pRenderTarget, struct IWineD3DSurface* pSurface) PURE; STDMETHOD(GetFrontBufferData)(THIS_ UINT iSwapChain,struct IWineD3DSurface* pSurface) PURE; @@ -596,7 +595,6 @@ DECLARE_INTERFACE_(IWineD3DDevice,IWineD3DBase) #define IWineD3DDevice_ColorFill(p,a,b,c) (p)->lpVtbl->ColorFill(p,a,b,c) #define IWineD3DDevice_UpdateTexture(p,a,b) (p)->lpVtbl->UpdateTexture(p,a,b) #define IWineD3DDevice_UpdateSurface(p,a,b,c,d) (p)->lpVtbl->UpdateSurface(p,a,b,c,d) -#define IWineD3DDevice_CopyRects(p,a,b,c,d,e) (p)->lpVtbl->CopyRects(p,a,b,c,d,e) #define IWineD3DDevice_StretchRect(p,a,b,c,d,e) (p)->lpVtbl->StretchRect(p,a,b,c,d,e) #define IWineD3DDevice_GetRenderTargetData(p,a,b) (p)->lpVtbl->GetRenderTargetData(p,a,b) #define IWineD3DDevice_GetFrontBufferData(p,a,b) (p)->lpVtbl->GetFrontBufferData(p,a,b)