From: Zebediah Figura zfigura@codeweavers.com
So that we can allow setting the sub resource and parent ops not from the texture_sub_resource_created() callback, and also that we can "detach" a wined3d surface from ddraw after creating it, so that we can recreate the backing wined3d texture, viz. in SetSurfaceDesc(). --- dlls/ddraw/surface.c | 15 ++++++++++++--- dlls/wined3d/texture.c | 3 ++- dlls/wined3d/wined3d.spec | 2 +- include/wine/wined3d.h | 2 +- 4 files changed, 16 insertions(+), 6 deletions(-)
diff --git a/dlls/ddraw/surface.c b/dlls/ddraw/surface.c index eaa036b21bf..a881572e027 100644 --- a/dlls/ddraw/surface.c +++ b/dlls/ddraw/surface.c @@ -29,6 +29,8 @@ WINE_DECLARE_DEBUG_CHANNEL(fps); static struct ddraw_surface *unsafe_impl_from_IDirectDrawSurface2(IDirectDrawSurface2 *iface); static struct ddraw_surface *unsafe_impl_from_IDirectDrawSurface3(IDirectDrawSurface3 *iface);
+static const struct wined3d_parent_ops ddraw_surface_wined3d_parent_ops; + static inline struct ddraw_surface *impl_from_IDirectDrawGammaControl(IDirectDrawGammaControl *iface) { return CONTAINING_RECORD(iface, struct ddraw_surface, IDirectDrawGammaControl_iface); @@ -1343,9 +1345,16 @@ static void ddraw_texture_rename_to(struct ddraw_texture *dst_texture, struct wi if (dst_surface->sub_resource_idx) ERR("Invalid sub-resource index %u for surface %p.\n", dst_surface->sub_resource_idx, dst_surface);
- wined3d_texture_set_sub_resource_parent(wined3d_texture, 0, dst_surface); if (draw_texture) - wined3d_texture_set_sub_resource_parent(draw_texture, 0, dst_surface); + { + wined3d_texture_set_sub_resource_parent(draw_texture, 0, dst_surface, &ddraw_surface_wined3d_parent_ops); + wined3d_texture_set_sub_resource_parent(wined3d_texture, 0, dst_surface, &ddraw_null_wined3d_parent_ops); + } + else + { + wined3d_texture_set_sub_resource_parent(wined3d_texture, 0, dst_surface, &ddraw_surface_wined3d_parent_ops); + } + wined3d_resource_set_parent(wined3d_texture_get_resource(wined3d_texture), dst_texture); if (draw_texture) wined3d_resource_set_parent(wined3d_texture_get_resource(draw_texture), dst_texture); @@ -6132,7 +6141,7 @@ static HRESULT ddraw_texture_init(struct ddraw_texture *texture, struct ddraw *d assert(parent->wined3d_texture == draw_texture); parent->draw_texture = draw_texture; parent->wined3d_texture = wined3d_texture; - wined3d_texture_set_sub_resource_parent(wined3d_texture, i, parent); + wined3d_texture_set_sub_resource_parent(wined3d_texture, i, parent, &ddraw_null_wined3d_parent_ops); wined3d_texture_incref(wined3d_texture); } } diff --git a/dlls/wined3d/texture.c b/dlls/wined3d/texture.c index 33b938ad460..c6e80f45766 100644 --- a/dlls/wined3d/texture.c +++ b/dlls/wined3d/texture.c @@ -4329,7 +4329,7 @@ void * CDECL wined3d_texture_get_sub_resource_parent(struct wined3d_texture *tex }
void CDECL wined3d_texture_set_sub_resource_parent(struct wined3d_texture *texture, - unsigned int sub_resource_idx, void *parent) + unsigned int sub_resource_idx, void *parent, const struct wined3d_parent_ops *parent_ops) { TRACE("texture %p, sub_resource_idx %u, parent %p.\n", texture, sub_resource_idx, parent);
@@ -4337,6 +4337,7 @@ void CDECL wined3d_texture_set_sub_resource_parent(struct wined3d_texture *textu return;
texture->sub_resources[sub_resource_idx].parent = parent; + texture->sub_resources[sub_resource_idx].parent_ops = parent_ops; }
HRESULT CDECL wined3d_texture_get_sub_resource_desc(const struct wined3d_texture *texture, diff --git a/dlls/wined3d/wined3d.spec b/dlls/wined3d/wined3d.spec index 2980568d94e..0f7c7938c39 100644 --- a/dlls/wined3d/wined3d.spec +++ b/dlls/wined3d/wined3d.spec @@ -307,7 +307,7 @@ @ cdecl wined3d_texture_set_color_key(ptr long ptr) @ cdecl wined3d_texture_set_lod(ptr long) @ cdecl wined3d_texture_set_overlay_position(ptr long long long) -@ cdecl wined3d_texture_set_sub_resource_parent(ptr long ptr) +@ cdecl wined3d_texture_set_sub_resource_parent(ptr long ptr ptr) @ cdecl wined3d_texture_update_desc(ptr long long long long long long ptr long) @ cdecl wined3d_texture_update_overlay(ptr long ptr ptr long ptr long)
diff --git a/include/wine/wined3d.h b/include/wine/wined3d.h index 5d8a1156b21..4535892fb5f 100644 --- a/include/wine/wined3d.h +++ b/include/wine/wined3d.h @@ -2866,7 +2866,7 @@ unsigned int __cdecl wined3d_texture_set_lod(struct wined3d_texture *texture, un HRESULT __cdecl wined3d_texture_set_overlay_position(struct wined3d_texture *texture, unsigned int sub_resource_idx, LONG x, LONG y); void __cdecl wined3d_texture_set_sub_resource_parent(struct wined3d_texture *texture, - unsigned int sub_resource_idx, void *parent); + unsigned int sub_resource_idx, void *parent, const struct wined3d_parent_ops *parent_ops); HRESULT __cdecl wined3d_texture_update_desc(struct wined3d_texture *texture, unsigned int sub_resource_idx, UINT width, UINT height, enum wined3d_format_id format_id, enum wined3d_multisample_type multisample_type, UINT multisample_quality,