Rico Schüller : d3dx9: Parse value data.

Alexandre Julliard julliard at winehq.org
Tue Apr 12 11:07:35 CDT 2011


Module: wine
Branch: master
Commit: 0f10e1b3442b4d629a36007a1a76c4060c78501e
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=0f10e1b3442b4d629a36007a1a76c4060c78501e

Author: Rico Schüller <kgbricola at web.de>
Date:   Mon Apr 11 21:20:39 2011 +0200

d3dx9: Parse value data.

---

 dlls/d3dx9_36/effect.c |  130 ++++++++++++++++++++++++++++++++++++++++++++----
 1 files changed, 120 insertions(+), 10 deletions(-)

diff --git a/dlls/d3dx9_36/effect.c b/dlls/d3dx9_36/effect.c
index 67877ec..f31ac31 100644
--- a/dlls/d3dx9_36/effect.c
+++ b/dlls/d3dx9_36/effect.c
@@ -36,6 +36,7 @@ struct d3dx_parameter
 
     char *name;
     char *semantic;
+    void *data;
     D3DXPARAMETER_CLASS class;
     D3DXPARAMETER_TYPE  type;
     UINT rows;
@@ -111,23 +112,28 @@ static D3DXHANDLE get_parameter_handle(struct d3dx_parameter *parameter)
     return (D3DXHANDLE) parameter;
 }
 
-static void free_parameter(D3DXHANDLE handle, BOOL element)
+static void free_parameter(D3DXHANDLE handle, BOOL element, BOOL child)
 {
     unsigned int i;
     struct d3dx_parameter *param = get_parameter_struct(handle);
 
-    TRACE("Free parameter %p\n", param);
+    TRACE("Free parameter %p, child %s\n", param, child ? "yes" : "no");
 
     if (!param)
     {
         return;
     }
 
+    if (!child)
+    {
+        HeapFree(GetProcessHeap(), 0, param->data);
+    }
+
     if (param->annotation_handles)
     {
         for (i = 0; i < param->annotation_count; ++i)
         {
-            free_parameter(param->annotation_handles[i], FALSE);
+            free_parameter(param->annotation_handles[i], FALSE, FALSE);
         }
         HeapFree(GetProcessHeap(), 0, param->annotation_handles);
     }
@@ -141,7 +147,7 @@ static void free_parameter(D3DXHANDLE handle, BOOL element)
 
         for (i = 0; i < count; ++i)
         {
-            free_parameter(param->member_handles[i], param->element_count != 0);
+            free_parameter(param->member_handles[i], param->element_count != 0, TRUE);
         }
         HeapFree(GetProcessHeap(), 0, param->member_handles);
     }
@@ -166,7 +172,7 @@ static void free_base_effect(struct ID3DXBaseEffectImpl *base)
     {
         for (i = 0; i < base->parameter_count; ++i)
         {
-            free_parameter(base->parameter_handles[i], FALSE);
+            free_parameter(base->parameter_handles[i], FALSE, FALSE);
         }
         HeapFree(GetProcessHeap(), 0, base->parameter_handles);
     }
@@ -2406,6 +2412,100 @@ static const struct ID3DXEffectCompilerVtbl ID3DXEffectCompiler_Vtbl =
     ID3DXEffectCompilerImpl_CompileShader,
 };
 
