[PATCH 3/9] d3d10/effect: Create variable buffer before parsing buffer members.

Nikolay Sivov nsivov at codeweavers.com
Mon Oct 18 06:08:34 CDT 2021


Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---

This is necessary to handle default values. Buffer should be available before variables are
processed, and after that d3d object is created fully initialized.

 dlls/d3d10/effect.c | 23 +++++++++++++----------
 1 file changed, 13 insertions(+), 10 deletions(-)

diff --git a/dlls/d3d10/effect.c b/dlls/d3d10/effect.c
index 3ceb1a1fbb3..dcfb09211bb 100644
--- a/dlls/d3d10/effect.c
+++ b/dlls/d3d10/effect.c
@@ -2346,7 +2346,7 @@ static HRESULT parse_fx10_object_variable(const char *data, size_t data_size,
     return S_OK;
 }
 
-static HRESULT create_variable_buffer(struct d3d10_effect_variable *v)
+static HRESULT create_buffer_object(struct d3d10_effect_variable *v)
 {
     D3D10_BUFFER_DESC buffer_desc;
     D3D10_SUBRESOURCE_DATA subresource_data;
@@ -2354,13 +2354,7 @@ static HRESULT create_variable_buffer(struct d3d10_effect_variable *v)
     ID3D10Device *device = v->effect->device;
     HRESULT hr;
 
-    if (!(v->u.buffer.local_buffer = heap_alloc_zero(v->type->size_unpacked)))
-    {
-        ERR("Failed to allocate local constant buffer memory.\n");
-        return E_OUTOFMEMORY;
-    }
-
-    buffer_desc.ByteWidth = v->type->size_unpacked;
+    buffer_desc.ByteWidth = v->data_size;
     buffer_desc.Usage = D3D10_USAGE_DEFAULT;
     buffer_desc.CPUAccessFlags = 0;
     buffer_desc.MiscFlags = 0;
@@ -2490,6 +2484,12 @@ static HRESULT parse_fx10_buffer(const char *data, size_t data_size, const char
         return E_OUTOFMEMORY;
     }
 
+    if (local && !(l->u.buffer.local_buffer = heap_alloc_zero(l->data_size)))
+    {
+        ERR("Failed to allocate local constant buffer memory.\n");
+        return E_OUTOFMEMORY;
+    }
+
     for (i = 0; i < l->type->member_count; ++i)
     {
         struct d3d10_effect_variable *v = &l->members[i];
@@ -2579,10 +2579,13 @@ static HRESULT parse_fx10_buffer(const char *data, size_t data_size, const char
     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));
 
-    if (local && l->type->size_unpacked)
+    if (local && l->data_size)
     {
-        if (FAILED(hr = create_variable_buffer(l)))
+        if (FAILED(hr = create_buffer_object(l)))
+        {
+            WARN("Failed to create a buffer object, hr %#x.\n", hr);
             return hr;
+        }
     }
 
     if (l->explicit_bind_point != ~0u)
-- 
2.33.0




More information about the wine-devel mailing list