Added d3dx9-setrawvalue patchset

This commit is contained in:
Alistair Leslie-Hughes
2025-09-20 07:14:13 +10:00
parent 2465e06751
commit 112b476921
3 changed files with 171 additions and 0 deletions

View File

@@ -0,0 +1,97 @@
From 4295a5251ba743d6a7cef9847ba58f6b4b3319c9 Mon Sep 17 00:00:00 2001
From: Connor McAdams <cmcadams@codeweavers.com>
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 <cmcadams@codeweavers.com>
---
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

View File

@@ -0,0 +1,73 @@
From b3fa43c5d012f89417a31b15bc3f88fe10fbf429 Mon Sep 17 00:00:00 2001
From: Connor McAdams <cmcadams@codeweavers.com>
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 <cmcadams@codeweavers.com>
---
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 = &param->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

View File

@@ -0,0 +1 @@
Fixes: [48598] d3dx9: Improve Rendering in MudRunner.