+static HRESULT d3dx9_parse_value(struct d3dx_parameter *param, void *value)
+{
+    unsigned int i;
+    HRESULT hr;
+    UINT old_size = 0;
+
+    if (param->element_count)
+    {
+        param->data = value;
+
+        for (i = 0; i < param->element_count; ++i)
+        {
+            struct d3dx_parameter *member = get_parameter_struct(param->member_handles[i]);
+
+            hr = d3dx9_parse_value(member, (char *)value + old_size);
+            if (hr != D3D_OK)
+            {
+                WARN("Failed to parse value\n");
+                return hr;
+            }
+
+            old_size += member->bytes;
+        }
+
+        return D3D_OK;
+    }
+
+    switch(param->class)
+    {
+        case D3DXPC_SCALAR:
+        case D3DXPC_VECTOR:
+        case D3DXPC_MATRIX_ROWS:
+        case D3DXPC_MATRIX_COLUMNS:
+            param->data = value;
+            break;
+
+        case D3DXPC_STRUCT:
+            param->data = value;
+
+            for (i = 0; i < param->member_count; ++i)
+            {
+                struct d3dx_parameter *member = get_parameter_struct(param->member_handles[i]);
+
+                hr = d3dx9_parse_value(member, (char *)value + old_size);
+                if (hr != D3D_OK)
+                {
+                    WARN("Failed to parse value\n");
+                    return hr;
+                }
+
+                old_size += member->bytes;
+            }
+            break;
+
+        default:
+            FIXME("Unhandled class %s\n", debug_d3dxparameter_class(param->class));
+            break;
+    }
+
+    return D3D_OK;
+}
+
+
+static HRESULT d3dx9_parse_init_value(struct d3dx_parameter *param, const char *ptr)
+{
+    UINT size = param->bytes;
+    HRESULT hr;
+    void *value;
+
+    TRACE("param size: %u\n", size);
+
+    value = HeapAlloc(GetProcessHeap(), 0, size);
+    if (!value)
+    {
+        ERR("Failed to allocate data memory.\n");
+        return E_OUTOFMEMORY;
+    }
+
+    TRACE("Data: %s.\n", debugstr_an(ptr, size));
+    memcpy(value, ptr, size);
+
+    hr = d3dx9_parse_value(param, value);
+    if (hr != D3D_OK)
+    {
+        WARN("Failed to parse value\n");
+        HeapFree(GetProcessHeap(), 0, value);
+        return hr;
+    }
+
+    param->data = value;
+
+    return D3D_OK;
+}
+
 static HRESULT d3dx9_parse_name(char **name, const char *ptr)
 {
     DWORD size;
@@ -2609,7 +2709,7 @@ err_out:
 
         for (i = 0; i < count; ++i)
         {
-            free_parameter(member_handles[i], param->element_count != 0);
+            free_parameter(member_handles[i], param->element_count != 0, TRUE);
         }
         HeapFree(GetProcessHeap(), 0, member_handles);
     }
@@ -2645,7 +2745,12 @@ static HRESULT d3dx9_parse_effect_annotation(struct d3dx_parameter *anno, const
 
     read_dword(ptr, &offset);
     TRACE("Value offset: %#x\n", offset);
-    /* todo: Parse value */
+    hr = d3dx9_parse_init_value(anno, data + offset);
+    if (hr != D3D_OK)
+    {
+        WARN("Failed to parse value\n");
+        return hr;
+    }
 
     return D3D_OK;
 }
@@ -2678,7 +2783,12 @@ static HRESULT d3dx9_parse_effect_parameter(struct d3dx_parameter *param, const
         return hr;
     }
 
-    /* todo: Parse value */
+    hr = d3dx9_parse_init_value(param, data + offset);
+    if (hr != D3D_OK)
+    {
+        WARN("Failed to parse value\n");
+        return hr;
+    }
 
     if (param->annotation_count)
     {
@@ -2724,7 +2834,7 @@ err_out:
     {
         for (i = 0; i < param->annotation_count; ++i)
         {
-            free_parameter(annotation_handles[i], FALSE);
+            free_parameter(annotation_handles[i], FALSE, FALSE);
         }
         HeapFree(GetProcessHeap(), 0, annotation_handles);
     }
@@ -2793,7 +2903,7 @@ err_out:
     {
         for (i = 0; i < base->parameter_count; ++i)
         {
-            free_parameter(parameter_handles[i], FALSE);
+            free_parameter(parameter_handles[i], FALSE, FALSE);
         }
         HeapFree(GetProcessHeap(), 0, parameter_handles);
     }




More information about the wine-cvs mailing list