Henri Verbeet : d3d10: Parse local buffers.

Alexandre Julliard julliard at winehq.org
Tue Jul 14 10:37:33 CDT 2009


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

Author: Henri Verbeet <hverbeet at codeweavers.com>
Date:   Tue Jul 14 11:17:38 2009 +0200

d3d10: Parse local buffers.

---

 dlls/d3d10/d3d10_private.h |   10 +++++++-
 dlls/d3d10/effect.c        |   54 ++++++++++++++++++++++++++++++++++++++-----
 2 files changed, 56 insertions(+), 8 deletions(-)

diff --git a/dlls/d3d10/d3d10_private.h b/dlls/d3d10/d3d10_private.h
index c5a74aa..40ad33e 100644
--- a/dlls/d3d10/d3d10_private.h
+++ b/dlls/d3d10/d3d10_private.h
@@ -58,6 +58,12 @@ struct d3d10_effect_shader_variable
     } shader;
 };
 
+struct d3d10_effect_local_buffer
+{
+    DWORD data_size;
+    DWORD variable_count;
+};
+
 /* ID3D10EffectPass */
 struct d3d10_effect_pass
 {
@@ -91,7 +97,7 @@ struct d3d10_effect
 
     ID3D10Device *device;
     DWORD version;
-    DWORD localbuffers_count;
+    DWORD local_buffer_count;
     DWORD localobjects_count;
     DWORD sharedbuffers_count;
     DWORD sharedobjects_count;
@@ -101,6 +107,8 @@ struct d3d10_effect
     DWORD blendstate_count;
     DWORD rasterizerstate_count;
     DWORD samplerstate_count;
+
+    struct d3d10_effect_local_buffer *local_buffers;
     struct d3d10_effect_technique *techniques;
 };
 
diff --git a/dlls/d3d10/effect.c b/dlls/d3d10/effect.c
index 8316db8..80fdcb0 100644
--- a/dlls/d3d10/effect.c
+++ b/dlls/d3d10/effect.c
@@ -411,13 +411,44 @@ 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)
+{
+    unsigned int i;
+    DWORD offset;
+
+    read_dword(ptr, &offset);
+    TRACE("Local buffer name at offset %#x.\n", offset);
+
+    read_dword(ptr, &l->data_size);
+    TRACE("Local buffer data size: %#x.\n", l->data_size);
+
+    skip_dword_unknown(ptr, 1);
+
+    read_dword(ptr, &l->variable_count);
+    TRACE("Local buffer variable count: %#x.\n", l->variable_count);
+
+    skip_dword_unknown(ptr, 2);
+
+    for (i = 0; i < l->variable_count; ++i)
+    {
+        skip_dword_unknown(ptr, 7);
+    }
+
+    return S_OK;
+}
+
 static HRESULT parse_fx10_body(struct d3d10_effect *e, const char *data, DWORD data_size)
 {
     const char *ptr = data + e->index_offset;
-    HRESULT hr = S_OK;
     unsigned int i;
+    HRESULT hr;
 
-    skip_dword_unknown(&ptr, 6);
+    e->local_buffers = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, e->local_buffer_count * sizeof(*e->local_buffers));
+    if (!e->local_buffers)
+    {
+        ERR("Failed to allocate local buffer memory.\n");
+        return E_OUTOFMEMORY;
+    }
 
     e->techniques = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, e->technique_count * sizeof(*e->techniques));
     if (!e->techniques)
@@ -426,6 +457,14 @@ static HRESULT parse_fx10_body(struct d3d10_effect *e, const char *data, DWORD d
         return E_OUTOFMEMORY;
     }
 
+    for (i = 0; i < e->local_buffer_count; ++i)
+    {
+        struct d3d10_effect_local_buffer *l = &e->local_buffers[i];
+
+        hr = parse_fx10_local_buffer(l, &ptr);
+        if (FAILED(hr)) return hr;
+    }
+
     for (i = 0; i < e->technique_count; ++i)
     {
         struct d3d10_effect_technique *t = &e->techniques[i];
@@ -434,13 +473,13 @@ static HRESULT parse_fx10_body(struct d3d10_effect *e, const char *data, DWORD d
         t->effect = e;
 
         hr = parse_fx10_technique_index(t, &ptr);
-        if (FAILED(hr)) break;
+        if (FAILED(hr)) return hr;
 
         hr = parse_fx10_technique(t, data);
-        if (FAILED(hr)) break;
+        if (FAILED(hr)) return hr;
     }
 
-    return hr;
+    return S_OK;
 }
 
 static HRESULT parse_fx10(struct d3d10_effect *e, const char *data, DWORD data_size)
@@ -452,8 +491,8 @@ static HRESULT parse_fx10(struct d3d10_effect *e, const char *data, DWORD data_s
     read_dword(&ptr, &e->version);
     TRACE("Target: %#x\n", e->version);
 
-    read_dword(&ptr, &e->localbuffers_count);
-    TRACE("Localbuffers count: %u\n", e->localbuffers_count);
+    read_dword(&ptr, &e->local_buffer_count);
+    TRACE("Local buffer count: %u.\n", e->local_buffer_count);
 
     /* Number of variables in local buffers? */
     read_dword(&ptr, &unknown);
@@ -660,6 +699,7 @@ static ULONG STDMETHODCALLTYPE d3d10_effect_Release(ID3D10Effect *iface)
             }
             HeapFree(GetProcessHeap(), 0, This->techniques);
         }
+        HeapFree(GetProcessHeap(), 0, This->local_buffers);
         ID3D10Device_Release(This->device);
         HeapFree(GetProcessHeap(), 0, This);
     }




More information about the wine-cvs mailing list