Rico Schüller : d3dx9: Parse effect type D3DXPC_STRUCT .

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


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

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

d3dx9: Parse effect type D3DXPC_STRUCT.

---

 dlls/d3dx9_36/effect.c |   54 ++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 52 insertions(+), 2 deletions(-)

diff --git a/dlls/d3dx9_36/effect.c b/dlls/d3dx9_36/effect.c
index 0e93706..a7c2b6e 100644
--- a/dlls/d3dx9_36/effect.c
+++ b/dlls/d3dx9_36/effect.c
@@ -132,7 +132,12 @@ static void free_parameter(D3DXHANDLE handle)
 
     if (param->member_handles)
     {
-        for (i = 0; i < param->element_count; ++i)
+        unsigned int count;
+
+        if (param->element_count) count = param->element_count;
+        else count = param->member_count;
+
+        for (i = 0; i < count; ++i)
         {
             free_parameter(param->member_handles[i]);
         }
@@ -2444,6 +2449,11 @@ static HRESULT d3dx9_parse_effect_typedef(struct d3dx_parameter *param, const ch
                 param->bytes = 4 * param->rows * param->columns;
                 break;
 
+            case D3DXPC_STRUCT:
+                read_dword(ptr, &param->member_count);
+                TRACE("Members: %u\n", param->member_count);
+                break;
+
             default:
                 FIXME("Unhandled class %s\n", debug_d3dxparameter_class(param->class));
                 break;
@@ -2502,6 +2512,41 @@ static HRESULT d3dx9_parse_effect_typedef(struct d3dx_parameter *param, const ch
 
         param->bytes = param_bytes;
     }
+    else if (param->member_count)
+    {
+        member_handles = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*member_handles) * param->member_count);
+        if (!member_handles)
+        {
+            ERR("Out of memory\n");
+            hr = E_OUTOFMEMORY;
+            goto err_out;
+        }
+
+        for (i = 0; i < param->member_count; ++i)
+        {
+            struct d3dx_parameter *member;
+
+            member = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*member));
+            if (!member)
+            {
+                ERR("Out of memory\n");
+                hr = E_OUTOFMEMORY;
+                goto err_out;
+            }
+
+            member_handles[i] = get_parameter_handle(member);
+            member->base = param->base;
+
+            hr = d3dx9_parse_effect_typedef(member, data, ptr, NULL);
+            if (hr != D3D_OK)
+            {
+                WARN("Failed to parse member\n");
+                goto err_out;
+            }
+
+            param->bytes += member->bytes;
+        }
+    }
 
     param->member_handles = member_handles;
 
@@ -2511,7 +2556,12 @@ err_out:
 
     if (member_handles)
     {
-        for (i = 0; i < param->element_count; ++i)
+        unsigned int count;
+
+        if (param->element_count) count = param->element_count;
+        else count = param->member_count;
+
+        for (i = 0; i < count; ++i)
         {
             free_parameter(member_handles[i]);
         }




More information about the wine-cvs mailing list