Henri Verbeet : wined3d: Only use a single allocation for each struct private_data.
Module: wine Branch: master Commit: 64dd435e2ae491f1e6b9174ceda486e9743a46de URL: http://source.winehq.org/git/wine.git/?a=commit;h=64dd435e2ae491f1e6b9174ced... Author: Henri Verbeet <hverbeet(a)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;
participants (1)
-
Alexandre Julliard