Commit 95a49bdc authored by Paul Gofman's avatar Paul Gofman Committed by Alexandre Julliard

d3dx9: Add scalar and vector setting path to set_constants().

parent f48d38e5
...@@ -372,11 +372,14 @@ static void regstore_set_modified(struct d3dx_regstore *rs, unsigned int table, ...@@ -372,11 +372,14 @@ static void regstore_set_modified(struct d3dx_regstore *rs, unsigned int table,
static void regstore_set_values(struct d3dx_regstore *rs, unsigned int table, const void *data, static void regstore_set_values(struct d3dx_regstore *rs, unsigned int table, const void *data,
unsigned int start_offset, unsigned int count) unsigned int start_offset, unsigned int count)
{ {
void *out;
if (!count) if (!count)
return; return;
memcpy((BYTE *)rs->tables[table] + start_offset * table_info[table].component_size, out = (BYTE *)rs->tables[table] + start_offset * table_info[table].component_size;
data, count * table_info[table].component_size); assert(data != out);
memcpy(out, data, count * table_info[table].component_size);
regstore_set_modified(rs, table, start_offset, count); regstore_set_modified(rs, table, start_offset, count);
} }
...@@ -1101,6 +1104,12 @@ static void regstore_set_data(struct d3dx_regstore *rs, unsigned int table, ...@@ -1101,6 +1104,12 @@ static void regstore_set_data(struct d3dx_regstore *rs, unsigned int table,
}; };
enum pres_value_type table_type = table_info[table].type; enum pres_value_type table_type = table_info[table].type;
if (param_type == table_type)
{
regstore_set_values(rs, table, in, offset, count);
return;
}
set_const_funcs[param_type][table_type]((unsigned int *)rs->tables[table] + offset, in, count); set_const_funcs[param_type][table_type]((unsigned int *)rs->tables[table] + offset, in, count);
regstore_set_modified(rs, table, offset, count); regstore_set_modified(rs, table, offset, count);
} }
...@@ -1132,6 +1141,23 @@ static void set_constants(struct d3dx_regstore *rs, struct d3dx_const_tab *const ...@@ -1132,6 +1141,23 @@ static void set_constants(struct d3dx_regstore *rs, struct d3dx_const_tab *const
continue; continue;
} }
param_type = table_type_from_param_type(param->type); param_type = table_type_from_param_type(param->type);
if (const_set->constant_class == D3DXPC_SCALAR || const_set->constant_class == D3DXPC_VECTOR)
{
unsigned int count = max(param->rows, param->columns);
if (count >= get_reg_components(table))
{
regstore_set_data(rs, table, start_offset, data,
count * const_set->element_count, param_type);
}
else
{
for (element = 0; element < const_set->element_count; ++element)
regstore_set_data(rs, table, start_offset + get_offset_reg(table, element),
&data[element * count], count, param_type);
}
continue;
}
get_const_upload_info(const_set, &info); get_const_upload_info(const_set, &info);
for (element = 0; element < const_set->element_count; ++element) for (element = 0; element < const_set->element_count; ++element)
{ {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment