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