d3dx9: Merge constant setting for child parameters when possible.
Signed-off-by: Paul Gofman <gofmanp@gmail.com> Signed-off-by: Matteo Bruni <mbruni@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
4c7653ef5d
commit
730832d2d8
|
@ -155,6 +155,7 @@ struct d3dx_const_param_eval_output
|
||||||
unsigned int register_index;
|
unsigned int register_index;
|
||||||
unsigned int register_count;
|
unsigned int register_count;
|
||||||
BOOL direct_copy;
|
BOOL direct_copy;
|
||||||
|
unsigned int element_count;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct d3dx_const_tab
|
struct d3dx_const_tab
|
||||||
|
|
|
@ -1043,9 +1043,10 @@ static void set_constants(struct d3dx_regstore *rs, struct d3dx_const_tab *const
|
||||||
unsigned int table = const_set->table;
|
unsigned int table = const_set->table;
|
||||||
struct d3dx_parameter *param = const_set->param;
|
struct d3dx_parameter *param = const_set->param;
|
||||||
enum pres_value_type table_type = table_info[table].type;
|
enum pres_value_type table_type = table_info[table].type;
|
||||||
unsigned int i, j, start_offset;
|
unsigned int element, i, j, start_offset;
|
||||||
unsigned int param_offset;
|
unsigned int param_offset;
|
||||||
struct const_upload_info info;
|
struct const_upload_info info;
|
||||||
|
unsigned int *data = param->data;
|
||||||
|
|
||||||
if (!is_param_dirty(param, const_tab->update_version))
|
if (!is_param_dirty(param, const_tab->update_version))
|
||||||
continue;
|
continue;
|
||||||
|
@ -1053,50 +1054,55 @@ static void set_constants(struct d3dx_regstore *rs, struct d3dx_const_tab *const
|
||||||
start_offset = get_offset_reg(table, const_set->register_index);
|
start_offset = get_offset_reg(table, const_set->register_index);
|
||||||
if (const_set->direct_copy)
|
if (const_set->direct_copy)
|
||||||
{
|
{
|
||||||
regstore_set_values(rs, table, param->data, start_offset,
|
regstore_set_values(rs, table, data, start_offset,
|
||||||
get_offset_reg(table, const_set->register_count));
|
get_offset_reg(table, const_set->register_count));
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
get_const_upload_info(const_set, &info);
|
get_const_upload_info(const_set, &info);
|
||||||
|
|
||||||
for (i = 0; i < info.major_count; ++i)
|
for (element = 0; element < const_set->element_count; ++element)
|
||||||
{
|
{
|
||||||
for (j = 0; j < info.minor; ++j)
|
for (i = 0; i < info.major_count; ++i)
|
||||||
{
|
{
|
||||||
unsigned int out;
|
for (j = 0; j < info.minor; ++j)
|
||||||
unsigned int *in;
|
{
|
||||||
unsigned int offset;
|
unsigned int out;
|
||||||
|
unsigned int *in;
|
||||||
|
unsigned int offset;
|
||||||
|
|
||||||
offset = start_offset + i * info.major_stride + j;
|
offset = start_offset + i * info.major_stride + j;
|
||||||
if (get_reg_offset(table, offset) >= rs->table_sizes[table])
|
if (get_reg_offset(table, offset) >= rs->table_sizes[table])
|
||||||
{
|
{
|
||||||
if (table != PRES_REGTAB_OBCONST)
|
if (table != PRES_REGTAB_OBCONST)
|
||||||
FIXME("Output offset exceeds table size, name %s, component %u.\n",
|
FIXME("Output offset exceeds table size, name %s, component %u.\n",
|
||||||
debugstr_a(param->name), i);
|
debugstr_a(param->name), i);
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (info.transpose)
|
|
||||||
param_offset = i + j * info.major;
|
|
||||||
else
|
|
||||||
param_offset = i * info.minor + j;
|
|
||||||
if (param_offset * sizeof(unsigned int) >= param->bytes)
|
|
||||||
{
|
|
||||||
WARN("Parameter data is too short, name %s, component %u.\n", debugstr_a(param->name), i);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
in = (unsigned int *)param->data + param_offset;
|
|
||||||
switch (table_type)
|
|
||||||
{
|
|
||||||
case PRES_VT_FLOAT: set_number(&out, D3DXPT_FLOAT, in, param->type); break;
|
|
||||||
case PRES_VT_INT: set_number(&out, D3DXPT_INT, in, param->type); break;
|
|
||||||
case PRES_VT_BOOL: set_number(&out, D3DXPT_BOOL, in, param->type); break;
|
|
||||||
default:
|
|
||||||
FIXME("Unexpected type %#x.\n", table_info[table].type);
|
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
|
if (info.transpose)
|
||||||
|
param_offset = i + j * info.major;
|
||||||
|
else
|
||||||
|
param_offset = i * info.minor + j;
|
||||||
|
if (param_offset * sizeof(unsigned int) >= param->bytes)
|
||||||
|
{
|
||||||
|
WARN("Parameter data is too short, name %s, component %u.\n", debugstr_a(param->name), i);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
in = (unsigned int *)data + param_offset;
|
||||||
|
switch (table_type)
|
||||||
|
{
|
||||||
|
case PRES_VT_FLOAT: set_number(&out, D3DXPT_FLOAT, in, param->type); break;
|
||||||
|
case PRES_VT_INT: set_number(&out, D3DXPT_INT, in, param->type); break;
|
||||||
|
case PRES_VT_BOOL: set_number(&out, D3DXPT_BOOL, in, param->type); break;
|
||||||
|
default:
|
||||||
|
FIXME("Unexpected type %#x.\n", table_info[table].type);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
regstore_set_values(rs, table, &out, offset, 1);
|
||||||
}
|
}
|
||||||
regstore_set_values(rs, table, &out, offset, 1);
|
|
||||||
}
|
}
|
||||||
|
start_offset += get_offset_reg(table, const_set->register_count);
|
||||||
|
data += param->rows * param->columns;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
const_tab->update_version = new_update_version;
|
const_tab->update_version = new_update_version;
|
||||||
|
@ -1139,6 +1145,83 @@ static HRESULT append_const_set(struct d3dx_const_tab *const_tab, struct d3dx_co
|
||||||
return D3D_OK;
|
return D3D_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static HRESULT merge_const_set_entries(struct d3dx_const_tab *const_tab,
|
||||||
|
struct d3dx_parameter *param, unsigned int index)
|
||||||
|
{
|
||||||
|
unsigned int i, start_index = index;
|
||||||
|
DWORD *current_data;
|
||||||
|
enum pres_reg_tables current_table;
|
||||||
|
unsigned int current_start_offset, element_count;
|
||||||
|
struct d3dx_const_param_eval_output *first_const;
|
||||||
|
|
||||||
|
if (!const_tab->const_set_count)
|
||||||
|
return D3D_OK;
|
||||||
|
|
||||||
|
while (index < const_tab->const_set_count - 1)
|
||||||
|
{
|
||||||
|
first_const = &const_tab->const_set[index];
|
||||||
|
current_data = first_const->param->data;
|
||||||
|
current_table = first_const->table;
|
||||||
|
current_start_offset = get_offset_reg(current_table, first_const->register_index);
|
||||||
|
element_count = 0;
|
||||||
|
for (i = index; i < const_tab->const_set_count; ++i)
|
||||||
|
{
|
||||||
|
struct d3dx_const_param_eval_output *const_set = &const_tab->const_set[i];
|
||||||
|
unsigned int count = get_offset_reg(const_set->table,
|
||||||
|
const_set->register_count * const_set->element_count);
|
||||||
|
unsigned int start_offset = get_offset_reg(const_set->table, const_set->register_index);
|
||||||
|
|
||||||
|
if (!(const_set->table == current_table && current_start_offset == start_offset
|
||||||
|
&& const_set->direct_copy == first_const->direct_copy
|
||||||
|
&& current_data == const_set->param->data
|
||||||
|
&& (const_set->direct_copy || (first_const->param->type == const_set->param->type
|
||||||
|
&& first_const->param->class == const_set->param->class
|
||||||
|
&& first_const->param->columns == const_set->param->columns
|
||||||
|
&& first_const->param->rows == const_set->param->rows
|
||||||
|
&& first_const->register_count == const_set->register_count
|
||||||
|
&& (i == const_tab->const_set_count - 1
|
||||||
|
|| first_const->param->element_count == const_set->param->element_count)))))
|
||||||
|
break;
|
||||||
|
|
||||||
|
current_start_offset += count;
|
||||||
|
current_data += const_set->direct_copy ? count : const_set->param->rows
|
||||||
|
* const_set->param->columns * const_set->element_count;
|
||||||
|
element_count += const_set->element_count;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i > index + 1)
|
||||||
|
{
|
||||||
|
TRACE("Merging %u child parameters for %s, not merging %u, direct_copy %#x.\n", i - index,
|
||||||
|
debugstr_a(param->name), const_tab->const_set_count - i, first_const->direct_copy);
|
||||||
|
|
||||||
|
first_const->element_count = element_count;
|
||||||
|
if (first_const->direct_copy)
|
||||||
|
{
|
||||||
|
first_const->element_count = 1;
|
||||||
|
if (index == start_index
|
||||||
|
&& !(param->type == D3DXPT_VOID && param->class == D3DXPC_STRUCT))
|
||||||
|
{
|
||||||
|
if (table_type_from_param_type(param->type) == PRES_VT_COUNT)
|
||||||
|
return D3DERR_INVALIDCALL;
|
||||||
|
first_const->param = param;
|
||||||
|
}
|
||||||
|
first_const->register_count = get_reg_offset(current_table, current_start_offset)
|
||||||
|
- first_const->register_index;
|
||||||
|
}
|
||||||
|
memmove(&const_tab->const_set[index + 1], &const_tab->const_set[i],
|
||||||
|
sizeof(*const_tab->const_set) * (const_tab->const_set_count - i));
|
||||||
|
const_tab->const_set_count -= i - index - 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
TRACE("Not merging %u child parameters for %s, direct_copy %#x.\n",
|
||||||
|
const_tab->const_set_count - i, debugstr_a(param->name), first_const->direct_copy);
|
||||||
|
}
|
||||||
|
index = i;
|
||||||
|
}
|
||||||
|
return D3D_OK;
|
||||||
|
}
|
||||||
|
|
||||||
static HRESULT init_set_constants_param(struct d3dx_const_tab *const_tab, ID3DXConstantTable *ctab,
|
static HRESULT init_set_constants_param(struct d3dx_const_tab *const_tab, ID3DXConstantTable *ctab,
|
||||||
D3DXHANDLE hc, struct d3dx_parameter *param)
|
D3DXHANDLE hc, struct d3dx_parameter *param)
|
||||||
{
|
{
|
||||||
|
@ -1178,10 +1261,10 @@ static HRESULT init_set_constants_param(struct d3dx_const_tab *const_tab, ID3DXC
|
||||||
}
|
}
|
||||||
if (const_count)
|
if (const_count)
|
||||||
{
|
{
|
||||||
HRESULT ret;
|
HRESULT ret = D3D_OK;
|
||||||
D3DXHANDLE hc_element;
|
D3DXHANDLE hc_element;
|
||||||
|
unsigned int index = const_tab->const_set_count;
|
||||||
|
|
||||||
ret = D3D_OK;
|
|
||||||
for (i = 0; i < const_count; ++i)
|
for (i = 0; i < const_count; ++i)
|
||||||
{
|
{
|
||||||
if (get_element)
|
if (get_element)
|
||||||
|
@ -1200,7 +1283,9 @@ static HRESULT init_set_constants_param(struct d3dx_const_tab *const_tab, ID3DXC
|
||||||
if (FAILED(hr))
|
if (FAILED(hr))
|
||||||
ret = hr;
|
ret = hr;
|
||||||
}
|
}
|
||||||
return ret;
|
if (FAILED(ret))
|
||||||
|
return ret;
|
||||||
|
return merge_const_set_entries(const_tab, param, index);
|
||||||
}
|
}
|
||||||
|
|
||||||
TRACE("Constant %s, rows %u, columns %u, class %u, bytes %u.\n",
|
TRACE("Constant %s, rows %u, columns %u, class %u, bytes %u.\n",
|
||||||
|
@ -1209,6 +1294,7 @@ static HRESULT init_set_constants_param(struct d3dx_const_tab *const_tab, ID3DXC
|
||||||
debugstr_a(param->name), param->rows, param->columns, param->class,
|
debugstr_a(param->name), param->rows, param->columns, param->class,
|
||||||
param->flags, param->bytes);
|
param->flags, param->bytes);
|
||||||
|
|
||||||
|
const_set.element_count = 1;
|
||||||
const_set.param = param;
|
const_set.param = param;
|
||||||
const_set.constant_class = desc.Class;
|
const_set.constant_class = desc.Class;
|
||||||
if (desc.RegisterSet >= ARRAY_SIZE(shad_regset2table))
|
if (desc.RegisterSet >= ARRAY_SIZE(shad_regset2table))
|
||||||
|
|
Loading…
Reference in New Issue