Henri Verbeet : wined3d: Only use a single allocation for each struct private_data.

Alexandre Julliard julliard at winehq.org
Thu Mar 13 14:40:34 CDT 2014


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

Author: Henri Verbeet <hverbeet at codeweavers.com>
Date:   Thu Mar 13 12:51:15 2014 +0100

wined3d: Only use a single allocation for each struct private_data.

---

 dlls/wined3d/resource.c |   50 +++++++++++++++--------------------------------
 1 file changed, 16 insertions(+), 34 deletions(-)

diff --git a/dlls/wined3d/resource.c b/dlls/wined3d/resource.c
index 8813af7..6c3fd7a 100644
--- a/dlls/wined3d/resource.c
+++ b/dlls/wined3d/resource.c
@@ -33,14 +33,12 @@ struct private_data
 
     GUID tag;
     DWORD flags; /* DDSPD_* */
-
+    DWORD size;
     union
     {
-        void *data;
+        BYTE data[1];
         IUnknown *object;
     } ptr;
-
-    DWORD size;
 };
 
 static DWORD resource_access_from_pool(enum wined3d_pool pool)
@@ -207,40 +205,32 @@ HRESULT CDECL wined3d_resource_set_private_data(struct wined3d_resource *resourc
         const void *data, DWORD data_size, DWORD flags)
 {
     struct private_data *d;
+    const void *ptr = data;
 
     TRACE("resource %p, riid %s, data %p, data_size %u, flags %#x.\n",
             resource, debugstr_guid(guid), data, data_size, flags);
 
-    if (flags & WINED3DSPD_IUNKNOWN && data_size != sizeof(IUnknown *))
+    if (flags & WINED3DSPD_IUNKNOWN)
     {
-        WARN("IUnknown data with size %u, returning WINED3DERR_INVALIDCALL.\n", data_size);
-        return WINED3DERR_INVALIDCALL;
+        if (data_size != sizeof(IUnknown *))
+        {
+            WARN("IUnknown data with size %u, returning WINED3DERR_INVALIDCALL.\n", data_size);
+            return WINED3DERR_INVALIDCALL;
+        }
+        ptr = &data;
     }
 
-    d = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*d));
-    if (!d) return E_OUTOFMEMORY;
+    if (!(d = HeapAlloc(GetProcessHeap(), 0, FIELD_OFFSET(struct private_data, ptr.data[data_size]))))
+        return E_OUTOFMEMORY;
+    wined3d_resource_free_private_data(resource, guid);
 
     d->tag = *guid;
     d->flags = flags;
+    d->size = data_size;
 
+    memcpy(d->ptr.data, ptr, data_size);
     if (flags & WINED3DSPD_IUNKNOWN)
-    {
-        d->ptr.object = (IUnknown *)data;
-        d->size = sizeof(IUnknown *);
         IUnknown_AddRef(d->ptr.object);
-    }
-    else
-    {
-        d->ptr.data = HeapAlloc(GetProcessHeap(), 0, data_size);
-        if (!d->ptr.data)
-        {
-            HeapFree(GetProcessHeap(), 0, d);
-            return E_OUTOFMEMORY;
-        }
-        d->size = data_size;
-        memcpy(d->ptr.data, data, data_size);
-    }
-    wined3d_resource_free_private_data(resource, guid);
     list_add_tail(&resource->privateData, &d->entry);
 
     return WINED3D_OK;
@@ -294,16 +284,8 @@ HRESULT CDECL wined3d_resource_free_private_data(struct wined3d_resource *resour
     if (!data) return WINED3DERR_NOTFOUND;
 
     if (data->flags & WINED3DSPD_IUNKNOWN)
-    {
-        if (data->ptr.object)
-            IUnknown_Release(data->ptr.object);
-    }
-    else
-    {
-        HeapFree(GetProcessHeap(), 0, data->ptr.data);
-    }
+        IUnknown_Release(data->ptr.object);
     list_remove(&data->entry);
-
     HeapFree(GetProcessHeap(), 0, data);
 
     return WINED3D_OK;




More information about the wine-cvs mailing list