ddraw: Fix refcounting of palettes

Alexander Dorofeyev alexd4 at inbox.lv
Sun Mar 16 11:50:41 CDT 2008

Stefan Dösinger wrote:
> Am Sonntag, 16. März 2008 14:44:37 schrieb bobbyg at gmx.net:
>> This fixes a crash in a game called "Autobahnverfolgungsjagd Total"
>> (not in AppDB).
> I think it would be better to set pal = NULL if there is no wined3d palette 
> returned a few lines above the place you're changing.
>> While tracing this bug I noticed that
>> IWineD3DBaseSurfaceImpl_GetPalette() does not call AddRef when
>> returning the palette. Is that intentional?
> This looks like it needs a fix

To my knowledge, the way refcounting for IWineD3DPalette currently works, 
refcount is always kept equal to 1 during its lifetime, IDirectDrawPalette owns 
this reference and releases it when it (ddraw palette) is getting destroyed. So, 
the real refcounting is done for ddraw palette and it is omitted in most places 
for wined3d palette (which simply gets destroyed together with ddraw palette). 
Generally, this seems to work ok. If IWineD3DBaseSurfaceImpl_GetPalette is 
changed to call AddRef, then all other places must be fixed too (SetPalette and 
callers of IWineD3DBaseSurfaceImpl_GetPalette, possibly others too) or things 
may break (leaks etc) and become inconsistent. For example, 
IDirectDrawSurfaceImpl_GetPalette does not call Release on interface it gets 
from IWineD3DSurface_GetPalette.

More information about the wine-devel mailing list