D3D7 -> WineD3D, 2nd attempt

Stefan Dösinger stefandoesinger at gmx.at
Wed Oct 12 11:15:12 CDT 2005

> This should be managed by reference counting wherever possible, if ddraw
> holds a reference to the surface then it won't be released when the device
> is released.
I tried to do this, but I ran into problems:
I have a DirectDrawSurface, a Direct3D7Device, WineD3DDevice and a 
WineD3DSurface. The DirectDrawSurface is the Parent of the WineD3DSurface, 
and the WineD3DSurface is used as the Front Buffer for the WineD3DDevice. The 
Direct3D7Device is the parent of the WineD3DDevice.

Now I want to Destroy the Direct3D7Device because the application tols me to 
do so. While doing so I have to Destroy the WineD3DDevice for cleanup. The 
WineD3DSurface has to be destroyed too, otherwise it would be without it's 
WineD3DDevice. But I must keep the DirectDrawSurface.

Making the DirectDrawSurface survive the WineD3DDevice->Release() is easy - A 
AddRef does this job. But in this case the WineD3DSurface isn't destroyed. So 
my options are

*Destroy the WineD3DSurface manually before the WineD3DDevice->Release call. 
Problems: The WineD3DSurface is needed in WineD3DDevice->Release. Doing so 
causes a crash

*Do some RefCount magic and destroy the WineD3DSurface when the 
DirectDrawSurface's refcount reaches 1. Ugly in my opinion.

*Release only the WineD3DSurface in WineD3DDevice->Release, and not it's 
parent. This was the simplest approach, it was a modification of a few lines 
for the case dxVersion == 7.

*Any other possibilities that I didn't think of?

> It doesn't look like it, the only CreateWindow in ddraw is in
> surface_user.c when OWN_WINDOW is set, the comments note that OWN_WINDOW no
> longer works because of threading issues.
I decided to create my own window when constructing the Direct3DDevice if 
necessary. Using the X11 root window caused a crash due to an invalid X11 

More information about the wine-devel mailing list