d3d9: The "forwardReference" field in struct d3d9_surface is always a texture, if set.
This commit is contained in:
parent
c8ec6918c7
commit
d1d48d3194
|
@ -216,12 +216,12 @@ struct d3d9_surface
|
|||
struct wined3d_surface *wined3d_surface;
|
||||
IDirect3DDevice9Ex *parent_device;
|
||||
IUnknown *container;
|
||||
IUnknown *forwardReference;
|
||||
struct d3d9_texture *texture;
|
||||
BOOL getdc_supported;
|
||||
};
|
||||
|
||||
void surface_init(struct d3d9_surface *surface, struct wined3d_surface *wined3d_surface,
|
||||
struct d3d9_device *device, const struct wined3d_parent_ops **parent_ops) DECLSPEC_HIDDEN;
|
||||
void surface_init(struct d3d9_surface *surface, IUnknown *container_parent,
|
||||
struct wined3d_surface *wined3d_surface, const struct wined3d_parent_ops **parent_ops) DECLSPEC_HIDDEN;
|
||||
struct d3d9_surface *unsafe_impl_from_IDirect3DSurface9(IDirect3DSurface9 *iface) DECLSPEC_HIDDEN;
|
||||
|
||||
struct d3d9_vertexbuffer
|
||||
|
|
|
@ -1026,7 +1026,6 @@ static HRESULT d3d9_device_create_surface(struct d3d9_device *device, UINT width
|
|||
|
||||
sub_resource = wined3d_texture_get_sub_resource(texture, 0);
|
||||
surface_impl = wined3d_resource_get_parent(sub_resource);
|
||||
surface_impl->forwardReference = NULL;
|
||||
surface_impl->parent_device = &device->IDirect3DDevice9Ex_iface;
|
||||
*surface = &surface_impl->IDirect3DSurface9_iface;
|
||||
IDirect3DSurface9_AddRef(*surface);
|
||||
|
@ -3461,7 +3460,6 @@ static HRESULT CDECL device_parent_surface_created(struct wined3d_device_parent
|
|||
void *container_parent, struct wined3d_surface *surface, void **parent,
|
||||
const struct wined3d_parent_ops **parent_ops)
|
||||
{
|
||||
struct d3d9_device *device = device_from_device_parent(device_parent);
|
||||
struct d3d9_surface *d3d_surface;
|
||||
|
||||
TRACE("device_parent %p, container_parent %p, surface %p, parent %p, parent_ops %p.\n",
|
||||
|
@ -3470,17 +3468,10 @@ static HRESULT CDECL device_parent_surface_created(struct wined3d_device_parent
|
|||
if (!(d3d_surface = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*d3d_surface))))
|
||||
return E_OUTOFMEMORY;
|
||||
|
||||
surface_init(d3d_surface, surface, device, parent_ops);
|
||||
surface_init(d3d_surface, container_parent, surface, parent_ops);
|
||||
*parent = d3d_surface;
|
||||
TRACE("Created surface %p.\n", d3d_surface);
|
||||
|
||||
d3d_surface->container = container_parent;
|
||||
IDirect3DDevice9Ex_Release(d3d_surface->parent_device);
|
||||
d3d_surface->parent_device = NULL;
|
||||
|
||||
IDirect3DSurface9_Release(&d3d_surface->IDirect3DSurface9_iface);
|
||||
d3d_surface->forwardReference = container_parent;
|
||||
|
||||
return D3D_OK;
|
||||
}
|
||||
|
||||
|
@ -3532,7 +3523,6 @@ static HRESULT CDECL device_parent_create_swapchain_surface(struct wined3d_devic
|
|||
wined3d_texture_decref(texture);
|
||||
|
||||
d3d_surface = wined3d_surface_get_parent(*surface);
|
||||
d3d_surface->forwardReference = NULL;
|
||||
d3d_surface->parent_device = &device->IDirect3DDevice9Ex_iface;
|
||||
|
||||
return hr;
|
||||
|
|
|
@ -55,10 +55,10 @@ static ULONG WINAPI d3d9_surface_AddRef(IDirect3DSurface9 *iface)
|
|||
|
||||
TRACE("iface %p.\n", iface);
|
||||
|
||||
if (surface->forwardReference)
|
||||
if (surface->texture)
|
||||
{
|
||||
TRACE("Forwarding to %p.\n", surface->forwardReference);
|
||||
return IUnknown_AddRef(surface->forwardReference);
|
||||
TRACE("Forwarding to %p.\n", surface->texture);
|
||||
return IDirect3DBaseTexture9_AddRef(&surface->texture->IDirect3DBaseTexture9_iface);
|
||||
}
|
||||
|
||||
refcount = InterlockedIncrement(&surface->resource.refcount);
|
||||
|
@ -83,10 +83,10 @@ static ULONG WINAPI d3d9_surface_Release(IDirect3DSurface9 *iface)
|
|||
|
||||
TRACE("iface %p.\n", iface);
|
||||
|
||||
if (surface->forwardReference)
|
||||
if (surface->texture)
|
||||
{
|
||||
TRACE("Forwarding to %p.\n", surface->forwardReference);
|
||||
return IUnknown_Release(surface->forwardReference);
|
||||
TRACE("Forwarding to %p.\n", surface->texture);
|
||||
return IDirect3DBaseTexture9_Release(&surface->texture->IDirect3DBaseTexture9_iface);
|
||||
}
|
||||
|
||||
refcount = InterlockedDecrement(&surface->resource.refcount);
|
||||
|
@ -114,22 +114,8 @@ static HRESULT WINAPI d3d9_surface_GetDevice(IDirect3DSurface9 *iface, IDirect3D
|
|||
|
||||
TRACE("iface %p, device %p.\n", iface, device);
|
||||
|
||||
if (surface->forwardReference)
|
||||
{
|
||||
IDirect3DResource9 *resource;
|
||||
HRESULT hr;
|
||||
|
||||
hr = IUnknown_QueryInterface(surface->forwardReference, &IID_IDirect3DResource9, (void **)&resource);
|
||||
if (SUCCEEDED(hr))
|
||||
{
|
||||
hr = IDirect3DResource9_GetDevice(resource, device);
|
||||
IDirect3DResource9_Release(resource);
|
||||
|
||||
TRACE("Returning device %p.\n", *device);
|
||||
}
|
||||
|
||||
return hr;
|
||||
}
|
||||
if (surface->texture)
|
||||
return IDirect3DBaseTexture9_GetDevice(&surface->texture->IDirect3DBaseTexture9_iface, device);
|
||||
|
||||
*device = (IDirect3DDevice9 *)surface->parent_device;
|
||||
IDirect3DDevice9_AddRef(*device);
|
||||
|
@ -355,13 +341,24 @@ static const struct wined3d_parent_ops d3d9_surface_wined3d_parent_ops =
|
|||
surface_wined3d_object_destroyed,
|
||||
};
|
||||
|
||||
void surface_init(struct d3d9_surface *surface, struct wined3d_surface *wined3d_surface,
|
||||
struct d3d9_device *device, const struct wined3d_parent_ops **parent_ops)
|
||||
void surface_init(struct d3d9_surface *surface, IUnknown *container_parent,
|
||||
struct wined3d_surface *wined3d_surface, const struct wined3d_parent_ops **parent_ops)
|
||||
{
|
||||
struct wined3d_resource_desc desc;
|
||||
IDirect3DBaseTexture9 *texture;
|
||||
|
||||
surface->IDirect3DSurface9_iface.lpVtbl = &d3d9_surface_vtbl;
|
||||
d3d9_resource_init(&surface->resource);
|
||||
surface->resource.refcount = 0;
|
||||
surface->wined3d_surface = wined3d_surface;
|
||||
surface->container = container_parent;
|
||||
|
||||
if (container_parent && SUCCEEDED(IUnknown_QueryInterface(container_parent,
|
||||
&IID_IDirect3DBaseTexture9, (void **)&texture)))
|
||||
{
|
||||
surface->texture = unsafe_impl_from_IDirect3DBaseTexture9(texture);
|
||||
IDirect3DBaseTexture9_Release(texture);
|
||||
}
|
||||
|
||||
wined3d_resource_get_desc(wined3d_surface_get_resource(wined3d_surface), &desc);
|
||||
switch (d3dformat_from_wined3dformat(desc.format))
|
||||
|
@ -380,11 +377,6 @@ void surface_init(struct d3d9_surface *surface, struct wined3d_surface *wined3d_
|
|||
break;
|
||||
}
|
||||
|
||||
wined3d_surface_incref(wined3d_surface);
|
||||
surface->wined3d_surface = wined3d_surface;
|
||||
surface->parent_device = &device->IDirect3DDevice9Ex_iface;
|
||||
IDirect3DDevice9Ex_AddRef(surface->parent_device);
|
||||
|
||||
*parent_ops = &d3d9_surface_wined3d_parent_ops;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue