[v2 1/6] d3dx9: Set dirty flag on parameter change.
Paul Gofman
gofmanp at gmail.com
Tue Mar 14 07:46:56 CDT 2017
Signed-off-by: Paul Gofman <gofmanp at gmail.com>
---
v2:
- moved tests to the end of the patch series;
- removed redundant set_dirty() calls for array members;
- merged changes in d3dx9_base_effect_set_int and d3dx9_base_effect_set_float from the next patch.
---
dlls/d3dx9_36/d3dx9_private.h | 5 ++++
dlls/d3dx9_36/effect.c | 61 +++++++++++++++++++++++++++++++++++++++++--
2 files changed, 64 insertions(+), 2 deletions(-)
diff --git a/dlls/d3dx9_36/d3dx9_private.h b/dlls/d3dx9_36/d3dx9_private.h
index 9d926c7..27b91a7 100644
--- a/dlls/d3dx9_36/d3dx9_private.h
+++ b/dlls/d3dx9_36/d3dx9_private.h
@@ -192,6 +192,8 @@ struct d3dx_param_eval
struct d3dx_const_tab shader_inputs;
};
+#define PARAMETER_FLAG_DIRTY 0x1u
+
struct d3dx_parameter
{
char *name;
@@ -206,6 +208,7 @@ struct d3dx_parameter
UINT member_count;
DWORD flags;
UINT bytes;
+ DWORD runtime_flags;
DWORD object_id;
D3DXHANDLE handle;
@@ -215,6 +218,8 @@ struct d3dx_parameter
struct d3dx_parameter *referenced_param;
struct d3dx_param_eval *param_eval;
+
+ DWORD *dirty_flag_ptr;
};
struct d3dx9_base_effect;
diff --git a/dlls/d3dx9_36/effect.c b/dlls/d3dx9_36/effect.c
index 4c4e415..849e832 100644
--- a/dlls/d3dx9_36/effect.c
+++ b/dlls/d3dx9_36/effect.c
@@ -1316,6 +1316,29 @@ static D3DXHANDLE d3dx9_base_effect_get_annotation_by_name(struct d3dx9_base_eff
return NULL;
}
+static BOOL walk_parameter_tree(struct d3dx_parameter *param, walk_parameter_dep_func param_func,
+ void *data)
+{
+ unsigned int i;
+ unsigned int member_count;
+
+ if (param_func(data, param))
+ return TRUE;
+
+ member_count = param->element_count ? param->element_count : param->member_count;
+ for (i = 0; i < member_count; ++i)
+ {
+ if (walk_parameter_tree(¶m->members[i], param_func, data))
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static void set_dirty(struct d3dx_parameter *param)
+{
+ *param->dirty_flag_ptr |= PARAMETER_FLAG_DIRTY;
+}
+
static HRESULT d3dx9_base_effect_set_value(struct d3dx9_base_effect *base,
D3DXHANDLE parameter, const void *data, UINT bytes)
{
@@ -1364,6 +1387,7 @@ static HRESULT d3dx9_base_effect_set_value(struct d3dx9_base_effect *base,
case D3DXPT_FLOAT:
TRACE("Copy %u bytes\n", param->bytes);
memcpy(param->data, data, param->bytes);
+ set_dirty(param);
break;
default:
@@ -1450,6 +1474,7 @@ static HRESULT d3dx9_base_effect_set_bool(struct d3dx9_base_effect *base, D3DXHA
if (param && !param->element_count && param->rows == 1 && param->columns == 1)
{
set_number(param->data, param->type, &b, D3DXPT_BOOL);
+ set_dirty(param);
return D3D_OK;
}
@@ -1495,6 +1520,7 @@ static HRESULT d3dx9_base_effect_set_bool_array(struct d3dx9_base_effect *base,
/* don't crop the input, use D3DXPT_INT instead of D3DXPT_BOOL */
set_number((DWORD *)param->data + i, param->type, &b[i], D3DXPT_INT);
}
+ set_dirty(param);
return D3D_OK;
case D3DXPC_OBJECT:
@@ -1544,7 +1570,12 @@ static HRESULT d3dx9_base_effect_set_int(struct d3dx9_base_effect *base, D3DXHAN
{
if (param->rows == 1 && param->columns == 1)
{
- set_number(param->data, param->type, &n, D3DXPT_INT);
+ DWORD value;
+
+ set_number(&value, param->type, &n, D3DXPT_INT);
+ if (value != *(DWORD *)param->data)
+ set_dirty(param);
+ *(DWORD *)param->data = value;
return D3D_OK;
}
@@ -1564,6 +1595,7 @@ static HRESULT d3dx9_base_effect_set_int(struct d3dx9_base_effect *base, D3DXHAN
{
((FLOAT *)param->data)[3] = ((n & 0xff000000) >> 24) * INT_FLOAT_MULTI_INVERSE;
}
+ set_dirty(param);
return D3D_OK;
}
}
@@ -1631,6 +1663,7 @@ static HRESULT d3dx9_base_effect_set_int_array(struct d3dx9_base_effect *base,
{
set_number((DWORD *)param->data + i, param->type, &n[i], D3DXPT_INT);
}
+ set_dirty(param);
return D3D_OK;
case D3DXPC_OBJECT:
@@ -1678,7 +1711,12 @@ static HRESULT d3dx9_base_effect_set_float(struct d3dx9_base_effect *base, D3DXH
if (param && !param->element_count && param->rows == 1 && param->columns == 1)
{
- set_number((DWORD *)param->data, param->type, &f, D3DXPT_FLOAT);
+ DWORD value;
+
+ set_number(&value, param->type, &f, D3DXPT_FLOAT);
+ if (value != *(DWORD *)param->data)
+ set_dirty(param);
+ *(DWORD *)param->data = value;
return D3D_OK;
}
@@ -1723,6 +1761,7 @@ static HRESULT d3dx9_base_effect_set_float_array(struct d3dx9_base_effect *base,
{
set_number((DWORD *)param->data + i, param->type, &f[i], D3DXPT_FLOAT);
}
+ set_dirty(param);
return D3D_OK;
case D3DXPC_OBJECT:
@@ -1777,6 +1816,7 @@ static HRESULT d3dx9_base_effect_set_vector(struct d3dx9_base_effect *base,
{
case D3DXPC_SCALAR:
case D3DXPC_VECTOR:
+ set_dirty(param);
if (param->type == D3DXPT_INT && param->bytes == 4)
{
DWORD tmp;
@@ -1870,6 +1910,7 @@ static HRESULT d3dx9_base_effect_set_vector_array(struct d3dx9_base_effect *base
switch (param->class)
{
case D3DXPC_VECTOR:
+ set_dirty(param);
if (param->type == D3DXPT_FLOAT)
{
if (param->columns == 4)
@@ -1956,6 +1997,7 @@ static HRESULT d3dx9_base_effect_set_matrix(struct d3dx9_base_effect *base,
{
case D3DXPC_MATRIX_ROWS:
set_matrix(param, matrix);
+ set_dirty(param);
return D3D_OK;
case D3DXPC_SCALAR:
@@ -2021,6 +2063,7 @@ static HRESULT d3dx9_base_effect_set_matrix_array(struct d3dx9_base_effect *base
switch (param->class)
{
case D3DXPC_MATRIX_ROWS:
+ set_dirty(param);
for (i = 0; i < count; ++i)
{
set_matrix(¶m->members[i], &matrix[i]);
@@ -2095,6 +2138,7 @@ static HRESULT d3dx9_base_effect_set_matrix_pointer_array(struct d3dx9_base_effe
switch (param->class)
{
case D3DXPC_MATRIX_ROWS:
+ set_dirty(param);
for (i = 0; i < count; ++i)
{
set_matrix(¶m->members[i], matrix[i]);
@@ -2167,6 +2211,7 @@ static HRESULT d3dx9_base_effect_set_matrix_transpose(struct d3dx9_base_effect *
switch (param->class)
{
case D3DXPC_MATRIX_ROWS:
+ set_dirty(param);
set_matrix_transpose(param, matrix);
return D3D_OK;
@@ -2236,6 +2281,7 @@ static HRESULT d3dx9_base_effect_set_matrix_transpose_array(struct d3dx9_base_ef
switch (param->class)
{
case D3DXPC_MATRIX_ROWS:
+ set_dirty(param);
for (i = 0; i < count; ++i)
{
set_matrix_transpose(¶m->members[i], &matrix[i]);
@@ -2310,6 +2356,7 @@ static HRESULT d3dx9_base_effect_set_matrix_transpose_pointer_array(struct d3dx9
switch (param->class)
{
case D3DXPC_MATRIX_ROWS:
+ set_dirty(param);
for (i = 0; i < count; ++i)
{
set_matrix_transpose(¶m->members[i], matrix[i]);
@@ -2414,6 +2461,7 @@ static HRESULT d3dx9_base_effect_set_texture(struct d3dx9_base_effect *base,
if (oltexture) IDirect3DBaseTexture9_Release(oltexture);
*(struct IDirect3DBaseTexture9 **)param->data = texture;
+ set_dirty(param);
return D3D_OK;
}
@@ -5807,6 +5855,12 @@ static HRESULT d3dx9_parse_resource(struct d3dx9_base_effect *base, const char *
return hr;
}
+static BOOL param_set_dirty_flag_ptr(void *dirty_flag_ptr, struct d3dx_parameter *param)
+{
+ param->dirty_flag_ptr = (DWORD *)dirty_flag_ptr;
+ return FALSE;
+}
+
static HRESULT d3dx9_parse_effect(struct d3dx9_base_effect *base, const char *data, UINT data_size, DWORD start)
{
const char *ptr = data + start;
@@ -5916,6 +5970,9 @@ static HRESULT d3dx9_parse_effect(struct d3dx9_base_effect *base, const char *da
}
}
+ for (i = 0; i < base->parameter_count; ++i)
+ walk_parameter_tree(&base->parameters[i], param_set_dirty_flag_ptr,
+ &base->parameters[i].runtime_flags);
return D3D_OK;
err_out:
--
2.9.3
More information about the wine-patches
mailing list