You've already forked wine-staging
mirror of
https://gitlab.winehq.org/wine/wine-staging.git
synced 2025-12-15 08:03:15 -08:00
Added d3dx9-setrawvalue patchset
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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 = ¶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
|
||||
|
||||
1
patches/d3dx9-setrawvalue/definition
Normal file
1
patches/d3dx9-setrawvalue/definition
Normal file
@@ -0,0 +1 @@
|
||||
Fixes: [48598] d3dx9: Improve Rendering in MudRunner.
|
||||
Reference in New Issue
Block a user