From 112b476921ba16122859dcd6df5e2d56a61c0082 Mon Sep 17 00:00:00 2001 From: Alistair Leslie-Hughes Date: Sat, 20 Sep 2025 07:14:13 +1000 Subject: [PATCH] Added d3dx9-setrawvalue patchset --- ...t-for-setting-vec-2-3-effect-paramet.patch | 97 +++++++++++++++++++ ...l-support-for-setting-D3DXPC_STRUCT-.patch | 73 ++++++++++++++ patches/d3dx9-setrawvalue/definition | 1 + 3 files changed, 171 insertions(+) create mode 100644 patches/d3dx9-setrawvalue/0001-d3dx9-Add-support-for-setting-vec-2-3-effect-paramet.patch create mode 100644 patches/d3dx9-setrawvalue/0002-d3dx9-Add-partial-support-for-setting-D3DXPC_STRUCT-.patch create mode 100644 patches/d3dx9-setrawvalue/definition diff --git a/patches/d3dx9-setrawvalue/0001-d3dx9-Add-support-for-setting-vec-2-3-effect-paramet.patch b/patches/d3dx9-setrawvalue/0001-d3dx9-Add-support-for-setting-vec-2-3-effect-paramet.patch new file mode 100644 index 00000000..e7cb065b --- /dev/null +++ b/patches/d3dx9-setrawvalue/0001-d3dx9-Add-support-for-setting-vec-2-3-effect-paramet.patch @@ -0,0 +1,97 @@ +From 4295a5251ba743d6a7cef9847ba58f6b4b3319c9 Mon Sep 17 00:00:00 2001 +From: Connor McAdams +Date: Thu, 11 Sep 2025 14:42:19 -0400 +Subject: [PATCH 1/2] d3dx9: Add support for setting vec{2,3} effect parameters + in ID3DXEffect::SetRawValue(). + +Signed-off-by: Connor McAdams +--- + dlls/d3dx9_36/effect.c | 44 ++++++++++++++++++++++++++++-------- + dlls/d3dx9_36/tests/effect.c | 3 --- + 2 files changed, 35 insertions(+), 12 deletions(-) + +diff --git a/dlls/d3dx9_36/effect.c b/dlls/d3dx9_36/effect.c +index 72e216d3fff..500832340d3 100644 +--- a/dlls/d3dx9_36/effect.c ++++ b/dlls/d3dx9_36/effect.c +@@ -4456,20 +4456,46 @@ static HRESULT WINAPI d3dx_effect_SetRawValue(ID3DXEffect *iface, D3DXHANDLE par + { + uint8_t *dst_data; + +- if (param->columns != 4) ++ if (param->columns == 4) + { +- FIXME("Vec%u parameters are currently unsupported.\n", param->columns); +- return E_NOTIMPL; +- } ++ if ((byte_offset + bytes) > param->bytes) ++ { ++ FIXME("Writing adjacent parameters is currently unsupported.\n"); ++ return E_NOTIMPL; ++ } + +- if ((byte_offset + bytes) > param->bytes) ++ dst_data = param_get_data_and_dirtify(effect, param, !byte_offset ? bytes : param->bytes, TRUE); ++ memcpy(dst_data + byte_offset, data, bytes); ++ } ++ else + { +- FIXME("Writing adjacent parameters is currently unsupported.\n"); +- return E_NOTIMPL; ++ unsigned int src_elems = (bytes + 0xf) / sizeof(D3DXVECTOR4); ++ unsigned int dst_stride = sizeof(float) * param->columns; ++ unsigned int dst_elems = max(1, param->element_count); ++ const D3DXVECTOR4 *src_data = data; ++ unsigned int i, bytes_left; ++ ++ if (byte_offset) ++ { ++ FIXME("Setting Vec%u parameters with an offset is currently unsupported.\n", param->columns); ++ return E_NOTIMPL; ++ } ++ ++ if (src_elems > dst_elems) ++ { ++ FIXME("Writing adjacent parameters is currently unsupported.\n"); ++ return E_NOTIMPL; ++ } ++ ++ bytes_left = bytes; ++ dst_data = param_get_data_and_dirtify(effect, param, dst_elems * dst_stride, TRUE); ++ for (i = 0; i < src_elems; ++i) ++ { ++ memcpy(dst_data + (i * dst_stride), &src_data[i], min(bytes_left, dst_stride)); ++ bytes_left -= sizeof(*src_data); ++ } + } + +- dst_data = param_get_data_and_dirtify(effect, param, !byte_offset ? bytes : param->bytes, TRUE); +- memcpy(dst_data + byte_offset, data, bytes); + break; + } + +diff --git a/dlls/d3dx9_36/tests/effect.c b/dlls/d3dx9_36/tests/effect.c +index 2b9f607b045..1be4a28777b 100644 +--- a/dlls/d3dx9_36/tests/effect.c ++++ b/dlls/d3dx9_36/tests/effect.c +@@ -9068,17 +9068,14 @@ static void test_effect_set_raw_value(IDirect3DDevice9 *device) + { "2", 0, 8, + { .f = { 0.0f, 1.0f } }, + { .f = { 0.0f, 1.0f } }, +- .todo_hr = TRUE + }, + { "2_2", 0, 16, + { .f = { 0.0f, 1.0f, 0.0f, 2.0f } }, + { .f = { 0.0f, 1.0f, 0.0f, 0.0f } }, +- .todo_hr = TRUE + }, + { "2_2", 0, 24, + { .f = { 0.0f, 1.0f, 2.0f, 3.0f, 4.0f, 0.0f } }, + { .f = { 0.0f, 1.0f, 4.0f, 0.0f } }, +- .todo_hr = TRUE + }, + { "4", 0, 16, + { .f = { 1.0f, 2.0f, 0.0f, 3.0f } }, +-- +2.51.0 + diff --git a/patches/d3dx9-setrawvalue/0002-d3dx9-Add-partial-support-for-setting-D3DXPC_STRUCT-.patch b/patches/d3dx9-setrawvalue/0002-d3dx9-Add-partial-support-for-setting-D3DXPC_STRUCT-.patch new file mode 100644 index 00000000..b4e62f28 --- /dev/null +++ b/patches/d3dx9-setrawvalue/0002-d3dx9-Add-partial-support-for-setting-D3DXPC_STRUCT-.patch @@ -0,0 +1,73 @@ +From b3fa43c5d012f89417a31b15bc3f88fe10fbf429 Mon Sep 17 00:00:00 2001 +From: Connor McAdams +Date: Fri, 19 Sep 2025 13:58:15 -0400 +Subject: [PATCH 2/2] d3dx9: Add partial support for setting D3DXPC_STRUCT + parameters in ID3DXEffect::SetRawValue(). + +Signed-off-by: Connor McAdams +--- + dlls/d3dx9_36/effect.c | 48 ++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 48 insertions(+) + +diff --git a/dlls/d3dx9_36/effect.c b/dlls/d3dx9_36/effect.c +index 500832340d3..119f280e1a8 100644 +--- a/dlls/d3dx9_36/effect.c ++++ b/dlls/d3dx9_36/effect.c +@@ -4530,6 +4530,54 @@ static HRESULT WINAPI d3dx_effect_SetRawValue(ID3DXEffect *iface, D3DXHANDLE par + break; + } + ++ case D3DXPC_STRUCT: ++ { ++ const uint8_t *cur_param_data = data; ++ UINT bytes_left = bytes; ++ unsigned int i; ++ HRESULT hr; ++ ++ if (byte_offset) ++ { ++ FIXME("Setting structure members at an offset is currently unsupported.\n"); ++ return E_NOTIMPL; ++ } ++ ++ for (i = 0; i < param->member_count; ++i) ++ { ++ UINT member_size = param->members[i].class == D3DXPC_MATRIX_ROWS ? 64 : 16; ++ unsigned int member_elems = max(1, param->members[i].element_count); ++ struct d3dx_parameter *member = ¶m->members[i]; ++ ++ if (member->class != D3DXPC_MATRIX_ROWS && member->class != D3DXPC_VECTOR) ++ { ++ FIXME("Unhandled structure member parameter class %s.\n", debug_d3dxparameter_class(member->class)); ++ return E_NOTIMPL; ++ } ++ ++ member_size *= member_elems; ++ hr = iface->lpVtbl->SetRawValue(iface, (D3DXHANDLE)member, (const void *)cur_param_data, 0, ++ min(member_size, bytes_left)); ++ if (FAILED(hr)) ++ { ++ WARN("Failed with hr %#lx.\n", hr); ++ return hr; ++ } ++ ++ if (bytes_left <= member_size) ++ { ++ bytes_left = 0; ++ break; ++ } ++ cur_param_data += member_size; ++ bytes_left -= member_size; ++ } ++ ++ if (bytes_left) ++ FIXME("%u bytes were leftover, might have attempted to write an adjacent parameter.\n", bytes_left); ++ break; ++ } ++ + default: + FIXME("Unhandled parameter class %s.\n", debug_d3dxparameter_class(param->class)); + return E_NOTIMPL; +-- +2.51.0 + diff --git a/patches/d3dx9-setrawvalue/definition b/patches/d3dx9-setrawvalue/definition new file mode 100644 index 00000000..0e910451 --- /dev/null +++ b/patches/d3dx9-setrawvalue/definition @@ -0,0 +1 @@ +Fixes: [48598] d3dx9: Improve Rendering in MudRunner.