Henri Verbeet : wined3d: Store sub-resource parents in struct wined3d_texture_sub_resource().

Alexandre Julliard julliard at wine.codeweavers.com
Thu Apr 21 09:47:17 CDT 2016


Module: wine
Branch: master
Commit: 81b2ed4f0a111e4d0c9ee9d6d7772315d5cdda98
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=81b2ed4f0a111e4d0c9ee9d6d7772315d5cdda98

Author: Henri Verbeet <hverbeet at codeweavers.com>
Date:   Wed Apr 20 19:29:14 2016 +0200

wined3d: Store sub-resource parents in struct wined3d_texture_sub_resource().

Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/wined3d/texture.c         | 26 +++++++++++++-------------
 dlls/wined3d/view.c            |  2 +-
 dlls/wined3d/wined3d_private.h |  4 ++++
 3 files changed, 18 insertions(+), 14 deletions(-)

diff --git a/dlls/wined3d/texture.c b/dlls/wined3d/texture.c
index a5270c6..149b5e3 100644
--- a/dlls/wined3d/texture.c
+++ b/dlls/wined3d/texture.c
@@ -1423,17 +1423,19 @@ static void texture2d_prepare_texture(struct wined3d_texture *texture, struct wi
 static void texture2d_cleanup_sub_resources(struct wined3d_texture *texture)
 {
     unsigned int sub_count = texture->level_count * texture->layer_count;
+    struct wined3d_texture_sub_resource *sub_resource;
     struct wined3d_surface *surface;
     unsigned int i;
 
     for (i = 0; i < sub_count; ++i)
     {
-        if ((surface = texture->sub_resources[i].u.surface))
+        sub_resource = &texture->sub_resources[i];
+        if ((surface = sub_resource->u.surface))
         {
             TRACE("surface %p.\n", surface);
 
             wined3d_surface_cleanup(surface);
-            surface->resource.parent_ops->wined3d_object_destroyed(surface->resource.parent);
+            sub_resource->parent_ops->wined3d_object_destroyed(sub_resource->parent);
         }
     }
     HeapFree(GetProcessHeap(), 0, texture->sub_resources[0].u.surface);
@@ -1937,7 +1939,7 @@ static HRESULT texture_init(struct wined3d_texture *texture, const struct wined3
             }
 
             if (FAILED(hr = device_parent->ops->surface_created(device_parent,
-                    texture, idx, &parent, &parent_ops)))
+                    texture, idx, &sub_resource->parent, &sub_resource->parent_ops)))
             {
                 WARN("Failed to create surface parent, hr %#x.\n", hr);
                 wined3d_surface_cleanup(surface);
@@ -1945,10 +1947,8 @@ static HRESULT texture_init(struct wined3d_texture *texture, const struct wined3
                 return hr;
             }
 
-            TRACE("parent %p, parent_ops %p.\n", parent, parent_ops);
+            TRACE("parent %p, parent_ops %p.\n", sub_resource->parent, sub_resource->parent_ops);
 
-            surface->resource.parent = parent;
-            surface->resource.parent_ops = parent_ops;
             TRACE("Created surface level %u, layer %u @ %p.\n", i, j, surface);
 
             if (((desc->usage & WINED3DUSAGE_OWNDC) || (device->wined3d->flags & WINED3D_NO3D))
@@ -2014,17 +2014,19 @@ static void texture3d_prepare_texture(struct wined3d_texture *texture, struct wi
 static void texture3d_cleanup_sub_resources(struct wined3d_texture *texture)
 {
     unsigned int sub_count = texture->level_count * texture->layer_count;
+    struct wined3d_texture_sub_resource *sub_resource;
     struct wined3d_volume *volume;
     unsigned int i;
 
     for (i = 0; i < sub_count; ++i)
     {
-        if ((volume = texture->sub_resources[i].u.volume))
+        sub_resource = &texture->sub_resources[i];
+        if ((volume = sub_resource->u.volume))
         {
             TRACE("volume %p.\n", volume);
 
             wined3d_volume_cleanup(volume);
-            volume->resource.parent_ops->wined3d_object_destroyed(volume->resource.parent);
+            sub_resource->parent_ops->wined3d_object_destroyed(sub_resource->parent);
         }
     }
     HeapFree(GetProcessHeap(), 0, texture->sub_resources[0].u.volume);
@@ -2191,7 +2193,7 @@ static HRESULT volumetexture_init(struct wined3d_texture *texture, const struct
         sub_resource->u.volume = volume;
 
         if (FAILED(hr = device_parent->ops->volume_created(device_parent,
-                texture, i, &parent, &parent_ops)))
+                texture, i, &sub_resource->parent, &sub_resource->parent_ops)))
         {
             WARN("Failed to create volume parent, hr %#x.\n", hr);
             wined3d_volume_cleanup(volume);
@@ -2201,8 +2203,6 @@ static HRESULT volumetexture_init(struct wined3d_texture *texture, const struct
 
         TRACE("parent %p, parent_ops %p.\n", parent, parent_ops);
 
-        volume->resource.parent = parent;
-        volume->resource.parent_ops = parent_ops;
         TRACE("Created volume level %u @ %p.\n", i, volume);
 
         /* Calculate the next mipmap level. */
@@ -2377,7 +2377,7 @@ void * CDECL wined3d_texture_get_sub_resource_parent(struct wined3d_texture *tex
         return NULL;
     }
 
-    return texture->sub_resources[sub_resource_idx].resource->parent;
+    return texture->sub_resources[sub_resource_idx].parent;
 }
 
 void CDECL wined3d_texture_set_sub_resource_parent(struct wined3d_texture *texture,
@@ -2393,7 +2393,7 @@ void CDECL wined3d_texture_set_sub_resource_parent(struct wined3d_texture *textu
         return;
     }
 
-    texture->sub_resources[sub_resource_idx].resource->parent = parent;
+    texture->sub_resources[sub_resource_idx].parent = parent;
 }
 
 HRESULT CDECL wined3d_texture_get_sub_resource_desc(const struct wined3d_texture *texture,
diff --git a/dlls/wined3d/view.c b/dlls/wined3d/view.c
index 4417293..773dccf 100644
--- a/dlls/wined3d/view.c
+++ b/dlls/wined3d/view.c
@@ -69,7 +69,7 @@ void * CDECL wined3d_rendertarget_view_get_sub_resource_parent(const struct wine
 
     texture = texture_from_resource(view->resource);
 
-    return wined3d_resource_get_parent(texture->sub_resources[view->sub_resource_idx].resource);
+    return texture->sub_resources[view->sub_resource_idx].parent;
 }
 
 void CDECL wined3d_rendertarget_view_set_parent(struct wined3d_rendertarget_view *view, void *parent)
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 351584e..7421368 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -2500,6 +2500,10 @@ struct wined3d_texture
     struct wined3d_texture_sub_resource
     {
         struct wined3d_resource *resource;
+
+        void *parent;
+        const struct wined3d_parent_ops *parent_ops;
+
         union
         {
             struct wined3d_surface *surface;




More information about the wine-cvs mailing list