From: Nikolay Sivov nsivov@codeweavers.com
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/d2d1/d2d1_private.h | 23 ++++++++++++----------- dlls/d2d1/device.c | 40 +++++++++++++++++++++++----------------- dlls/d2d1/effect.c | 18 +++++++++++------- 3 files changed, 46 insertions(+), 35 deletions(-)
diff --git a/dlls/d2d1/d2d1_private.h b/dlls/d2d1/d2d1_private.h index c0ac5ba9a44..fc9e60c3b7d 100644 --- a/dlls/d2d1/d2d1_private.h +++ b/dlls/d2d1/d2d1_private.h @@ -594,10 +594,15 @@ HRESULT d2d_geometry_group_init(struct d2d_geometry *geometry, ID2D1Factory *fac D2D1_FILL_MODE fill_mode, ID2D1Geometry **src_geometries, unsigned int geometry_count); struct d2d_geometry *unsafe_impl_from_ID2D1Geometry(ID2D1Geometry *iface);
-struct d2d_shader +struct d2d_indexed_objects { - GUID id; - IUnknown *shader; + struct + { + GUID id; + IUnknown *object; + } *elements; + size_t size; + size_t count; };
struct d2d_device @@ -607,17 +612,13 @@ struct d2d_device ID2D1Factory1 *factory; IDXGIDevice *dxgi_device;
- struct - { - struct d2d_shader *objects; - size_t size; - size_t count; - } shaders; + struct d2d_indexed_objects shaders; };
struct d2d_device *unsafe_impl_from_ID2D1Device(ID2D1Device1 *iface); -HRESULT d2d_device_add_shader(struct d2d_device *device, REFGUID shader_id, IUnknown *shader); -BOOL d2d_device_is_shader_loaded(struct d2d_device *device, REFGUID shader_id); +HRESULT d2d_device_add_indexed_object(struct d2d_indexed_objects *objects, const GUID *id, + IUnknown *object); +BOOL d2d_device_is_object_indexed(struct d2d_indexed_objects *objects, const GUID *id);
struct d2d_effect_context { diff --git a/dlls/d2d1/device.c b/dlls/d2d1/device.c index 8b1099b180b..7741233f115 100644 --- a/dlls/d2d1/device.c +++ b/dlls/d2d1/device.c @@ -4282,11 +4282,20 @@ static ULONG WINAPI d2d_device_AddRef(ID2D1Device6 *iface) return refcount; }
+static void d2d_device_indexed_objects_clear(struct d2d_indexed_objects *objects) +{ + size_t i; + + for (i = 0; i < objects->count; ++i) + IUnknown_Release(objects->elements[i].object); + free(objects->elements); + objects->elements = NULL; +} + static ULONG WINAPI d2d_device_Release(ID2D1Device6 *iface) { struct d2d_device *device = impl_from_ID2D1Device(iface); ULONG refcount = InterlockedDecrement(&device->refcount); - size_t i;
TRACE("%p decreasing refcount to %lu.\n", iface, refcount);
@@ -4294,9 +4303,7 @@ static ULONG WINAPI d2d_device_Release(ID2D1Device6 *iface) { IDXGIDevice_Release(device->dxgi_device); ID2D1Factory1_Release(device->factory); - for (i = 0; i < device->shaders.count; ++i) - IUnknown_Release(device->shaders.objects[i].shader); - free(device->shaders.objects); + d2d_device_indexed_objects_clear(&device->shaders); free(device); }
@@ -4521,32 +4528,31 @@ void d2d_device_init(struct d2d_device *device, struct d2d_factory *factory, IDX IDXGIDevice_AddRef(device->dxgi_device); }
-HRESULT d2d_device_add_shader(struct d2d_device *device, REFGUID shader_id, IUnknown *shader) +HRESULT d2d_device_add_indexed_object(struct d2d_indexed_objects *objects, + const GUID *id, IUnknown *object) { - struct d2d_shader *entry; - - if (!d2d_array_reserve((void **)&device->shaders.objects, &device->shaders.size, - device->shaders.count + 1, sizeof(*device->shaders.objects))) + if (!d2d_array_reserve((void **)&objects->elements, &objects->size, objects->count + 1, + sizeof(*objects->elements))) { - WARN("Failed to resize shaders array.\n"); + WARN("Failed to resize elements array.\n"); return E_OUTOFMEMORY; }
- entry = &device->shaders.objects[device->shaders.count++]; - entry->id = *shader_id; - entry->shader = shader; - IUnknown_AddRef(entry->shader); + objects->elements[objects->count].id = *id; + objects->elements[objects->count].object = object; + IUnknown_AddRef(object); + objects->count++;
return S_OK; }
-BOOL d2d_device_is_shader_loaded(struct d2d_device *device, REFGUID shader_id) +BOOL d2d_device_is_object_indexed(struct d2d_indexed_objects *objects, const GUID *id) { size_t i;
- for (i = 0; i < device->shaders.count; ++i) + for (i = 0; i < objects->count; ++i) { - if (IsEqualGUID(shader_id, &device->shaders.objects[i].id)) + if (IsEqualGUID(id, &objects->elements[i].id)) return TRUE; }
diff --git a/dlls/d2d1/effect.c b/dlls/d2d1/effect.c index e7f9f78284f..0ad5fabbca7 100644 --- a/dlls/d2d1/effect.c +++ b/dlls/d2d1/effect.c @@ -1451,13 +1451,14 @@ static HRESULT STDMETHODCALLTYPE d2d_effect_context_LoadPixelShader(ID2D1EffectC REFGUID shader_id, const BYTE *buffer, UINT32 buffer_size) { struct d2d_effect_context *effect_context = impl_from_ID2D1EffectContext(iface); + struct d2d_device *device = effect_context->device_context->device; ID3D11PixelShader *shader; HRESULT hr;
TRACE("iface %p, shader_id %s, buffer %p, buffer_size %u.\n", iface, debugstr_guid(shader_id), buffer, buffer_size);
- if (d2d_device_is_shader_loaded(effect_context->device_context->device, shader_id)) + if (d2d_device_is_object_indexed(&device->shaders, shader_id)) return S_OK;
if (FAILED(hr = ID3D11Device1_CreatePixelShader(effect_context->device_context->d3d_device, @@ -1467,7 +1468,7 @@ static HRESULT STDMETHODCALLTYPE d2d_effect_context_LoadPixelShader(ID2D1EffectC return hr; }
- hr = d2d_device_add_shader(effect_context->device_context->device, shader_id, (IUnknown *)shader); + hr = d2d_device_add_indexed_object(&device->shaders, shader_id, (IUnknown *)shader); ID3D11PixelShader_Release(shader);
return hr; @@ -1477,13 +1478,14 @@ static HRESULT STDMETHODCALLTYPE d2d_effect_context_LoadVertexShader(ID2D1Effect REFGUID shader_id, const BYTE *buffer, UINT32 buffer_size) { struct d2d_effect_context *effect_context = impl_from_ID2D1EffectContext(iface); + struct d2d_device *device = effect_context->device_context->device; ID3D11VertexShader *shader; HRESULT hr;
TRACE("iface %p, shader_id %s, buffer %p, buffer_size %u.\n", iface, debugstr_guid(shader_id), buffer, buffer_size);
- if (d2d_device_is_shader_loaded(effect_context->device_context->device, shader_id)) + if (d2d_device_is_object_indexed(&device->shaders, shader_id)) return S_OK;
if (FAILED(hr = ID3D11Device1_CreateVertexShader(effect_context->device_context->d3d_device, @@ -1493,7 +1495,7 @@ static HRESULT STDMETHODCALLTYPE d2d_effect_context_LoadVertexShader(ID2D1Effect return hr; }
- hr = d2d_device_add_shader(effect_context->device_context->device, shader_id, (IUnknown *)shader); + hr = d2d_device_add_indexed_object(&device->shaders, shader_id, (IUnknown *)shader); ID3D11VertexShader_Release(shader);
return hr; @@ -1503,13 +1505,14 @@ static HRESULT STDMETHODCALLTYPE d2d_effect_context_LoadComputeShader(ID2D1Effec REFGUID shader_id, const BYTE *buffer, UINT32 buffer_size) { struct d2d_effect_context *effect_context = impl_from_ID2D1EffectContext(iface); + struct d2d_device *device = effect_context->device_context->device; ID3D11ComputeShader *shader; HRESULT hr;
TRACE("iface %p, shader_id %s, buffer %p, buffer_size %u.\n", iface, debugstr_guid(shader_id), buffer, buffer_size);
- if (d2d_device_is_shader_loaded(effect_context->device_context->device, shader_id)) + if (d2d_device_is_object_indexed(&device->shaders, shader_id)) return S_OK;
if (FAILED(hr = ID3D11Device1_CreateComputeShader(effect_context->device_context->d3d_device, @@ -1519,7 +1522,7 @@ static HRESULT STDMETHODCALLTYPE d2d_effect_context_LoadComputeShader(ID2D1Effec return hr; }
- hr = d2d_device_add_shader(effect_context->device_context->device, shader_id, (IUnknown *)shader); + hr = d2d_device_add_indexed_object(&device->shaders, shader_id, (IUnknown *)shader); ID3D11ComputeShader_Release(shader);
return hr; @@ -1528,10 +1531,11 @@ static HRESULT STDMETHODCALLTYPE d2d_effect_context_LoadComputeShader(ID2D1Effec static BOOL STDMETHODCALLTYPE d2d_effect_context_IsShaderLoaded(ID2D1EffectContext *iface, REFGUID shader_id) { struct d2d_effect_context *effect_context = impl_from_ID2D1EffectContext(iface); + struct d2d_device *device = effect_context->device_context->device;
TRACE("iface %p, shader_id %s.\n", iface, debugstr_guid(shader_id));
- return d2d_device_is_shader_loaded(effect_context->device_context->device, shader_id); + return d2d_device_is_object_indexed(&device->shaders, shader_id); }
static HRESULT STDMETHODCALLTYPE d2d_effect_context_CreateResourceTexture(ID2D1EffectContext *iface,