Rico Schüller : d3d10: Parse constant buffer type.

Alexandre Julliard julliard at winehq.org
Wed Sep 30 10:56:10 CDT 2009


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

Author: Rico Schüller <kgbricola at web.de>
Date:   Wed Sep 30 11:39:56 2009 +0200

d3d10: Parse constant buffer type.

---

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

diff --git a/dlls/d3d10/d3d10_private.h b/dlls/d3d10/d3d10_private.h
index 7ef2c17..ae4d6f2 100644
--- a/dlls/d3d10/d3d10_private.h
+++ b/dlls/d3d10/d3d10_private.h
@@ -109,8 +109,8 @@ struct d3d10_effect_local_buffer
     struct d3d10_effect *effect;
     char *name;
     DWORD data_size;
-    DWORD member_count;
     DWORD annotation_count;
+    struct d3d10_effect_type *type;
     struct d3d10_effect_variable *members;
     struct d3d10_effect_variable *annotations;
 };
diff --git a/dlls/d3d10/effect.c b/dlls/d3d10/effect.c
index ccbc3c4..e2a1c88 100644
--- a/dlls/d3d10/effect.c
+++ b/dlls/d3d10/effect.c
@@ -717,8 +717,18 @@ static HRESULT parse_fx10_local_buffer(struct d3d10_effect_local_buffer *l, cons
 {
     unsigned int i;
     DWORD offset;
+    D3D10_CBUFFER_TYPE d3d10_cbuffer_type;
     HRESULT hr;
 
+    l->type = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*l->type));
+    if (!l->type)
+    {
+        ERR("Failed to allocate local buffer type memory.\n");
+        return E_OUTOFMEMORY;
+    }
+    l->type->vtbl = &d3d10_effect_type_vtbl;
+    l->type->type_class = D3D10_SVC_OBJECT;
+
     read_dword(ptr, &offset);
     TRACE("Local buffer name at offset %#x.\n", offset);
 
@@ -732,10 +742,36 @@ static HRESULT parse_fx10_local_buffer(struct d3d10_effect_local_buffer *l, cons
     read_dword(ptr, &l->data_size);
     TRACE("Local buffer data size: %#x.\n", l->data_size);
 
-    skip_dword_unknown(ptr, 1);
+    read_dword(ptr, &d3d10_cbuffer_type);
+    TRACE("Local buffer type: %#x.\n", d3d10_cbuffer_type);
+
+    switch(d3d10_cbuffer_type)
+    {
+        case D3D10_CT_CBUFFER:
+            l->type->basetype = D3D10_SVT_CBUFFER;
+            if (!copy_name("cbuffer", &l->type->name))
+            {
+                ERR("Failed to copy name.\n");
+                return E_OUTOFMEMORY;
+            }
+            break;
 
-    read_dword(ptr, &l->member_count);
-    TRACE("Local buffer member count: %#x.\n", l->member_count);
+        case D3D10_CT_TBUFFER:
+            l->type->basetype = D3D10_SVT_TBUFFER;
+            if (!copy_name("tbuffer", &l->type->name))
+            {
+                ERR("Failed to copy name.\n");
+                return E_OUTOFMEMORY;
+            }
+            break;
+
+        default:
+            ERR("Unexpected D3D10_CBUFFER_TYPE %#x!\n", d3d10_cbuffer_type);
+            return E_FAIL;
+    }
+
+    read_dword(ptr, &l->type->member_count);
+    TRACE("Local buffer member count: %#x.\n", l->type->member_count);
 
     skip_dword_unknown(ptr, 1);
 
@@ -759,14 +795,14 @@ static HRESULT parse_fx10_local_buffer(struct d3d10_effect_local_buffer *l, cons
         if (FAILED(hr)) return hr;
     }
 
-    l->members = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, l->member_count * sizeof(*l->members));
+    l->members = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, l->type->member_count * sizeof(*l->members));
     if (!l->members)
     {
         ERR("Failed to allocate members memory.\n");
         return E_OUTOFMEMORY;
     }
 
-    for (i = 0; i < l->member_count; ++i)
+    for (i = 0; i < l->type->member_count; ++i)
     {
         struct d3d10_effect_variable *v = &l->members[i];
 
@@ -775,7 +811,21 @@ static HRESULT parse_fx10_local_buffer(struct d3d10_effect_local_buffer *l, cons
 
         hr = parse_fx10_variable(v, ptr, data);
         if (FAILED(hr)) return hr;
+
+        l->type->size_packed += v->type->size_packed;
+        l->type->size_unpacked += v->type->size_unpacked;
     }
+    l->type->stride = l->type->size_unpacked = (l->type->size_unpacked + 0xf) & ~0xf;
+
+    TRACE("Constant buffer:\n");
+    TRACE("\tType name: %s.\n", debugstr_a(l->type->name));
+    TRACE("\tElement count: %u.\n", l->type->element_count);
+    TRACE("\tMember count: %u.\n", l->type->member_count);
+    TRACE("\tUnpacked size: %#x.\n", l->type->size_unpacked);
+    TRACE("\tStride: %#x.\n", l->type->stride);
+    TRACE("\tPacked size %#x.\n", l->type->size_packed);
+    TRACE("\tBasetype: %s.\n", debug_d3d10_shader_variable_type(l->type->basetype));
+    TRACE("\tTypeclass: %s.\n", debug_d3d10_shader_variable_class(l->type->type_class));
 
     return S_OK;
 }
@@ -1070,12 +1120,14 @@ static void d3d10_effect_local_buffer_destroy(struct d3d10_effect_local_buffer *
     HeapFree(GetProcessHeap(), 0, l->name);
     if (l->members)
     {
-        for (i = 0; i < l->member_count; ++i)
+        for (i = 0; i < l->type->member_count; ++i)
         {
             d3d10_effect_variable_destroy(&l->members[i]);
         }
         HeapFree(GetProcessHeap(), 0, l->members);
     }
+    HeapFree(GetProcessHeap(), 0, l->type->name);
+    HeapFree(GetProcessHeap(), 0, l->type);
 
     if (l->annotations)
     {
@@ -1254,7 +1306,7 @@ static struct ID3D10EffectVariable * STDMETHODCALLTYPE d3d10_effect_GetVariableB
         struct d3d10_effect_local_buffer *l = &This->local_buffers[i];
         unsigned int j;
 
-        for (j = 0; j < l->member_count; ++j)
+        for (j = 0; j < l->type->member_count; ++j)
         {
             struct d3d10_effect_variable *v = &l->members[j];
 




More information about the wine-cvs mailing list