d3d10/effect: Use separate structure for annotations array.

Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com>
Signed-off-by: Matteo Bruni <mbruni@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Nikolay Sivov 2021-10-08 08:13:32 +03:00 committed by Alexandre Julliard
parent b56ed5f03f
commit ab5b335c13
2 changed files with 98 additions and 149 deletions

View File

@ -181,6 +181,12 @@ struct d3d10_effect_type_member
struct d3d10_effect_type *type;
};
struct d3d10_effect_annotations
{
struct d3d10_effect_variable *elements;
unsigned int count;
};
/* ID3D10EffectVariable */
struct d3d10_effect_variable
{
@ -192,14 +198,13 @@ struct d3d10_effect_variable
char *name;
char *semantic;
DWORD buffer_offset;
DWORD annotation_count;
DWORD flag;
DWORD data_size;
DWORD explicit_bind_point;
struct d3d10_effect *effect;
struct d3d10_effect_variable *elements;
struct d3d10_effect_variable *members;
struct d3d10_effect_variable *annotations;
struct d3d10_effect_annotations annotations;
union
{
@ -223,8 +228,7 @@ struct d3d10_effect_pass
struct d3d10_effect_technique *technique;
char *name;
DWORD annotation_count;
struct d3d10_effect_variable *annotations;
struct d3d10_effect_annotations annotations;
struct d3d10_effect_pass_shader_desc vs;
struct d3d10_effect_pass_shader_desc ps;
@ -244,10 +248,9 @@ struct d3d10_effect_technique
struct d3d10_effect *effect;
char *name;
struct d3d10_effect_annotations annotations;
DWORD pass_count;
DWORD annotation_count;
struct d3d10_effect_pass *passes;
struct d3d10_effect_variable *annotations;
};
struct d3d10_effect_anonymous_shader

View File

@ -1439,21 +1439,20 @@ static HRESULT parse_fx10_annotation(const char *data, size_t data_size,
}
static HRESULT parse_fx10_annotations(const char *data, size_t data_size, const char **ptr,
struct d3d10_effect *effect, unsigned int annotation_count,
struct d3d10_effect_variable **annotations)
struct d3d10_effect *effect, struct d3d10_effect_annotations *annotations)
{
unsigned int i;
HRESULT hr;
if (!(*annotations = heap_calloc(annotation_count, sizeof(**annotations))))
if (!(annotations->elements = heap_calloc(annotations->count, sizeof(*annotations->elements))))
{
ERR("Failed to allocate annotations memory.\n");
return E_OUTOFMEMORY;
}
for (i = 0; i < annotation_count; ++i)
for (i = 0; i < annotations->count; ++i)
{
struct d3d10_effect_variable *a = &(*annotations)[i];
struct d3d10_effect_variable *a = &annotations->elements[i];
a->effect = effect;
a->buffer = &null_local_buffer;
@ -2029,11 +2028,11 @@ static HRESULT parse_fx10_pass(const char *data, size_t data_size,
read_dword(ptr, &object_count);
TRACE("Pass has %u effect objects.\n", object_count);
read_dword(ptr, &p->annotation_count);
TRACE("Pass has %u annotations.\n", p->annotation_count);
read_dword(ptr, &p->annotations.count);
TRACE("Pass has %u annotations.\n", p->annotations.count);
if (FAILED(hr = parse_fx10_annotations(data, data_size, ptr, p->technique->effect,
p->annotation_count, &p->annotations)))
&p->annotations)))
{
ERR("Failed to parse pass annotations, hr %#x.\n", hr);
return hr;
@ -2072,11 +2071,11 @@ static HRESULT parse_fx10_technique(const char *data, size_t data_size,
read_dword(ptr, &t->pass_count);
TRACE("Technique has %u passes\n", t->pass_count);
read_dword(ptr, &t->annotation_count);
TRACE("Technique has %u annotations.\n", t->annotation_count);
read_dword(ptr, &t->annotations.count);
TRACE("Technique has %u annotations.\n", t->annotations.count);
if (FAILED(hr = parse_fx10_annotations(data, data_size, ptr, t->effect,
t->annotation_count, &t->annotations)))
&t->annotations)))
{
ERR("Failed to parse technique annotations, hr %#x.\n", hr);
return hr;
@ -2136,11 +2135,11 @@ static HRESULT parse_fx10_numeric_variable(const char *data, size_t data_size,
if (default_value_offset)
FIXME("Set default variable value.\n");
read_dword(ptr, &v->annotation_count);
TRACE("Variable has %u annotations.\n", v->annotation_count);
read_dword(ptr, &v->annotations.count);
TRACE("Variable has %u annotations.\n", v->annotations.count);
if (FAILED(hr = parse_fx10_annotations(data, data_size, ptr, v->effect,
v->annotation_count, &v->annotations)))
&v->annotations)))
{
ERR("Failed to parse variable annotations, hr %#x.\n", hr);
return hr;
@ -2347,11 +2346,11 @@ static HRESULT parse_fx10_object_variable(const char *data, size_t data_size,
return E_FAIL;
}
read_dword(ptr, &v->annotation_count);
TRACE("Variable has %u annotations.\n", v->annotation_count);
read_dword(ptr, &v->annotations.count);
TRACE("Variable has %u annotations.\n", v->annotations.count);
if (FAILED(hr = parse_fx10_annotations(data, data_size, ptr, v->effect,
v->annotation_count, &v->annotations)))
&v->annotations)))
{
ERR("Failed to parse variable annotations, hr %#x.\n", hr);
return hr;
@ -2481,11 +2480,11 @@ static HRESULT parse_fx10_buffer(const char *data, size_t data_size, const char
if (local)
{
read_dword(ptr, &l->annotation_count);
TRACE("Local buffer has %u annotations.\n", l->annotation_count);
read_dword(ptr, &l->annotations.count);
TRACE("Local buffer has %u annotations.\n", l->annotations.count);
if (FAILED(hr = parse_fx10_annotations(data, data_size, ptr, l->effect,
l->annotation_count, &l->annotations)))
&l->annotations)))
{
ERR("Failed to parse buffer annotations, hr %#x.\n", hr);
return hr;
@ -2947,6 +2946,19 @@ static void d3d10_effect_shader_variable_destroy(struct d3d10_effect_shader_vari
heap_free(s->resources);
}
static void d3d10_effect_annotations_destroy(struct d3d10_effect_annotations *a)
{
unsigned int i;
if (!a->elements) return;
for (i = 0; i < a->count; ++i)
d3d10_effect_variable_destroy(&a->elements[i]);
heap_free(a->elements);
a->elements = NULL;
a->count = 0;
}
static void d3d10_effect_variable_destroy(struct d3d10_effect_variable *v)
{
unsigned int i, elem_count;
@ -2955,14 +2967,7 @@ static void d3d10_effect_variable_destroy(struct d3d10_effect_variable *v)
heap_free(v->name);
heap_free(v->semantic);
if (v->annotations)
{
for (i = 0; i < v->annotation_count; ++i)
{
d3d10_effect_variable_destroy(&v->annotations[i]);
}
heap_free(v->annotations);
}
d3d10_effect_annotations_destroy(&v->annotations);
if (v->members)
{
@ -3037,20 +3042,10 @@ static void d3d10_effect_variable_destroy(struct d3d10_effect_variable *v)
static void d3d10_effect_pass_destroy(struct d3d10_effect_pass *p)
{
unsigned int i;
TRACE("pass %p\n", p);
heap_free(p->name);
if (p->annotations)
{
for (i = 0; i < p->annotation_count; ++i)
{
d3d10_effect_variable_destroy(&p->annotations[i]);
}
heap_free(p->annotations);
}
d3d10_effect_annotations_destroy(&p->annotations);
}
static void d3d10_effect_technique_destroy(struct d3d10_effect_technique *t)
@ -3069,14 +3064,7 @@ static void d3d10_effect_technique_destroy(struct d3d10_effect_technique *t)
heap_free(t->passes);
}
if (t->annotations)
{
for (i = 0; i < t->annotation_count; ++i)
{
d3d10_effect_variable_destroy(&t->annotations[i]);
}
heap_free(t->annotations);
}
d3d10_effect_annotations_destroy(&t->annotations);
}
static void d3d10_effect_local_buffer_destroy(struct d3d10_effect_variable *l)
@ -3098,15 +3086,7 @@ static void d3d10_effect_local_buffer_destroy(struct d3d10_effect_variable *l)
if (l->type)
d3d10_effect_type_destroy(&l->type->entry, NULL);
if (l->annotations)
{
for (i = 0; i < l->annotation_count; ++i)
{
d3d10_effect_variable_destroy(&l->annotations[i]);
}
heap_free(l->annotations);
}
d3d10_effect_annotations_destroy(&l->annotations);
heap_free(l->u.buffer.local_buffer);
if (l->u.buffer.buffer)
@ -3596,71 +3576,85 @@ static BOOL STDMETHODCALLTYPE d3d10_effect_technique_IsValid(ID3D10EffectTechniq
static HRESULT STDMETHODCALLTYPE d3d10_effect_technique_GetDesc(ID3D10EffectTechnique *iface,
D3D10_TECHNIQUE_DESC *desc)
{
struct d3d10_effect_technique *This = impl_from_ID3D10EffectTechnique(iface);
struct d3d10_effect_technique *tech = impl_from_ID3D10EffectTechnique(iface);
TRACE("iface %p, desc %p\n", iface, desc);
if(This == &null_technique)
if (tech == &null_technique)
{
WARN("Null technique specified\n");
return E_FAIL;
}
if(!desc)
if (!desc)
{
WARN("Invalid argument specified\n");
return E_INVALIDARG;
}
desc->Name = This->name;
desc->Passes = This->pass_count;
desc->Annotations = This->annotation_count;
desc->Name = tech->name;
desc->Passes = tech->pass_count;
desc->Annotations = tech->annotations.count;
return S_OK;
}
static struct ID3D10EffectVariable * STDMETHODCALLTYPE d3d10_effect_technique_GetAnnotationByIndex(
ID3D10EffectTechnique *iface, UINT index)
static ID3D10EffectVariable * d3d10_annotation_get_by_index(const struct d3d10_effect_annotations *annotations,
unsigned int index)
{
struct d3d10_effect_technique *This = impl_from_ID3D10EffectTechnique(iface);
struct d3d10_effect_variable *a;
TRACE("iface %p, index %u\n", iface, index);
if (index >= This->annotation_count)
if (index >= annotations->count)
{
WARN("Invalid index specified\n");
return &null_variable.ID3D10EffectVariable_iface;
}
a = &This->annotations[index];
a = &annotations->elements[index];
TRACE("Returning annotation %p, %s\n", a, debugstr_a(a->name));
TRACE("Returning annotation %p, name %s.\n", a, debugstr_a(a->name));
return &a->ID3D10EffectVariable_iface;
}
static ID3D10EffectVariable * d3d10_annotation_get_by_name(const struct d3d10_effect_annotations *annotations,
const char *name)
{
unsigned int i;
for (i = 0; i < annotations->count; ++i)
{
struct d3d10_effect_variable *a = &annotations->elements[i];
if (a->name && !strcmp(a->name, name))
{
TRACE("Returning annotation %p.\n", a);
return &a->ID3D10EffectVariable_iface;
}
}
WARN("Invalid name specified.\n");
return &null_variable.ID3D10EffectVariable_iface;
}
static struct ID3D10EffectVariable * STDMETHODCALLTYPE d3d10_effect_technique_GetAnnotationByIndex(
ID3D10EffectTechnique *iface, UINT index)
{
struct d3d10_effect_technique *tech = impl_from_ID3D10EffectTechnique(iface);
TRACE("iface %p, index %u\n", iface, index);
return d3d10_annotation_get_by_index(&tech->annotations, index);
}
static struct ID3D10EffectVariable * STDMETHODCALLTYPE d3d10_effect_technique_GetAnnotationByName(
ID3D10EffectTechnique *iface, const char *name)
{
struct d3d10_effect_technique *This = impl_from_ID3D10EffectTechnique(iface);
unsigned int i;
struct d3d10_effect_technique *tech = impl_from_ID3D10EffectTechnique(iface);
TRACE("iface %p, name %s.\n", iface, debugstr_a(name));
for (i = 0; i < This->annotation_count; ++i)
{
struct d3d10_effect_variable *a = &This->annotations[i];
if (a->name && !strcmp(a->name, name))
{
TRACE("Returning annotation %p\n", a);
return &a->ID3D10EffectVariable_iface;
}
}
WARN("Invalid name specified\n");
return &null_variable.ID3D10EffectVariable_iface;
return d3d10_annotation_get_by_name(&tech->annotations, name);
}
static struct ID3D10EffectPass * STDMETHODCALLTYPE d3d10_effect_technique_GetPassByIndex(ID3D10EffectTechnique *iface,
@ -3768,7 +3762,7 @@ static HRESULT STDMETHODCALLTYPE d3d10_effect_pass_GetDesc(ID3D10EffectPass *ifa
s = &pass->vs.shader->u.shader;
desc->Name = pass->name;
desc->Annotations = pass->annotation_count;
desc->Annotations = pass->annotations.count;
if (s->input_signature)
{
desc->pIAInputSignature = ID3D10Blob_GetBufferPointer(s->input_signature);
@ -3864,45 +3858,21 @@ static HRESULT STDMETHODCALLTYPE d3d10_effect_pass_GetPixelShaderDesc(ID3D10Effe
static struct ID3D10EffectVariable * STDMETHODCALLTYPE d3d10_effect_pass_GetAnnotationByIndex(ID3D10EffectPass *iface,
UINT index)
{
struct d3d10_effect_pass *This = impl_from_ID3D10EffectPass(iface);
struct d3d10_effect_variable *a;
struct d3d10_effect_pass *pass = impl_from_ID3D10EffectPass(iface);
TRACE("iface %p, index %u\n", iface, index);
if (index >= This->annotation_count)
{
WARN("Invalid index specified\n");
return &null_variable.ID3D10EffectVariable_iface;
}
a = &This->annotations[index];
TRACE("Returning annotation %p, %s\n", a, debugstr_a(a->name));
return &a->ID3D10EffectVariable_iface;
return d3d10_annotation_get_by_index(&pass->annotations, index);
}
static struct ID3D10EffectVariable * STDMETHODCALLTYPE d3d10_effect_pass_GetAnnotationByName(ID3D10EffectPass *iface,
const char *name)
{
struct d3d10_effect_pass *This = impl_from_ID3D10EffectPass(iface);
unsigned int i;
struct d3d10_effect_pass *pass = impl_from_ID3D10EffectPass(iface);
TRACE("iface %p, name %s.\n", iface, debugstr_a(name));
for (i = 0; i < This->annotation_count; ++i)
{
struct d3d10_effect_variable *a = &This->annotations[i];
if (a->name && !strcmp(a->name, name))
{
TRACE("Returning annotation %p\n", a);
return &a->ID3D10EffectVariable_iface;
}
}
WARN("Invalid name specified\n");
return &null_variable.ID3D10EffectVariable_iface;
return d3d10_annotation_get_by_name(&pass->annotations, name);
}
static void update_buffer(ID3D10Device *device, struct d3d10_effect_variable *v)
@ -4169,7 +4139,7 @@ static HRESULT STDMETHODCALLTYPE d3d10_effect_variable_GetDesc(ID3D10EffectVaria
desc->Name = v->name;
desc->Semantic = v->semantic;
desc->Flags = v->flag;
desc->Annotations = v->annotation_count;
desc->Annotations = v->annotations.count;
desc->BufferOffset = v->buffer_offset;
if (v->flag & D3D10_EFFECT_VARIABLE_EXPLICIT_BIND_POINT)
@ -4181,45 +4151,21 @@ static HRESULT STDMETHODCALLTYPE d3d10_effect_variable_GetDesc(ID3D10EffectVaria
static struct ID3D10EffectVariable * STDMETHODCALLTYPE d3d10_effect_variable_GetAnnotationByIndex(
ID3D10EffectVariable *iface, UINT index)
{
struct d3d10_effect_variable *This = impl_from_ID3D10EffectVariable(iface);
struct d3d10_effect_variable *a;
struct d3d10_effect_variable *var = impl_from_ID3D10EffectVariable(iface);
TRACE("iface %p, index %u\n", iface, index);
if (index >= This->annotation_count)
{
WARN("Invalid index specified\n");
return &null_variable.ID3D10EffectVariable_iface;
}
a = &This->annotations[index];
TRACE("Returning annotation %p, %s\n", a, debugstr_a(a->name));
return &a->ID3D10EffectVariable_iface;
return d3d10_annotation_get_by_index(&var->annotations, index);
}
static struct ID3D10EffectVariable * STDMETHODCALLTYPE d3d10_effect_variable_GetAnnotationByName(
ID3D10EffectVariable *iface, const char *name)
{
struct d3d10_effect_variable *This = impl_from_ID3D10EffectVariable(iface);
unsigned int i;
struct d3d10_effect_variable *var = impl_from_ID3D10EffectVariable(iface);
TRACE("iface %p, name %s.\n", iface, debugstr_a(name));
for (i = 0; i < This->annotation_count; ++i)
{
struct d3d10_effect_variable *a = &This->annotations[i];
if (a->name && !strcmp(a->name, name))
{
TRACE("Returning annotation %p\n", a);
return &a->ID3D10EffectVariable_iface;
}
}
WARN("Invalid name specified\n");
return &null_variable.ID3D10EffectVariable_iface;
return d3d10_annotation_get_by_name(&var->annotations, name);
}
static struct ID3D10EffectVariable * STDMETHODCALLTYPE d3d10_effect_variable_GetMemberByIndex(