diff --git a/dlls/wined3d/basetexture.c b/dlls/wined3d/basetexture.c index ab38b625aae..e9876a2c826 100644 --- a/dlls/wined3d/basetexture.c +++ b/dlls/wined3d/basetexture.c @@ -5,6 +5,7 @@ * Copyright 2002-2004 Raphael Junqueira * Copyright 2005 Oliver Stieber * Copyright 2007-2008 Stefan Dösinger for CodeWeavers + * Copyright 2009 Henri Verbeet for CodeWeavers * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -29,11 +30,12 @@ WINE_DEFAULT_DEBUG_CHANNEL(d3d_texture); HRESULT basetexture_init(IWineD3DBaseTextureImpl *texture, UINT levels, WINED3DRESOURCETYPE resource_type, IWineD3DDeviceImpl *device, UINT size, DWORD usage, const struct GlPixelFormatDesc *format_desc, - WINED3DPOOL pool, IUnknown *parent) + WINED3DPOOL pool, IUnknown *parent, const struct wined3d_parent_ops *parent_ops) { HRESULT hr; - hr = resource_init((IWineD3DResource *)texture, resource_type, device, size, usage, format_desc, pool, parent); + hr = resource_init((IWineD3DResource *)texture, resource_type, device, + size, usage, format_desc, pool, parent, parent_ops); if (FAILED(hr)) { WARN("Failed to initialize resource, returning %#x\n", hr); diff --git a/dlls/wined3d/buffer.c b/dlls/wined3d/buffer.c index c35339eca92..c20e305b5a3 100644 --- a/dlls/wined3d/buffer.c +++ b/dlls/wined3d/buffer.c @@ -635,7 +635,7 @@ static ULONG STDMETHODCALLTYPE buffer_Release(IWineD3DBuffer *iface) { buffer_UnLoad(iface); resource_cleanup((IWineD3DResource *)iface); - This->parent_ops->wined3d_object_destroyed(This->resource.parent); + This->resource.parent_ops->wined3d_object_destroyed(This->resource.parent); HeapFree(GetProcessHeap(), 0, This); } @@ -1076,13 +1076,12 @@ HRESULT buffer_init(struct wined3d_buffer *buffer, IWineD3DDeviceImpl *device, buffer->vtbl = &wined3d_buffer_vtbl; hr = resource_init((IWineD3DResource *)buffer, WINED3DRTYPE_BUFFER, - device, size, usage, format_desc, pool, parent); + device, size, usage, format_desc, pool, parent, parent_ops); if (FAILED(hr)) { WARN("Failed to initialize resource, hr %#x\n", hr); return hr; } - buffer->parent_ops = parent_ops; buffer->buffer_type_hint = bind_hint; TRACE("size %#x, usage %#x, format %s, memory @ %p, iface @ %p.\n", buffer->resource.size, buffer->resource.usage, diff --git a/dlls/wined3d/cubetexture.c b/dlls/wined3d/cubetexture.c index 45a94d34810..2ff84e3cb24 100644 --- a/dlls/wined3d/cubetexture.c +++ b/dlls/wined3d/cubetexture.c @@ -177,7 +177,7 @@ static ULONG WINAPI IWineD3DCubeTextureImpl_Release(IWineD3DCubeTexture *iface) if (!ref) { cubetexture_cleanup(This); - This->parent_ops->wined3d_object_destroyed(This->resource.parent); + This->resource.parent_ops->wined3d_object_destroyed(This->resource.parent); HeapFree(GetProcessHeap(), 0, This); } return ref; @@ -486,16 +486,14 @@ HRESULT cubetexture_init(IWineD3DCubeTextureImpl *texture, UINT edge_length, UIN texture->lpVtbl = &IWineD3DCubeTexture_Vtbl; - hr = basetexture_init((IWineD3DBaseTextureImpl *)texture, levels, - WINED3DRTYPE_CUBETEXTURE, device, 0, usage, format_desc, pool, parent); + hr = basetexture_init((IWineD3DBaseTextureImpl *)texture, levels, WINED3DRTYPE_CUBETEXTURE, + device, 0, usage, format_desc, pool, parent, parent_ops); if (FAILED(hr)) { WARN("Failed to initialize basetexture, returning %#x\n", hr); return hr; } - texture->parent_ops = parent_ops; - /* Find the nearest pow2 match. */ pow2_edge_length = 1; while (pow2_edge_length < edge_length) pow2_edge_length <<= 1; diff --git a/dlls/wined3d/resource.c b/dlls/wined3d/resource.c index 89ea7f3794d..17f336d4966 100644 --- a/dlls/wined3d/resource.c +++ b/dlls/wined3d/resource.c @@ -5,6 +5,7 @@ * Copyright 2003-2004 Raphael Junqueira * Copyright 2004 Christian Costa * Copyright 2005 Oliver Stieber + * Copyright 2009 Henri Verbeet for CodeWeavers * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -28,7 +29,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(d3d); HRESULT resource_init(IWineD3DResource *iface, WINED3DRESOURCETYPE resource_type, IWineD3DDeviceImpl *device, UINT size, DWORD usage, const struct GlPixelFormatDesc *format_desc, - WINED3DPOOL pool, IUnknown *parent) + WINED3DPOOL pool, IUnknown *parent, const struct wined3d_parent_ops *parent_ops) { struct IWineD3DResourceClass *resource = &((IWineD3DResourceImpl *)iface)->resource; @@ -41,6 +42,7 @@ HRESULT resource_init(IWineD3DResource *iface, WINED3DRESOURCETYPE resource_type resource->usage = usage; resource->size = size; resource->priority = 0; + resource->parent_ops = parent_ops; list_init(&resource->privateData); if (size) diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c index 86e6da1d40a..fffa28f4a27 100644 --- a/dlls/wined3d/surface.c +++ b/dlls/wined3d/surface.c @@ -160,15 +160,13 @@ HRESULT surface_init(IWineD3DSurfaceImpl *surface, WINED3DSURFTYPE surface_type, } hr = resource_init((IWineD3DResource *)surface, WINED3DRTYPE_SURFACE, - device, resource_size, usage, format_desc, pool, parent); + device, resource_size, usage, format_desc, pool, parent, parent_ops); if (FAILED(hr)) { WARN("Failed to initialize resource, returning %#x.\n", hr); return hr; } - surface->parent_ops = parent_ops; - /* "Standalone" surface. */ IWineD3DSurface_SetContainer((IWineD3DSurface *)surface, NULL); @@ -730,7 +728,7 @@ static ULONG WINAPI IWineD3DSurfaceImpl_Release(IWineD3DSurface *iface) if (!ref) { surface_cleanup(This); - This->parent_ops->wined3d_object_destroyed(This->resource.parent); + This->resource.parent_ops->wined3d_object_destroyed(This->resource.parent); TRACE("(%p) Released.\n", This); HeapFree(GetProcessHeap(), 0, This); diff --git a/dlls/wined3d/texture.c b/dlls/wined3d/texture.c index b75109ef706..22a88a43fb4 100644 --- a/dlls/wined3d/texture.c +++ b/dlls/wined3d/texture.c @@ -164,7 +164,7 @@ static ULONG WINAPI IWineD3DTextureImpl_Release(IWineD3DTexture *iface) { if (!ref) { texture_cleanup(This); - This->parent_ops->wined3d_object_destroyed(This->resource.parent); + This->resource.parent_ops->wined3d_object_destroyed(This->resource.parent); HeapFree(GetProcessHeap(), 0, This); } return ref; @@ -501,16 +501,14 @@ HRESULT texture_init(IWineD3DTextureImpl *texture, UINT width, UINT height, UINT texture->lpVtbl = &IWineD3DTexture_Vtbl; - hr = basetexture_init((IWineD3DBaseTextureImpl *)texture, levels, - WINED3DRTYPE_TEXTURE, device, 0, usage, format_desc, pool, parent); + hr = basetexture_init((IWineD3DBaseTextureImpl *)texture, levels, WINED3DRTYPE_TEXTURE, + device, 0, usage, format_desc, pool, parent, parent_ops); if (FAILED(hr)) { WARN("Failed to initialize basetexture, returning %#x.\n", hr); return hr; } - texture->parent_ops = parent_ops; - /* Precalculated scaling for 'faked' non power of two texture coords. * Second also don't use ARB_TEXTURE_RECTANGLE in case the surface format is P8 and EXT_PALETTED_TEXTURE * is used in combination with texture uploads (RTL_READTEX). The reason is that EXT_PALETTED_TEXTURE diff --git a/dlls/wined3d/volume.c b/dlls/wined3d/volume.c index dec0087fab3..6cf8b6614a5 100644 --- a/dlls/wined3d/volume.c +++ b/dlls/wined3d/volume.c @@ -123,7 +123,7 @@ static ULONG WINAPI IWineD3DVolumeImpl_Release(IWineD3DVolume *iface) { ref = InterlockedDecrement(&This->resource.ref); if (ref == 0) { resource_cleanup((IWineD3DResource *)iface); - This->parent_ops->wined3d_object_destroyed(This->resource.parent); + This->resource.parent_ops->wined3d_object_destroyed(This->resource.parent); HeapFree(GetProcessHeap(), 0, This); } return ref; @@ -392,14 +392,13 @@ HRESULT volume_init(IWineD3DVolumeImpl *volume, IWineD3DDeviceImpl *device, UINT volume->lpVtbl = &IWineD3DVolume_Vtbl; hr = resource_init((IWineD3DResource *)volume, WINED3DRTYPE_VOLUME, device, - width * height * depth * format_desc->byte_count, usage, format_desc, pool, parent); + width * height * depth * format_desc->byte_count, usage, format_desc, pool, parent, parent_ops); if (FAILED(hr)) { WARN("Failed to initialize resource, returning %#x.\n", hr); return hr; } - volume->parent_ops = parent_ops; volume->currentDesc.Width = width; volume->currentDesc.Height = height; volume->currentDesc.Depth = depth; diff --git a/dlls/wined3d/volumetexture.c b/dlls/wined3d/volumetexture.c index 252de28acb0..88efeb5b38c 100644 --- a/dlls/wined3d/volumetexture.c +++ b/dlls/wined3d/volumetexture.c @@ -136,7 +136,7 @@ static ULONG WINAPI IWineD3DVolumeTextureImpl_Release(IWineD3DVolumeTexture *ifa if (!ref) { volumetexture_cleanup(This); - This->parent_ops->wined3d_object_destroyed(This->resource.parent); + This->resource.parent_ops->wined3d_object_destroyed(This->resource.parent); HeapFree(GetProcessHeap(), 0, This); } return ref; @@ -406,16 +406,14 @@ HRESULT volumetexture_init(IWineD3DVolumeTextureImpl *texture, UINT width, UINT texture->lpVtbl = &IWineD3DVolumeTexture_Vtbl; - hr = basetexture_init((IWineD3DBaseTextureImpl *)texture, levels, - WINED3DRTYPE_VOLUMETEXTURE, device, 0, usage, format_desc, pool, parent); + hr = basetexture_init((IWineD3DBaseTextureImpl *)texture, levels, WINED3DRTYPE_VOLUMETEXTURE, + device, 0, usage, format_desc, pool, parent, parent_ops); if (FAILED(hr)) { WARN("Failed to initialize basetexture, returning %#x.\n", hr); return hr; } - texture->parent_ops = parent_ops; - /* Is NP2 support for volumes needed? */ texture->baseTexture.pow2Matrix[0] = 1.0f; texture->baseTexture.pow2Matrix[5] = 1.0f; diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index 174864d66d4..0f0ad4a5a41 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -1699,7 +1699,7 @@ typedef struct IWineD3DResourceClass BYTE *heapMemory; /* Pointer to the HeapAlloced block of memory */ struct list privateData; struct list resource_list_entry; - + const struct wined3d_parent_ops *parent_ops; } IWineD3DResourceClass; typedef struct IWineD3DResourceImpl @@ -1718,7 +1718,7 @@ HRESULT resource_get_private_data(IWineD3DResource *iface, REFGUID guid, void *data, DWORD *data_size) DECLSPEC_HIDDEN; HRESULT resource_init(IWineD3DResource *iface, WINED3DRESOURCETYPE resource_type, IWineD3DDeviceImpl *device, UINT size, DWORD usage, const struct GlPixelFormatDesc *format_desc, - WINED3DPOOL pool, IUnknown *parent) DECLSPEC_HIDDEN; + WINED3DPOOL pool, IUnknown *parent, const struct wined3d_parent_ops *parent_ops) DECLSPEC_HIDDEN; WINED3DRESOURCETYPE resource_get_type(IWineD3DResource *iface) DECLSPEC_HIDDEN; DWORD resource_set_priority(IWineD3DResource *iface, DWORD new_priority) DECLSPEC_HIDDEN; HRESULT resource_set_private_data(IWineD3DResource *iface, REFGUID guid, @@ -1801,7 +1801,7 @@ DWORD basetexture_get_level_count(IWineD3DBaseTexture *iface) DECLSPEC_HIDDEN; DWORD basetexture_get_lod(IWineD3DBaseTexture *iface) DECLSPEC_HIDDEN; HRESULT basetexture_init(IWineD3DBaseTextureImpl *texture, UINT levels, WINED3DRESOURCETYPE resource_type, IWineD3DDeviceImpl *device, UINT size, DWORD usage, const struct GlPixelFormatDesc *format_desc, - WINED3DPOOL pool, IUnknown *parent) DECLSPEC_HIDDEN; + WINED3DPOOL pool, IUnknown *parent, const struct wined3d_parent_ops *parent_ops) DECLSPEC_HIDDEN; HRESULT basetexture_set_autogen_filter_type(IWineD3DBaseTexture *iface, WINED3DTEXTUREFILTERTYPE filter_type) DECLSPEC_HIDDEN; BOOL basetexture_set_dirty(IWineD3DBaseTexture *iface, BOOL dirty) DECLSPEC_HIDDEN; @@ -1819,7 +1819,6 @@ typedef struct IWineD3DTextureImpl IWineD3DBaseTextureClass baseTexture; /* IWineD3DTexture */ - const struct wined3d_parent_ops *parent_ops; IWineD3DSurface *surfaces[MAX_MIP_LEVELS]; UINT target; BOOL cond_np2; @@ -1841,7 +1840,6 @@ typedef struct IWineD3DCubeTextureImpl IWineD3DBaseTextureClass baseTexture; /* IWineD3DCubeTexture */ - const struct wined3d_parent_ops *parent_ops; IWineD3DSurface *surfaces[6][MAX_MIP_LEVELS]; } IWineD3DCubeTextureImpl; @@ -1866,7 +1864,6 @@ typedef struct IWineD3DVolumeImpl IWineD3DResourceClass resource; /* WineD3DVolume Information */ - const struct wined3d_parent_ops *parent_ops; WINED3DVOLUMET_DESC currentDesc; IWineD3DBase *container; BOOL lockable; @@ -1892,7 +1889,6 @@ typedef struct IWineD3DVolumeTextureImpl IWineD3DBaseTextureClass baseTexture; /* IWineD3DVolumeTexture */ - const struct wined3d_parent_ops *parent_ops; IWineD3DVolume *volumes[MAX_MIP_LEVELS]; } IWineD3DVolumeTextureImpl; @@ -1958,7 +1954,6 @@ struct IWineD3DSurfaceImpl IWineD3DResourceClass resource; /* IWineD3DSurface fields */ - const struct wined3d_parent_ops *parent_ops; IWineD3DBase *container; WINED3DSURFACET_DESC currentDesc; IWineD3DPaletteImpl *palette; /* D3D7 style palette handling */ @@ -2416,7 +2411,6 @@ struct wined3d_buffer const struct IWineD3DBufferVtbl *vtbl; IWineD3DResourceClass resource; - const struct wined3d_parent_ops *parent_ops; struct wined3d_buffer_desc desc; GLuint buffer_object;