[PATCH 3/5] d3d10: Parse local buffer names.

Henri Verbeet hverbeet at codeweavers.com
Tue Jul 14 04:17:39 CDT 2009


---
 dlls/d3d10/d3d10_private.h |    1 +
 dlls/d3d10/effect.c        |   51 ++++++++++++++++++++++++++++++++++++++++---
 2 files changed, 48 insertions(+), 4 deletions(-)

diff --git a/dlls/d3d10/d3d10_private.h b/dlls/d3d10/d3d10_private.h
index 40ad33e..400ea73 100644
--- a/dlls/d3d10/d3d10_private.h
+++ b/dlls/d3d10/d3d10_private.h
@@ -60,6 +60,7 @@ struct d3d10_effect_shader_variable
 
 struct d3d10_effect_local_buffer
 {
+    char *name;
     DWORD data_size;
     DWORD variable_count;
 };
diff --git a/dlls/d3d10/effect.c b/dlls/d3d10/effect.c
index 80fdcb0..31ef070 100644
--- a/dlls/d3d10/effect.c
+++ b/dlls/d3d10/effect.c
@@ -195,6 +195,24 @@ static HRESULT parse_fx10_technique_index(struct d3d10_effect_technique *t, cons
     return hr;
 }
 
+static char *copy_name(const char *ptr)
+{
+    size_t name_len;
+    char *name;
+
+    name_len = strlen(ptr) + 1;
+    name = HeapAlloc(GetProcessHeap(), 0, name_len);
+    if (!name)
+    {
+        ERR("Failed to allocate name memory.\n");
+        return NULL;
+    }
+
+    memcpy(name, ptr, name_len);
+
+    return name;
+}
+
 static HRESULT shader_chunk_handler(const char *data, DWORD data_size, DWORD tag, void *ctx)
 {
     struct d3d10_effect_shader_variable *s = ctx;
@@ -411,7 +429,7 @@ static HRESULT parse_fx10_technique(struct d3d10_effect_technique *t, const char
     return hr;
 }
 
-static HRESULT parse_fx10_local_buffer(struct d3d10_effect_local_buffer *l, const char **ptr)
+static HRESULT parse_fx10_local_buffer(struct d3d10_effect_local_buffer *l, const char **ptr, const char *data)
 {
     unsigned int i;
     DWORD offset;
@@ -419,6 +437,14 @@ static HRESULT parse_fx10_local_buffer(struct d3d10_effect_local_buffer *l, cons
     read_dword(ptr, &offset);
     TRACE("Local buffer name at offset %#x.\n", offset);
 
+    l->name = copy_name(data + offset);
+    if (!l->name)
+    {
+        ERR("Failed to copy name.\n");
+        return E_OUTOFMEMORY;
+    }
+    TRACE("Local buffer name: %s.\n", l->name);
+
     read_dword(ptr, &l->data_size);
     TRACE("Local buffer data size: %#x.\n", l->data_size);
 
@@ -461,7 +487,7 @@ static HRESULT parse_fx10_body(struct d3d10_effect *e, const char *data, DWORD d
     {
         struct d3d10_effect_local_buffer *l = &e->local_buffers[i];
 
-        hr = parse_fx10_local_buffer(l, &ptr);
+        hr = parse_fx10_local_buffer(l, &ptr, data);
         if (FAILED(hr)) return hr;
     }
 
@@ -651,6 +677,13 @@ static void d3d10_effect_technique_destroy(struct d3d10_effect_technique *t)
     }
 }
 
+static void d3d10_effect_local_buffer_destroy(struct d3d10_effect_local_buffer *l)
+{
+    TRACE("local buffer %p.\n", l);
+
+    HeapFree(GetProcessHeap(), 0, l->name);
+}
+
 /* IUnknown methods */
 
 static HRESULT STDMETHODCALLTYPE d3d10_effect_QueryInterface(ID3D10Effect *iface, REFIID riid, void **object)
@@ -690,16 +723,26 @@ static ULONG STDMETHODCALLTYPE d3d10_effect_Release(ID3D10Effect *iface)
 
     if (!refcount)
     {
+        unsigned int i;
+
         if (This->techniques)
         {
-            unsigned int i;
             for (i = 0; i < This->technique_count; ++i)
             {
                 d3d10_effect_technique_destroy(&This->techniques[i]);
             }
             HeapFree(GetProcessHeap(), 0, This->techniques);
         }
-        HeapFree(GetProcessHeap(), 0, This->local_buffers);
+
+        if (This->local_buffers)
+        {
+            for (i = 0; i < This->local_buffer_count; ++i)
+            {
+                d3d10_effect_local_buffer_destroy(&This->local_buffers[i]);
+            }
+            HeapFree(GetProcessHeap(), 0, This->local_buffers);
+        }
+
         ID3D10Device_Release(This->device);
         HeapFree(GetProcessHeap(), 0, This);
     }
-- 
1.6.0.6




More information about the wine-patches mailing list