Module: wine Branch: master Commit: 64dd435e2ae491f1e6b9174ceda486e9743a46de URL: http://source.winehq.org/git/wine.git/?a=commit;h=64dd435e2ae491f1e6b9174ced...
Author: Henri Verbeet hverbeet@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;