[v2 4/6] d3dx9: Precompute and store a constant direct copy flag.
Paul Gofman
gofmanp at gmail.com
Tue May 30 04:38:30 CDT 2017
Signed-off-by: Paul Gofman <gofmanp at gmail.com>
---
v2:
- renamed patch.
---
dlls/d3dx9_36/d3dx9_private.h | 1 +
dlls/d3dx9_36/preshader.c | 24 +++++++++++++++++-------
2 files changed, 18 insertions(+), 7 deletions(-)
diff --git a/dlls/d3dx9_36/d3dx9_private.h b/dlls/d3dx9_36/d3dx9_private.h
index 62213ac..ccb8e8a 100644
--- a/dlls/d3dx9_36/d3dx9_private.h
+++ b/dlls/d3dx9_36/d3dx9_private.h
@@ -154,6 +154,7 @@ struct d3dx_const_param_eval_output
enum D3DXPARAMETER_CLASS constant_class;
unsigned int register_index;
unsigned int register_count;
+ BOOL direct_copy;
};
struct d3dx_const_tab
diff --git a/dlls/d3dx9_36/preshader.c b/dlls/d3dx9_36/preshader.c
index e2bd26b..5974329 100644
--- a/dlls/d3dx9_36/preshader.c
+++ b/dlls/d3dx9_36/preshader.c
@@ -1050,17 +1050,14 @@ static void set_constants(struct d3dx_regstore *rs, struct d3dx_const_tab *const
if (!is_param_dirty(param, const_tab->update_version))
continue;
- get_const_upload_info(const_set, &info);
start_offset = get_offset_reg(table, const_set->register_index);
-
- if (table_type_from_param_type(param->type) == table_type
- && !info.transpose && info.minor == info.major_stride
- && info.count == get_offset_reg(table, const_set->register_count)
- && info.count * sizeof(unsigned int) <= param->bytes)
+ if (const_set->direct_copy)
{
- regstore_set_values(rs, table, param->data, start_offset, info.count);
+ regstore_set_values(rs, table, param->data, start_offset,
+ get_offset_reg(table, const_set->register_count));
continue;
}
+ get_const_upload_info(const_set, &info);
for (i = 0; i < info.major_count; ++i)
{
@@ -1149,6 +1146,8 @@ static HRESULT init_set_constants_param(struct d3dx_const_tab *const_tab, ID3DXC
unsigned int const_count, param_count, i;
BOOL get_element;
struct d3dx_const_param_eval_output const_set;
+ struct const_upload_info info;
+ enum pres_value_type table_type;
HRESULT hr;
if (FAILED(get_ctab_constant_desc(ctab, hc, &desc)))
@@ -1225,6 +1224,17 @@ static HRESULT init_set_constants_param(struct d3dx_const_tab *const_tab, ID3DXC
return D3DERR_INVALIDCALL;
}
const_set.register_count = desc.RegisterCount;
+ table_type = table_info[const_set.table].type;
+ get_const_upload_info(&const_set, &info);
+
+ if (table_type_from_param_type(param->type) == PRES_VT_COUNT)
+ return D3DERR_INVALIDCALL;
+
+ const_set.direct_copy = table_type_from_param_type(param->type) == table_type
+ && !info.transpose && info.minor == info.major_stride
+ && info.count == get_offset_reg(const_set.table, const_set.register_count)
+ && info.count * sizeof(unsigned int) <= param->bytes;
+
if (FAILED(hr = append_const_set(const_tab, &const_set)))
return hr;
--
2.9.4
More information about the wine-patches
mailing list