D3D7 -> WineD3D, 2nd attempt
Oliver Stieber
oliver_stieber at yahoo.co.uk
Wed Oct 12 11:28:59 CDT 2005
--- Stefan Dösinger <stefandoesinger at gmx.at> wrote:
> Hello,
> > 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?
* Work out a way to keep hold of the WineD3DDevice without causing circular references.
* Allow wined3dSurface to exist without it's device (Memory based surfaces should be device
independent)
* Possibly a method that creates the ddraw or wined3d surfaces as required (Though that would be
messy)
* Keep an 'internal' reference count, but I expect that would cause too much mutual dependency.
>
> > 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
> call.
You should be able to use GetDesktopWindow() in wine to get the root window.
Oliver.
>
___________________________________________________________
To help you stay safe and secure online, we've developed the all new Yahoo! Security Centre. http://uk.security.yahoo.com
More information about the wine-devel
mailing list