[PATCH 08/10] d3dx9: Factor out free_parameter_object_data() function.

Paul Gofman gofmanp at gmail.com
Thu Nov 7 15:17:42 CST 2019


Signed-off-by: Paul Gofman <gofmanp at gmail.com>
---
 dlls/d3dx9_36/effect.c | 29 +++++++++++++++++++++++------
 1 file changed, 23 insertions(+), 6 deletions(-)

diff --git a/dlls/d3dx9_36/effect.c b/dlls/d3dx9_36/effect.c
index 64106abebb..4739b0cc0e 100644
--- a/dlls/d3dx9_36/effect.c
+++ b/dlls/d3dx9_36/effect.c
@@ -540,16 +540,21 @@ static void free_sampler(struct d3dx_sampler *sampler)
 
 static void d3dx_pool_release_shared_parameter(struct d3dx_top_level_parameter *param);
 
-static void free_parameter_data(struct d3dx_parameter *param, BOOL child)
+static void free_parameter_object_data(struct d3dx_parameter *param, const void *data, unsigned int bytes)
 {
-    if (!param->data)
+    unsigned int i, count;
+
+    if (param->class != D3DXPC_OBJECT)
         return;
-    if (param->class == D3DXPC_OBJECT && !param->element_count)
+
+    count = min(param->element_count ? param->element_count : 1, bytes / sizeof(void *));
+
+    for (i = 0; i < count; ++i)
     {
         switch (param->type)
         {
             case D3DXPT_STRING:
-                HeapFree(GetProcessHeap(), 0, *(char **)param->data);
+                HeapFree(GetProcessHeap(), 0, ((char **)data)[i]);
                 break;
 
             case D3DXPT_TEXTURE:
@@ -559,7 +564,8 @@ static void free_parameter_data(struct d3dx_parameter *param, BOOL child)
             case D3DXPT_TEXTURECUBE:
             case D3DXPT_PIXELSHADER:
             case D3DXPT_VERTEXSHADER:
-                if (*(IUnknown **)param->data) IUnknown_Release(*(IUnknown **)param->data);
+                if (*(IUnknown **)data)
+                    IUnknown_Release(((IUnknown **)data)[i]);
                 break;
 
             case D3DXPT_SAMPLER:
@@ -567,7 +573,8 @@ static void free_parameter_data(struct d3dx_parameter *param, BOOL child)
             case D3DXPT_SAMPLER2D:
             case D3DXPT_SAMPLER3D:
             case D3DXPT_SAMPLERCUBE:
-                free_sampler((struct d3dx_sampler *)param->data);
+                assert(count == 1);
+                free_sampler((struct d3dx_sampler *)data);
                 return;
 
             default:
@@ -575,6 +582,16 @@ static void free_parameter_data(struct d3dx_parameter *param, BOOL child)
                 break;
         }
     }
+}
+
+static void free_parameter_data(struct d3dx_parameter *param, BOOL child)
+{
+    if (!param->data)
+        return;
+
+    if (!param->element_count)
+        free_parameter_object_data(param, param->data, param->bytes);
+
     if (!child || is_param_type_sampler(param->type))
         HeapFree(GetProcessHeap(), 0, param->data);
 }
-- 
2.23.0




More information about the wine-devel mailing list