[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