d3d10: Implement ID3D10EffectVariable::GetElement().

This commit is contained in:
Rico Schüller 2009-10-21 22:59:46 +02:00 committed by Alexandre Julliard
parent 12cb58c426
commit 8e2e7eb1e9
2 changed files with 170 additions and 36 deletions

View File

@ -84,6 +84,7 @@ struct d3d10_effect_type
DWORD row_count;
D3D10_SHADER_VARIABLE_TYPE basetype;
D3D10_SHADER_VARIABLE_CLASS type_class;
struct d3d10_effect_type *elementtype;
struct d3d10_effect_type_member *members;
};
@ -110,6 +111,7 @@ struct d3d10_effect_variable
DWORD flag;
DWORD data_size;
struct d3d10_effect_type *type;
struct d3d10_effect_variable *elements;
struct d3d10_effect_variable *members;
struct d3d10_effect_variable *annotations;
};

View File

@ -58,21 +58,21 @@ static struct d3d10_effect_technique null_technique =
static struct d3d10_effect_pass null_pass =
{&d3d10_effect_pass_vtbl, NULL, NULL, 0, 0, 0, NULL, NULL};
static struct d3d10_effect_type null_type =
{&d3d10_effect_type_vtbl, 0, {NULL, NULL, 0}, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL};
{&d3d10_effect_type_vtbl, 0, {NULL, NULL, 0}, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL};
static struct d3d10_effect_variable null_local_buffer =
{(ID3D10EffectVariableVtbl *)&d3d10_effect_constant_buffer_vtbl,
NULL, NULL, NULL, NULL, 0, 0, 0, 0, &null_type, NULL, NULL};
NULL, NULL, NULL, NULL, 0, 0, 0, 0, &null_type, NULL, NULL, NULL};
static struct d3d10_effect_variable null_variable =
{&d3d10_effect_variable_vtbl, NULL, NULL, NULL, NULL, 0, 0, 0, 0, &null_type, NULL, NULL};
{&d3d10_effect_variable_vtbl, NULL, NULL, NULL, NULL, 0, 0, 0, 0, &null_type, NULL, NULL, NULL};
static struct d3d10_effect_variable null_scalar_variable =
{(ID3D10EffectVariableVtbl *)&d3d10_effect_scalar_variable_vtbl,
NULL, NULL, NULL, NULL, 0, 0, 0, 0, &null_type, NULL, NULL};
NULL, NULL, NULL, NULL, 0, 0, 0, 0, &null_type, NULL, NULL, NULL};
static struct d3d10_effect_variable null_vector_variable =
{(ID3D10EffectVariableVtbl *)&d3d10_effect_vector_variable_vtbl,
NULL, NULL, NULL, NULL, 0, 0, 0, 0, &null_type, NULL, NULL};
NULL, NULL, NULL, NULL, 0, 0, 0, 0, &null_type, NULL, NULL, NULL};
static struct d3d10_effect_variable null_matrix_variable =
{(ID3D10EffectVariableVtbl *)&d3d10_effect_matrix_variable_vtbl,
NULL, NULL, NULL, NULL, 0, 0, 0, 0, &null_type, NULL, NULL};
NULL, NULL, NULL, NULL, 0, 0, 0, 0, &null_type, NULL, NULL, NULL};
static struct d3d10_effect_type *get_fx10_type(struct d3d10_effect *effect, const char *data, DWORD offset);
@ -422,6 +422,63 @@ static HRESULT parse_fx10_type(struct d3d10_effect_type *t, const char *ptr, con
}
}
if (t->element_count)
{
TRACE("Elementtype for type at offset: %#x\n", t->id);
/* allocate elementtype - we need only one, because all elements have the same type */
t->elementtype = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*t->elementtype));
if (!t->elementtype)
{
ERR("Failed to allocate members memory.\n");
return E_OUTOFMEMORY;
}
/* create a copy of the original type with some minor changes */
t->elementtype->vtbl = &d3d10_effect_type_vtbl;
t->elementtype->effect = t->effect;
if (!copy_name(t->name, &t->elementtype->name))
{
ERR("Failed to copy name.\n");
return E_OUTOFMEMORY;
}
TRACE("\tType name: %s.\n", debugstr_a(t->elementtype->name));
t->elementtype->element_count = 0;
TRACE("\tElement count: %u.\n", t->elementtype->element_count);
/*
* Not sure if this calculation is 100% correct, but a test
* show's that these values work.
*/
t->elementtype->size_unpacked = t->size_packed / t->element_count;
TRACE("\tUnpacked size: %#x.\n", t->elementtype->size_unpacked);
t->elementtype->stride = t->stride;
TRACE("\tStride: %#x.\n", t->elementtype->stride);
t->elementtype->size_packed = t->size_packed / t->element_count;
TRACE("\tPacked size: %#x.\n", t->elementtype->size_packed);
t->elementtype->member_count = t->member_count;
TRACE("\tMember count: %u.\n", t->elementtype->member_count);
t->elementtype->column_count = t->column_count;
TRACE("\tColumns: %u.\n", t->elementtype->column_count);
t->elementtype->row_count = t->row_count;
TRACE("\tRows: %u.\n", t->elementtype->row_count);
t->elementtype->basetype = t->basetype;
TRACE("\tBasetype: %s.\n", debug_d3d10_shader_variable_type(t->elementtype->basetype));
t->elementtype->type_class = t->type_class;
TRACE("\tClass: %s.\n", debug_d3d10_shader_variable_class(t->elementtype->type_class));
t->elementtype->members = t->members;
}
return S_OK;
}
@ -497,9 +554,10 @@ static void set_variable_vtbl(struct d3d10_effect_variable *v)
static HRESULT copy_variableinfo_from_type(struct d3d10_effect_variable *v)
{
unsigned int i;
HRESULT hr;
if (v->type->member_count == 0) return S_OK;
if (v->type->member_count)
{
v->members = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, v->type->member_count * sizeof(*v->members));
if (!v->members)
{
@ -511,9 +569,8 @@ static HRESULT copy_variableinfo_from_type(struct d3d10_effect_variable *v)
{
struct d3d10_effect_variable *var = &v->members[i];
struct d3d10_effect_type_member *typem = &v->type->members[i];
HRESULT hr;
var->buffer = v;
var->buffer = v->buffer;
var->effect = v->effect;
var->type = typem->type;
set_variable_vtbl(var);
@ -532,12 +589,59 @@ static HRESULT copy_variableinfo_from_type(struct d3d10_effect_variable *v)
}
TRACE("Variable semantic: %s.\n", debugstr_a(var->semantic));
var->buffer_offset = typem->buffer_offset;
var->buffer_offset = v->buffer_offset + typem->buffer_offset;
TRACE("Variable buffer offset: %u.\n", var->buffer_offset);
hr = copy_variableinfo_from_type(var);
if (FAILED(hr)) return hr;
}
}
if (v->type->element_count)
{
unsigned int bufferoffset = v->buffer_offset;
v->elements = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, v->type->element_count * sizeof(*v->elements));
if (!v->elements)
{
ERR("Failed to allocate elements memory.\n");
return E_OUTOFMEMORY;
}
for (i = 0; i < v->type->element_count; ++i)
{
struct d3d10_effect_variable *var = &v->elements[i];
var->buffer = v->buffer;
var->effect = v->effect;
var->type = v->type->elementtype;
set_variable_vtbl(var);
if (!copy_name(v->name, &var->name))
{
ERR("Failed to copy name.\n");
return E_OUTOFMEMORY;
}
TRACE("Variable name: %s.\n", debugstr_a(var->name));
if (!copy_name(v->semantic, &var->semantic))
{
ERR("Failed to copy name.\n");
return E_OUTOFMEMORY;
}
TRACE("Variable semantic: %s.\n", debugstr_a(var->semantic));
if (i != 0)
{
bufferoffset += v->type->stride;
}
var->buffer_offset = bufferoffset;
TRACE("Variable buffer offset: %u.\n", var->buffer_offset);
hr = copy_variableinfo_from_type(var);
if (FAILED(hr)) return hr;
}
}
return S_OK;
}
@ -980,6 +1084,12 @@ static void d3d10_effect_type_destroy(struct wine_rb_entry *entry, void *context
TRACE("effect type %p.\n", t);
if (t->elementtype)
{
HeapFree(GetProcessHeap(), 0, t->elementtype->name);
HeapFree(GetProcessHeap(), 0, t->elementtype);
}
if (t->members)
{
unsigned int i;
@ -1213,6 +1323,15 @@ static void d3d10_effect_variable_destroy(struct d3d10_effect_variable *v)
}
HeapFree(GetProcessHeap(), 0, v->members);
}
if (v->elements)
{
for (i = 0; i < v->type->element_count; ++i)
{
d3d10_effect_variable_destroy(&v->elements[i]);
}
HeapFree(GetProcessHeap(), 0, v->elements);
}
}
static void d3d10_effect_pass_destroy(struct d3d10_effect_pass *p)
@ -2066,9 +2185,22 @@ static struct ID3D10EffectVariable * STDMETHODCALLTYPE d3d10_effect_variable_Get
static struct ID3D10EffectVariable * STDMETHODCALLTYPE d3d10_effect_variable_GetElement(
ID3D10EffectVariable *iface, UINT index)
{
FIXME("iface %p, index %u stub!\n", iface, index);
struct d3d10_effect_variable *This = (struct d3d10_effect_variable *)iface;
struct d3d10_effect_variable *v;
return NULL;
TRACE("iface %p, index %u\n", iface, index);
if (index >= This->type->element_count)
{
WARN("Invalid index specified\n");
return (ID3D10EffectVariable *)&null_variable;
}
v = &This->elements[index];
TRACE("Returning element %p, %s\n", v, debugstr_a(v->name));
return (ID3D10EffectVariable *)v;
}
static struct ID3D10EffectConstantBuffer * STDMETHODCALLTYPE d3d10_effect_variable_GetParentConstantBuffer(