Module: wine Branch: master Commit: f04d870a8d9dcadd6d4db3864ddb914a9ced555b URL: http://source.winehq.org/git/wine.git/?a=commit;h=f04d870a8d9dcadd6d4db3864d...
Author: Roderick Colenbrander thunderbird2k@gmx.net Date: Sat Apr 5 23:54:26 2008 +0000
wined3d: Remove a PBO when a converted surface is detected.
This can happen e.g. when suddenly color keying is activated and at some stages we don't know if we will need conversion at PBO creation time.
---
dlls/wined3d/surface.c | 15 +++++++++++++++ 1 files changed, 15 insertions(+), 0 deletions(-)
diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c index 33812b7..ddd0f32 100644 --- a/dlls/wined3d/surface.c +++ b/dlls/wined3d/surface.c @@ -36,6 +36,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(d3d_surface); HRESULT d3dfmt_convert_surface(BYTE *src, BYTE *dst, UINT pitch, UINT width, UINT height, UINT outpitch, CONVERT_TYPES convert, IWineD3DSurfaceImpl *surf); static void d3dfmt_p8_init_palette(IWineD3DSurfaceImpl *This, BYTE table[256][4], BOOL colorkey); static inline void clear_unused_channels(IWineD3DSurfaceImpl *This); +static void surface_remove_pbo(IWineD3DSurfaceImpl *This);
static void surface_bind_and_dirtify(IWineD3DSurfaceImpl *This) { GLint active_texture; @@ -4038,6 +4039,13 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_LoadLocation(IWineD3DSurface *iface, D width = This->currentDesc.Width; pitch = IWineD3DSurface_GetPitch(iface);
+ /* Don't use PBOs for converted surfaces. During PBO conversion we look at SFLAG_CONVERTED + * but it isn't set (yet) in all cases it is getting called. */ + if((convert != NO_CONVERSION) && (This->Flags & SFLAG_PBO)) { + TRACE("Removing the pbo attached to surface %p\n", This); + surface_remove_pbo(This); + } + if((convert != NO_CONVERSION) && This->resource.allocatedMemory) { int height = This->currentDesc.Height;
@@ -4092,6 +4100,13 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_LoadLocation(IWineD3DSurface *iface, D width = This->currentDesc.Width; pitch = IWineD3DSurface_GetPitch(iface);
+ /* Don't use PBOs for converted surfaces. During PBO conversion we look at SFLAG_CONVERTED + * but it isn't set (yet) in all cases it is getting called. */ + if((convert != NO_CONVERSION) && (This->Flags & SFLAG_PBO)) { + TRACE("Removing the pbo attached to surface %p\n", This); + surface_remove_pbo(This); + } + if((convert != NO_CONVERSION) && This->resource.allocatedMemory) { int height = This->currentDesc.Height;