[PATCH 3/5] d3d10/effect: Store state variables references in their own arrays.
Nikolay Sivov
nsivov at codeweavers.com
Wed Jan 19 04:29:07 CST 2022
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
dlls/d3d10/d3d10_private.h | 1 +
dlls/d3d10/effect.c | 51 ++++++++++++++++++++++++++++++++++++++
2 files changed, 52 insertions(+)
diff --git a/dlls/d3d10/d3d10_private.h b/dlls/d3d10/d3d10_private.h
index 924ed94426c..4ccbb81f78d 100644
--- a/dlls/d3d10/d3d10_private.h
+++ b/dlls/d3d10/d3d10_private.h
@@ -127,6 +127,7 @@ struct d3d10_effect_state_object_variable
ID3D10SamplerState *sampler;
IUnknown *object;
} object;
+ unsigned int index;
struct d3d10_effect_prop_dependencies dependencies;
};
diff --git a/dlls/d3d10/effect.c b/dlls/d3d10/effect.c
index 3b3196a2168..ba7c3590b64 100644
--- a/dlls/d3d10/effect.c
+++ b/dlls/d3d10/effect.c
@@ -3024,6 +3024,7 @@ static HRESULT create_state_object(struct d3d10_effect_variable *v)
static HRESULT parse_fx10_object_variable(const char *data, size_t data_size,
const char **ptr, BOOL shared_type_desc, struct d3d10_effect_variable *v)
{
+ struct d3d10_effect_var_array *vars;
struct d3d10_effect_variable *var;
unsigned int i, j, element_count;
HRESULT hr;
@@ -3137,12 +3138,38 @@ static HRESULT parse_fx10_object_variable(const char *data, size_t data_size,
return E_FAIL;
}
+ switch (v->type->basetype)
+ {
+ case D3D10_SVT_DEPTHSTENCIL:
+ vars = &v->effect->ds_states;
+ break;
+ case D3D10_SVT_BLEND:
+ vars = &v->effect->blend_states;
+ break;
+ case D3D10_SVT_RASTERIZER:
+ vars = &v->effect->rs_states;
+ break;
+ case D3D10_SVT_SAMPLER:
+ vars = &v->effect->samplers;
+ break;
+ default:
+ ;
+ }
+
for (i = 0; i < element_count; ++i)
{
unsigned int prop_count;
var = d3d10_array_get_element(v, i);
+ if (vars->current >= vars->count)
+ {
+ WARN("Wrong variable array size for %#x.\n", v->type->basetype);
+ return E_FAIL;
+ }
+ var->u.state.index = vars->current;
+ vars->v[vars->current++] = var;
+
read_dword(ptr, &prop_count);
TRACE("State object property count: %#x.\n", prop_count);
@@ -3558,6 +3585,30 @@ static HRESULT parse_fx10_body(struct d3d10_effect *e, const char *data, DWORD d
return E_OUTOFMEMORY;
}
+ if (!(e->samplers.v = heap_calloc(e->samplers.count, sizeof(*e->samplers.v))))
+ {
+ ERR("Failed to allocate samplers array.\n");
+ return E_OUTOFMEMORY;
+ }
+
+ if (!(e->blend_states.v = heap_calloc(e->blend_states.count, sizeof(*e->blend_states.v))))
+ {
+ ERR("Failed to allocate blend states array.\n");
+ return E_OUTOFMEMORY;
+ }
+
+ if (!(e->ds_states.v = heap_calloc(e->ds_states.count, sizeof(*e->ds_states.v))))
+ {
+ ERR("Failed to allocate depth stencil states array.\n");
+ return E_OUTOFMEMORY;
+ }
+
+ if (!(e->rs_states.v = heap_calloc(e->rs_states.count, sizeof(*e->rs_states.v))))
+ {
+ ERR("Failed to allocate rasterizer states array.\n");
+ return E_OUTOFMEMORY;
+ }
+
if (!(e->techniques = heap_calloc(e->technique_count, sizeof(*e->techniques))))
{
ERR("Failed to allocate techniques memory\n");
--
2.34.1
More information about the wine-devel
mailing list