Signed-off-by: Nikolay Sivov nsivov@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)