Compare commits

..

20 Commits
v9.19 ... v9.21

Author SHA1 Message Date
Alistair Leslie-Hughes
f03d32e381 Release v9.21 2024-11-09 07:59:05 +11:00
Alistair Leslie-Hughes
da7652e29c Updated dmime_segment_getaudiopath patchset
Remove testing tracing.
2024-11-09 07:55:57 +11:00
Elizabeth Figura
1bc2bc0404 Rebase against 24694dabfc53fc850cf035e187a4c15b77d6bc77. 2024-11-07 16:09:50 -06:00
Alistair Leslie-Hughes
e2b1620f07 Updated vkd3d-latest patchset 2024-11-07 12:25:06 +11:00
Alistair Leslie-Hughes
e3d0d19955 Rebase against 6db2812411d45ca4b4d15dea9a00577ea17b508e. 2024-11-07 12:23:36 +11:00
Alistair Leslie-Hughes
d4483ee98c Updated vkd3d-latest patchset 2024-11-05 11:33:35 +11:00
Alistair Leslie-Hughes
0236a37992 Rebase against eeabbe812ffc3ed7c06fc85cd63f0d85bffe207e. 2024-11-05 11:32:58 +11:00
Alistair Leslie-Hughes
0e08b05863 Added dmscript_enum_routine patchset 2024-11-01 19:41:39 +11:00
Alistair Leslie-Hughes
6ae3756a4f Added dmime_segment_getaudiopath patchset 2024-11-01 18:01:22 +11:00
Alistair Leslie-Hughes
8ad449f7b1 Updated vkd3d-latest patchset 2024-11-01 18:00:55 +11:00
Alistair Leslie-Hughes
0855d4defe Updated win32u-NtGdiExtTextOutW-rotation patchset 2024-10-25 07:33:36 +11:00
Alistair Leslie-Hughes
78bd3f0c6d Rebase against 83febc6b55cf9e7f97299e391771b9ad0d1f1ceb. 2024-10-24 09:49:30 +11:00
Alistair Leslie-Hughes
16cfc61df8 Updated vkd3d-latest patchset 2024-10-23 13:51:57 +11:00
Alistair Leslie-Hughes
153172ad27 Rebase against 2bca8cb236b7d4d5f4e0e35d6fcad6a1d8a2c5e3. 2024-10-23 13:49:48 +11:00
Alistair Leslie-Hughes
5a1b9d5093 Release v9.20 2024-10-19 08:10:39 +11:00
Alistair Leslie-Hughes
c1f62cba4d Rebase against 3a6e9365336304b4d7eb4d66aef959f67361cc1f. 2024-10-19 08:03:42 +11:00
Alistair Leslie-Hughes
02792d0328 Added win32u-NtGdiExtTextOutW-rotation patchset 2024-10-18 07:34:05 +11:00
Alistair Leslie-Hughes
44f9ec9761 Updated vkd3d-latest patchset 2024-10-18 07:32:33 +11:00
Alistair Leslie-Hughes
81492f7156 Updated vkd3d-latest patchset 2024-10-15 09:23:52 +11:00
Alistair Leslie-Hughes
683813d151 Drop gdi32-rotation patchset
This was "fixed" upstream. Though the current implementation is causing
multiple regressions with Rounded Rects.
2024-10-15 09:22:31 +11:00
33 changed files with 31406 additions and 16225 deletions

View File

@@ -1,371 +0,0 @@
From 3eb7b781849135fefeece9ca257ca9673b1545fd Mon Sep 17 00:00:00 2001
From: Christian Costa <titan.costa@gmail.com>
Date: Sun, 16 Jul 2017 18:13:31 +0200
Subject: d3dx9_36: Add semi-stub for D3DXOptimizeVertices.
---
dlls/d3dx9_24/d3dx9_24.spec | 2 +-
dlls/d3dx9_25/d3dx9_25.spec | 2 +-
dlls/d3dx9_26/d3dx9_26.spec | 2 +-
dlls/d3dx9_27/d3dx9_27.spec | 2 +-
dlls/d3dx9_28/d3dx9_28.spec | 2 +-
dlls/d3dx9_29/d3dx9_29.spec | 2 +-
dlls/d3dx9_30/d3dx9_30.spec | 2 +-
dlls/d3dx9_31/d3dx9_31.spec | 2 +-
dlls/d3dx9_32/d3dx9_32.spec | 2 +-
dlls/d3dx9_33/d3dx9_33.spec | 2 +-
dlls/d3dx9_34/d3dx9_34.spec | 2 +-
dlls/d3dx9_35/d3dx9_35.spec | 2 +-
dlls/d3dx9_36/d3dx9_36.spec | 2 +-
dlls/d3dx9_36/mesh.c | 27 +++++++++++++++++++++++++++
dlls/d3dx9_36/tests/mesh.c | 22 ++++++++++++++++++++++
dlls/d3dx9_37/d3dx9_37.spec | 2 +-
dlls/d3dx9_38/d3dx9_38.spec | 2 +-
dlls/d3dx9_39/d3dx9_39.spec | 2 +-
dlls/d3dx9_40/d3dx9_40.spec | 2 +-
dlls/d3dx9_41/d3dx9_41.spec | 2 +-
dlls/d3dx9_42/d3dx9_42.spec | 2 +-
dlls/d3dx9_43/d3dx9_43.spec | 2 +-
22 files changed, 69 insertions(+), 20 deletions(-)
diff --git a/dlls/d3dx9_24/d3dx9_24.spec b/dlls/d3dx9_24/d3dx9_24.spec
index 0ca8777efe6..9b52c2bf307 100644
--- a/dlls/d3dx9_24/d3dx9_24.spec
+++ b/dlls/d3dx9_24/d3dx9_24.spec
@@ -226,7 +226,7 @@
@ stdcall D3DXMatrixTranslation(ptr float float float)
@ stdcall D3DXMatrixTranspose(ptr ptr)
@ stdcall D3DXOptimizeFaces(ptr long long long ptr)
-@ stub D3DXOptimizeVertices(ptr long long long ptr)
+@ stdcall D3DXOptimizeVertices(ptr long long long ptr)
@ stdcall D3DXPlaneFromPointNormal(ptr ptr ptr)
@ stdcall D3DXPlaneFromPoints(ptr ptr ptr ptr)
@ stdcall D3DXPlaneIntersectLine(ptr ptr ptr ptr)
diff --git a/dlls/d3dx9_25/d3dx9_25.spec b/dlls/d3dx9_25/d3dx9_25.spec
index a5449810a43..fc75dfd9c04 100644
--- a/dlls/d3dx9_25/d3dx9_25.spec
+++ b/dlls/d3dx9_25/d3dx9_25.spec
@@ -226,7 +226,7 @@
@ stdcall D3DXMatrixTranslation(ptr float float float)
@ stdcall D3DXMatrixTranspose(ptr ptr)
@ stdcall D3DXOptimizeFaces(ptr long long long ptr)
-@ stub D3DXOptimizeVertices(ptr long long long ptr)
+@ stdcall D3DXOptimizeVertices(ptr long long long ptr)
@ stdcall D3DXPlaneFromPointNormal(ptr ptr ptr)
@ stdcall D3DXPlaneFromPoints(ptr ptr ptr ptr)
@ stdcall D3DXPlaneIntersectLine(ptr ptr ptr ptr)
diff --git a/dlls/d3dx9_26/d3dx9_26.spec b/dlls/d3dx9_26/d3dx9_26.spec
index 9e1200442f4..85d9fc5332e 100644
--- a/dlls/d3dx9_26/d3dx9_26.spec
+++ b/dlls/d3dx9_26/d3dx9_26.spec
@@ -230,7 +230,7 @@
@ stdcall D3DXMatrixTranslation(ptr float float float)
@ stdcall D3DXMatrixTranspose(ptr ptr)
@ stdcall D3DXOptimizeFaces(ptr long long long ptr)
-@ stub D3DXOptimizeVertices(ptr long long long ptr)
+@ stdcall D3DXOptimizeVertices(ptr long long long ptr)
@ stdcall D3DXPlaneFromPointNormal(ptr ptr ptr)
@ stdcall D3DXPlaneFromPoints(ptr ptr ptr ptr)
@ stdcall D3DXPlaneIntersectLine(ptr ptr ptr ptr)
diff --git a/dlls/d3dx9_27/d3dx9_27.spec b/dlls/d3dx9_27/d3dx9_27.spec
index 9e1200442f4..85d9fc5332e 100644
--- a/dlls/d3dx9_27/d3dx9_27.spec
+++ b/dlls/d3dx9_27/d3dx9_27.spec
@@ -230,7 +230,7 @@
@ stdcall D3DXMatrixTranslation(ptr float float float)
@ stdcall D3DXMatrixTranspose(ptr ptr)
@ stdcall D3DXOptimizeFaces(ptr long long long ptr)
-@ stub D3DXOptimizeVertices(ptr long long long ptr)
+@ stdcall D3DXOptimizeVertices(ptr long long long ptr)
@ stdcall D3DXPlaneFromPointNormal(ptr ptr ptr)
@ stdcall D3DXPlaneFromPoints(ptr ptr ptr ptr)
@ stdcall D3DXPlaneIntersectLine(ptr ptr ptr ptr)
diff --git a/dlls/d3dx9_28/d3dx9_28.spec b/dlls/d3dx9_28/d3dx9_28.spec
index b316a23baf1..62673ccd7af 100644
--- a/dlls/d3dx9_28/d3dx9_28.spec
+++ b/dlls/d3dx9_28/d3dx9_28.spec
@@ -230,7 +230,7 @@
@ stdcall D3DXMatrixTranslation(ptr float float float)
@ stdcall D3DXMatrixTranspose(ptr ptr)
@ stdcall D3DXOptimizeFaces(ptr long long long ptr)
-@ stub D3DXOptimizeVertices(ptr long long long ptr)
+@ stdcall D3DXOptimizeVertices(ptr long long long ptr)
@ stdcall D3DXPlaneFromPointNormal(ptr ptr ptr)
@ stdcall D3DXPlaneFromPoints(ptr ptr ptr ptr)
@ stdcall D3DXPlaneIntersectLine(ptr ptr ptr ptr)
diff --git a/dlls/d3dx9_29/d3dx9_29.spec b/dlls/d3dx9_29/d3dx9_29.spec
index b316a23baf1..62673ccd7af 100644
--- a/dlls/d3dx9_29/d3dx9_29.spec
+++ b/dlls/d3dx9_29/d3dx9_29.spec
@@ -230,7 +230,7 @@
@ stdcall D3DXMatrixTranslation(ptr float float float)
@ stdcall D3DXMatrixTranspose(ptr ptr)
@ stdcall D3DXOptimizeFaces(ptr long long long ptr)
-@ stub D3DXOptimizeVertices(ptr long long long ptr)
+@ stdcall D3DXOptimizeVertices(ptr long long long ptr)
@ stdcall D3DXPlaneFromPointNormal(ptr ptr ptr)
@ stdcall D3DXPlaneFromPoints(ptr ptr ptr ptr)
@ stdcall D3DXPlaneIntersectLine(ptr ptr ptr ptr)
diff --git a/dlls/d3dx9_30/d3dx9_30.spec b/dlls/d3dx9_30/d3dx9_30.spec
index e00fa547862..2c7575d88fc 100644
--- a/dlls/d3dx9_30/d3dx9_30.spec
+++ b/dlls/d3dx9_30/d3dx9_30.spec
@@ -230,7 +230,7 @@
@ stdcall D3DXMatrixTranslation(ptr float float float)
@ stdcall D3DXMatrixTranspose(ptr ptr)
@ stdcall D3DXOptimizeFaces(ptr long long long ptr)
-@ stub D3DXOptimizeVertices(ptr long long long ptr)
+@ stdcall D3DXOptimizeVertices(ptr long long long ptr)
@ stdcall D3DXPlaneFromPointNormal(ptr ptr ptr)
@ stdcall D3DXPlaneFromPoints(ptr ptr ptr ptr)
@ stdcall D3DXPlaneIntersectLine(ptr ptr ptr ptr)
diff --git a/dlls/d3dx9_31/d3dx9_31.spec b/dlls/d3dx9_31/d3dx9_31.spec
index d308939ef67..a41eb3e9af2 100644
--- a/dlls/d3dx9_31/d3dx9_31.spec
+++ b/dlls/d3dx9_31/d3dx9_31.spec
@@ -227,7 +227,7 @@
@ stdcall D3DXMatrixTranslation(ptr float float float)
@ stdcall D3DXMatrixTranspose(ptr ptr)
@ stdcall D3DXOptimizeFaces(ptr long long long ptr)
-@ stub D3DXOptimizeVertices(ptr long long long ptr)
+@ stdcall D3DXOptimizeVertices(ptr long long long ptr)
@ stdcall D3DXPlaneFromPointNormal(ptr ptr ptr)
@ stdcall D3DXPlaneFromPoints(ptr ptr ptr ptr)
@ stdcall D3DXPlaneIntersectLine(ptr ptr ptr ptr)
diff --git a/dlls/d3dx9_32/d3dx9_32.spec b/dlls/d3dx9_32/d3dx9_32.spec
index c2292dff396..eab56b3c9ee 100644
--- a/dlls/d3dx9_32/d3dx9_32.spec
+++ b/dlls/d3dx9_32/d3dx9_32.spec
@@ -227,7 +227,7 @@
@ stdcall D3DXMatrixTranslation(ptr float float float)
@ stdcall D3DXMatrixTranspose(ptr ptr)
@ stdcall D3DXOptimizeFaces(ptr long long long ptr)
-@ stub D3DXOptimizeVertices(ptr long long long ptr)
+@ stdcall D3DXOptimizeVertices(ptr long long long ptr)
@ stdcall D3DXPlaneFromPointNormal(ptr ptr ptr)
@ stdcall D3DXPlaneFromPoints(ptr ptr ptr ptr)
@ stdcall D3DXPlaneIntersectLine(ptr ptr ptr ptr)
diff --git a/dlls/d3dx9_33/d3dx9_33.spec b/dlls/d3dx9_33/d3dx9_33.spec
index c2292dff396..eab56b3c9ee 100644
--- a/dlls/d3dx9_33/d3dx9_33.spec
+++ b/dlls/d3dx9_33/d3dx9_33.spec
@@ -227,7 +227,7 @@
@ stdcall D3DXMatrixTranslation(ptr float float float)
@ stdcall D3DXMatrixTranspose(ptr ptr)
@ stdcall D3DXOptimizeFaces(ptr long long long ptr)
-@ stub D3DXOptimizeVertices(ptr long long long ptr)
+@ stdcall D3DXOptimizeVertices(ptr long long long ptr)
@ stdcall D3DXPlaneFromPointNormal(ptr ptr ptr)
@ stdcall D3DXPlaneFromPoints(ptr ptr ptr ptr)
@ stdcall D3DXPlaneIntersectLine(ptr ptr ptr ptr)
diff --git a/dlls/d3dx9_34/d3dx9_34.spec b/dlls/d3dx9_34/d3dx9_34.spec
index c2292dff396..eab56b3c9ee 100644
--- a/dlls/d3dx9_34/d3dx9_34.spec
+++ b/dlls/d3dx9_34/d3dx9_34.spec
@@ -227,7 +227,7 @@
@ stdcall D3DXMatrixTranslation(ptr float float float)
@ stdcall D3DXMatrixTranspose(ptr ptr)
@ stdcall D3DXOptimizeFaces(ptr long long long ptr)
-@ stub D3DXOptimizeVertices(ptr long long long ptr)
+@ stdcall D3DXOptimizeVertices(ptr long long long ptr)
@ stdcall D3DXPlaneFromPointNormal(ptr ptr ptr)
@ stdcall D3DXPlaneFromPoints(ptr ptr ptr ptr)
@ stdcall D3DXPlaneIntersectLine(ptr ptr ptr ptr)
diff --git a/dlls/d3dx9_35/d3dx9_35.spec b/dlls/d3dx9_35/d3dx9_35.spec
index c2292dff396..eab56b3c9ee 100644
--- a/dlls/d3dx9_35/d3dx9_35.spec
+++ b/dlls/d3dx9_35/d3dx9_35.spec
@@ -227,7 +227,7 @@
@ stdcall D3DXMatrixTranslation(ptr float float float)
@ stdcall D3DXMatrixTranspose(ptr ptr)
@ stdcall D3DXOptimizeFaces(ptr long long long ptr)
-@ stub D3DXOptimizeVertices(ptr long long long ptr)
+@ stdcall D3DXOptimizeVertices(ptr long long long ptr)
@ stdcall D3DXPlaneFromPointNormal(ptr ptr ptr)
@ stdcall D3DXPlaneFromPoints(ptr ptr ptr ptr)
@ stdcall D3DXPlaneIntersectLine(ptr ptr ptr ptr)
diff --git a/dlls/d3dx9_36/d3dx9_36.spec b/dlls/d3dx9_36/d3dx9_36.spec
index 0fdf4e135e1..6201657d4a5 100644
--- a/dlls/d3dx9_36/d3dx9_36.spec
+++ b/dlls/d3dx9_36/d3dx9_36.spec
@@ -229,7 +229,7 @@
@ stdcall D3DXMatrixTranslation(ptr float float float)
@ stdcall D3DXMatrixTranspose(ptr ptr)
@ stdcall D3DXOptimizeFaces(ptr long long long ptr)
-@ stub D3DXOptimizeVertices(ptr long long long ptr)
+@ stdcall D3DXOptimizeVertices(ptr long long long ptr)
@ stdcall D3DXPlaneFromPointNormal(ptr ptr ptr)
@ stdcall D3DXPlaneFromPoints(ptr ptr ptr ptr)
@ stdcall D3DXPlaneIntersectLine(ptr ptr ptr ptr)
diff --git a/dlls/d3dx9_36/mesh.c b/dlls/d3dx9_36/mesh.c
index 6294ce624fe..12cb7eb7258 100644
--- a/dlls/d3dx9_36/mesh.c
+++ b/dlls/d3dx9_36/mesh.c
@@ -7184,6 +7184,33 @@ cleanup:
return hr;
}
+
+/*************************************************************************
+ * D3DXOptimizeVertices (D3DX9_36.@)
+ */
+HRESULT WINAPI D3DXOptimizeVertices(const void *indices, UINT num_faces,
+ UINT num_vertices, BOOL indices_are_32bit, DWORD *vertex_remap)
+{
+ UINT i;
+
+ FIXME("indices %p, num_faces %u, num_vertices %u, indices_are_32bit %#x, vertex_remap %p semi-stub.\n",
+ indices, num_faces, num_vertices, indices_are_32bit, vertex_remap);
+
+ if (!vertex_remap)
+ {
+ WARN("vertex remap pointer is NULL.\n");
+ return D3DERR_INVALIDCALL;
+ }
+
+ for (i = 0; i < num_vertices; i++)
+ {
+ vertex_remap[i] = i;
+ }
+
+ return D3D_OK;
+}
+
+
/*************************************************************************
* D3DXOptimizeFaces (D3DX9_36.@)
*
diff --git a/dlls/d3dx9_36/tests/mesh.c b/dlls/d3dx9_36/tests/mesh.c
index f437a83cbd8..c5faae520c9 100644
--- a/dlls/d3dx9_36/tests/mesh.c
+++ b/dlls/d3dx9_36/tests/mesh.c
@@ -10403,6 +10403,27 @@ cleanup:
free_test_context(test_context);
}
+static void test_optimize_vertices(void)
+{
+ HRESULT hr;
+ DWORD vertex_remap[3];
+ const DWORD indices[] = {0, 1, 2};
+ const UINT num_faces = 1;
+ const UINT num_vertices = 3;
+
+ hr = D3DXOptimizeVertices(indices, num_faces,
+ num_vertices, FALSE,
+ vertex_remap);
+ ok(hr == D3D_OK, "D3DXOptimizeVertices failed. Got %lx, expected D3D_OK.\n", hr);
+
+ /* vertex_remap must not be NULL */
+ hr = D3DXOptimizeVertices(indices, num_faces,
+ num_vertices, FALSE,
+ NULL);
+ ok(hr == D3DERR_INVALIDCALL, "D3DXOptimizeVertices passed NULL vertex_remap "
+ "pointer. Got %lx, expected D3DERR_INVALIDCALL.\n", hr);
+}
+
static void test_optimize_faces(void)
{
HRESULT hr;
@@ -11291,6 +11312,7 @@ START_TEST(mesh)
test_weld_vertices();
test_clone_mesh();
test_valid_mesh();
+ test_optimize_vertices();
test_optimize_faces();
test_compute_normals();
test_D3DXFrameFind();
diff --git a/dlls/d3dx9_37/d3dx9_37.spec b/dlls/d3dx9_37/d3dx9_37.spec
index 0fdf4e135e1..6201657d4a5 100644
--- a/dlls/d3dx9_37/d3dx9_37.spec
+++ b/dlls/d3dx9_37/d3dx9_37.spec
@@ -229,7 +229,7 @@
@ stdcall D3DXMatrixTranslation(ptr float float float)
@ stdcall D3DXMatrixTranspose(ptr ptr)
@ stdcall D3DXOptimizeFaces(ptr long long long ptr)
-@ stub D3DXOptimizeVertices(ptr long long long ptr)
+@ stdcall D3DXOptimizeVertices(ptr long long long ptr)
@ stdcall D3DXPlaneFromPointNormal(ptr ptr ptr)
@ stdcall D3DXPlaneFromPoints(ptr ptr ptr ptr)
@ stdcall D3DXPlaneIntersectLine(ptr ptr ptr ptr)
diff --git a/dlls/d3dx9_38/d3dx9_38.spec b/dlls/d3dx9_38/d3dx9_38.spec
index 0fdf4e135e1..6201657d4a5 100644
--- a/dlls/d3dx9_38/d3dx9_38.spec
+++ b/dlls/d3dx9_38/d3dx9_38.spec
@@ -229,7 +229,7 @@
@ stdcall D3DXMatrixTranslation(ptr float float float)
@ stdcall D3DXMatrixTranspose(ptr ptr)
@ stdcall D3DXOptimizeFaces(ptr long long long ptr)
-@ stub D3DXOptimizeVertices(ptr long long long ptr)
+@ stdcall D3DXOptimizeVertices(ptr long long long ptr)
@ stdcall D3DXPlaneFromPointNormal(ptr ptr ptr)
@ stdcall D3DXPlaneFromPoints(ptr ptr ptr ptr)
@ stdcall D3DXPlaneIntersectLine(ptr ptr ptr ptr)
diff --git a/dlls/d3dx9_39/d3dx9_39.spec b/dlls/d3dx9_39/d3dx9_39.spec
index 0fdf4e135e1..6201657d4a5 100644
--- a/dlls/d3dx9_39/d3dx9_39.spec
+++ b/dlls/d3dx9_39/d3dx9_39.spec
@@ -229,7 +229,7 @@
@ stdcall D3DXMatrixTranslation(ptr float float float)
@ stdcall D3DXMatrixTranspose(ptr ptr)
@ stdcall D3DXOptimizeFaces(ptr long long long ptr)
-@ stub D3DXOptimizeVertices(ptr long long long ptr)
+@ stdcall D3DXOptimizeVertices(ptr long long long ptr)
@ stdcall D3DXPlaneFromPointNormal(ptr ptr ptr)
@ stdcall D3DXPlaneFromPoints(ptr ptr ptr ptr)
@ stdcall D3DXPlaneIntersectLine(ptr ptr ptr ptr)
diff --git a/dlls/d3dx9_40/d3dx9_40.spec b/dlls/d3dx9_40/d3dx9_40.spec
index 0fdf4e135e1..6201657d4a5 100644
--- a/dlls/d3dx9_40/d3dx9_40.spec
+++ b/dlls/d3dx9_40/d3dx9_40.spec
@@ -229,7 +229,7 @@
@ stdcall D3DXMatrixTranslation(ptr float float float)
@ stdcall D3DXMatrixTranspose(ptr ptr)
@ stdcall D3DXOptimizeFaces(ptr long long long ptr)
-@ stub D3DXOptimizeVertices(ptr long long long ptr)
+@ stdcall D3DXOptimizeVertices(ptr long long long ptr)
@ stdcall D3DXPlaneFromPointNormal(ptr ptr ptr)
@ stdcall D3DXPlaneFromPoints(ptr ptr ptr ptr)
@ stdcall D3DXPlaneIntersectLine(ptr ptr ptr ptr)
diff --git a/dlls/d3dx9_41/d3dx9_41.spec b/dlls/d3dx9_41/d3dx9_41.spec
index 0fdf4e135e1..6201657d4a5 100644
--- a/dlls/d3dx9_41/d3dx9_41.spec
+++ b/dlls/d3dx9_41/d3dx9_41.spec
@@ -229,7 +229,7 @@
@ stdcall D3DXMatrixTranslation(ptr float float float)
@ stdcall D3DXMatrixTranspose(ptr ptr)
@ stdcall D3DXOptimizeFaces(ptr long long long ptr)
-@ stub D3DXOptimizeVertices(ptr long long long ptr)
+@ stdcall D3DXOptimizeVertices(ptr long long long ptr)
@ stdcall D3DXPlaneFromPointNormal(ptr ptr ptr)
@ stdcall D3DXPlaneFromPoints(ptr ptr ptr ptr)
@ stdcall D3DXPlaneIntersectLine(ptr ptr ptr ptr)
diff --git a/dlls/d3dx9_42/d3dx9_42.spec b/dlls/d3dx9_42/d3dx9_42.spec
index 2f2ac5fd619..7cfc439f84b 100644
--- a/dlls/d3dx9_42/d3dx9_42.spec
+++ b/dlls/d3dx9_42/d3dx9_42.spec
@@ -222,7 +222,7 @@
@ stdcall D3DXMatrixTranslation(ptr float float float)
@ stdcall D3DXMatrixTranspose(ptr ptr)
@ stdcall D3DXOptimizeFaces(ptr long long long ptr)
-@ stub D3DXOptimizeVertices(ptr long long long ptr)
+@ stdcall D3DXOptimizeVertices(ptr long long long ptr)
@ stdcall D3DXPlaneFromPointNormal(ptr ptr ptr)
@ stdcall D3DXPlaneFromPoints(ptr ptr ptr ptr)
@ stdcall D3DXPlaneIntersectLine(ptr ptr ptr ptr)
diff --git a/dlls/d3dx9_43/d3dx9_43.spec b/dlls/d3dx9_43/d3dx9_43.spec
index 2f2ac5fd619..7cfc439f84b 100644
--- a/dlls/d3dx9_43/d3dx9_43.spec
+++ b/dlls/d3dx9_43/d3dx9_43.spec
@@ -222,7 +222,7 @@
@ stdcall D3DXMatrixTranslation(ptr float float float)
@ stdcall D3DXMatrixTranspose(ptr ptr)
@ stdcall D3DXOptimizeFaces(ptr long long long ptr)
-@ stub D3DXOptimizeVertices(ptr long long long ptr)
+@ stdcall D3DXOptimizeVertices(ptr long long long ptr)
@ stdcall D3DXPlaneFromPointNormal(ptr ptr ptr)
@ stdcall D3DXPlaneFromPoints(ptr ptr ptr ptr)
@ stdcall D3DXPlaneIntersectLine(ptr ptr ptr ptr)
--
2.14.2

View File

@@ -1 +0,0 @@
Fixes: [47776] Timeshift needs D3DXOptimizeVertices()

View File

@@ -0,0 +1,158 @@
From 79617ce168284934b09313f454e911394ec5eed8 Mon Sep 17 00:00:00 2001
From: Alistair Leslie-Hughes <leslie_alistair@hotmail.com>
Date: Fri, 1 Nov 2024 17:59:51 +1100
Subject: [PATCH] dmime: Semi implement
IDirectMusicSegment::GetAudioPathConfig.
---
dlls/dmime/audiopath.c | 97 +++++++++++++++++++++++-------------------
dlls/dmime/segment.c | 6 +++
2 files changed, 59 insertions(+), 44 deletions(-)
diff --git a/dlls/dmime/audiopath.c b/dlls/dmime/audiopath.c
index 3389f965b8f..501eecf234c 100644
--- a/dlls/dmime/audiopath.c
+++ b/dlls/dmime/audiopath.c
@@ -649,18 +649,21 @@ HRESULT path_config_get_audio_path_params(IUnknown *iface, WAVEFORMATEX *format,
{
struct audio_path_config *This = impl_from_IUnknown(iface);
struct list *first_port_config, *first_pchannel_to_buffer;
- struct audio_path_port_config *port_config;
- struct audio_path_pchannel_to_buffer *pchannel_to_buffer;
+ struct audio_path_port_config *port_config = NULL;
+ struct audio_path_pchannel_to_buffer *pchannel_to_buffer = NULL;
GUID *guids;
first_port_config = list_head(&This->port_config_entries);
- if (list_next(&This->port_config_entries, first_port_config))
- FIXME("Only one port config supported. %p -> %p\n", first_port_config, list_next(&This->port_config_entries, first_port_config));
- port_config = LIST_ENTRY(first_port_config, struct audio_path_port_config, entry);
- first_pchannel_to_buffer = list_head(&port_config->pchannel_to_buffer_entries);
- if (list_next(&port_config->pchannel_to_buffer_entries, first_pchannel_to_buffer))
- FIXME("Only one pchannel to buffer entry supported.\n");
- pchannel_to_buffer = LIST_ENTRY(first_pchannel_to_buffer, struct audio_path_pchannel_to_buffer, entry);
+ if (first_port_config)
+ {
+ if (list_next(&This->port_config_entries, first_port_config))
+ FIXME("Only one port config supported. %p -> %p\n", first_port_config, list_next(&This->port_config_entries, first_port_config));
+ port_config = LIST_ENTRY(first_port_config, struct audio_path_port_config, entry);
+ first_pchannel_to_buffer = list_head(&port_config->pchannel_to_buffer_entries);
+ if (list_next(&port_config->pchannel_to_buffer_entries, first_pchannel_to_buffer))
+ FIXME("Only one pchannel to buffer entry supported.\n");
+ pchannel_to_buffer = LIST_ENTRY(first_pchannel_to_buffer, struct audio_path_pchannel_to_buffer, entry);
+ }
/* Secondary buffer description */
memset(format, 0, sizeof(*format));
@@ -680,50 +683,56 @@ HRESULT path_config_get_audio_path_params(IUnknown *iface, WAVEFORMATEX *format,
desc->lpwfxFormat = format;
desc->guid3DAlgorithm = GUID_NULL;
- guids = pchannel_to_buffer->guids;
- if (pchannel_to_buffer->header.dwBufferCount == 2)
+ if (pchannel_to_buffer)
{
- if ((!IsEqualGUID(&guids[0], &GUID_Buffer_Reverb) && !IsEqualGUID(&guids[0], &GUID_Buffer_Stereo)) ||
- (!IsEqualGUID(&guids[1], &GUID_Buffer_Reverb) && !IsEqualGUID(&guids[1], &GUID_Buffer_Stereo)) ||
- IsEqualGUID(&guids[0], &guids[1]))
- FIXME("Only a stereo plus reverb buffer is supported\n");
- else
+ guids = pchannel_to_buffer->guids;
+ if (pchannel_to_buffer->header.dwBufferCount == 2)
{
- desc->dwFlags |= DSBCAPS_CTRLPAN | DSBCAPS_CTRLFREQUENCY;
- format->nChannels = 2;
- format->nBlockAlign *= 2;
- format->nAvgBytesPerSec *= 2;
+ if ((!IsEqualGUID(&guids[0], &GUID_Buffer_Reverb) && !IsEqualGUID(&guids[0], &GUID_Buffer_Stereo)) ||
+ (!IsEqualGUID(&guids[1], &GUID_Buffer_Reverb) && !IsEqualGUID(&guids[1], &GUID_Buffer_Stereo)) ||
+ IsEqualGUID(&guids[0], &guids[1]))
+ FIXME("Only a stereo plus reverb buffer is supported\n");
+ else
+ {
+ desc->dwFlags |= DSBCAPS_CTRLPAN | DSBCAPS_CTRLFREQUENCY;
+ format->nChannels = 2;
+ format->nBlockAlign *= 2;
+ format->nAvgBytesPerSec *= 2;
+ }
}
- }
- else if (pchannel_to_buffer->header.dwBufferCount == 1)
- {
- if (IsEqualGUID(guids, &GUID_Buffer_Stereo))
+ else if (pchannel_to_buffer->header.dwBufferCount == 1)
{
- desc->dwFlags |= DSBCAPS_CTRLPAN | DSBCAPS_CTRLFREQUENCY;
- format->nChannels = 2;
- format->nBlockAlign *= 2;
- format->nAvgBytesPerSec *= 2;
+ if (IsEqualGUID(guids, &GUID_Buffer_Stereo))
+ {
+ desc->dwFlags |= DSBCAPS_CTRLPAN | DSBCAPS_CTRLFREQUENCY;
+ format->nChannels = 2;
+ format->nBlockAlign *= 2;
+ format->nAvgBytesPerSec *= 2;
+ }
+ else if (IsEqualGUID(guids, &GUID_Buffer_3D_Dry))
+ desc->dwFlags |= DSBCAPS_CTRL3D | DSBCAPS_CTRLFREQUENCY | DSBCAPS_MUTE3DATMAXDISTANCE;
+ else if (IsEqualGUID(guids, &GUID_Buffer_Mono))
+ desc->dwFlags |= DSBCAPS_CTRLPAN | DSBCAPS_CTRLFREQUENCY;
+ else
+ FIXME("Unsupported buffer guid %s\n", debugstr_dmguid(guids));
}
- else if (IsEqualGUID(guids, &GUID_Buffer_3D_Dry))
- desc->dwFlags |= DSBCAPS_CTRL3D | DSBCAPS_CTRLFREQUENCY | DSBCAPS_MUTE3DATMAXDISTANCE;
- else if (IsEqualGUID(guids, &GUID_Buffer_Mono))
- desc->dwFlags |= DSBCAPS_CTRLPAN | DSBCAPS_CTRLFREQUENCY;
else
- FIXME("Unsupported buffer guid %s\n", debugstr_dmguid(guids));
+ FIXME("Multiple buffers not supported\n");
}
- else
- FIXME("Multiple buffers not supported\n");
- *params = port_config->params;
- if (!(params->dwValidParams & DMUS_PORTPARAMS_CHANNELGROUPS))
- {
- params->dwValidParams |= DMUS_PORTPARAMS_CHANNELGROUPS;
- params->dwChannelGroups = (port_config->header.dwPChannelCount + 15) / 16;
- }
- if (!(params->dwValidParams & DMUS_PORTPARAMS_AUDIOCHANNELS))
+ if (port_config)
{
- params->dwValidParams |= DMUS_PORTPARAMS_AUDIOCHANNELS;
- params->dwAudioChannels = format->nChannels;
+ *params = port_config->params;
+ if (!(params->dwValidParams & DMUS_PORTPARAMS_CHANNELGROUPS))
+ {
+ params->dwValidParams |= DMUS_PORTPARAMS_CHANNELGROUPS;
+ params->dwChannelGroups = (port_config->header.dwPChannelCount + 15) / 16;
+ }
+ if (!(params->dwValidParams & DMUS_PORTPARAMS_AUDIOCHANNELS))
+ {
+ params->dwValidParams |= DMUS_PORTPARAMS_AUDIOCHANNELS;
+ params->dwAudioChannels = format->nChannels;
+ }
}
return S_OK;
}
diff --git a/dlls/dmime/segment.c b/dlls/dmime/segment.c
index b96f0e2e401..36860b7c762 100644
--- a/dlls/dmime/segment.c
+++ b/dlls/dmime/segment.c
@@ -516,6 +516,12 @@ static HRESULT WINAPI segment_GetAudioPathConfig(IDirectMusicSegment8 *iface, IU
{
struct segment *This = impl_from_IDirectMusicSegment8(iface);
FIXME("(%p, %p): stub\n", This, ppAudioPathConfig);
+
+ if (!ppAudioPathConfig)
+ return E_POINTER;
+
+ create_dmaudiopath_config(&IID_IUnknown, (void**)ppAudioPathConfig);
+
return S_OK;
}
--
2.45.2

View File

@@ -0,0 +1 @@
Fixes: [56699] dmime: Semi-Implement IDirectMusicSegment8::GetAudioPathConfig

View File

@@ -0,0 +1,27 @@
From 59bed5259de3329ab2332c9c03f99126acdba4a4 Mon Sep 17 00:00:00 2001
From: Alistair Leslie-Hughes <leslie_alistair@hotmail.com>
Date: Fri, 1 Nov 2024 19:39:11 +1100
Subject: [PATCH] dmscript: IDirectMusicScript::EnumRoutine return S_FALSE by
default
https://bugs.winehq.org/show_bug.cgi?id=55982
---
dlls/dmscript/script.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/dlls/dmscript/script.c b/dlls/dmscript/script.c
index 01d4bcd0290..278405a322a 100644
--- a/dlls/dmscript/script.c
+++ b/dlls/dmscript/script.c
@@ -171,7 +171,7 @@ static HRESULT WINAPI IDirectMusicScriptImpl_EnumRoutine(IDirectMusicScript *ifa
{
IDirectMusicScriptImpl *This = impl_from_IDirectMusicScript(iface);
FIXME("(%p, %ld, %p): stub\n", This, dwIndex, pwszName);
- return S_OK;
+ return S_FALSE;
}
static HRESULT WINAPI IDirectMusicScriptImpl_EnumVariable(IDirectMusicScript *iface, DWORD dwIndex,
--
2.45.2

View File

@@ -0,0 +1 @@
Fixes: [55982] dmscript: IDirectMusicScript::EnumRoutine return S_FALSE by default

View File

@@ -1,4 +1,4 @@
From e222dd363cf419eecb0d5c97390b60de15f37951 Mon Sep 17 00:00:00 2001
From 914fe97f7dc20348ec3e1a2e18bcefa9b7cab463 Mon Sep 17 00:00:00 2001
From: Zebediah Figura <z.figura12@gmail.com>
Date: Fri, 8 Jun 2018 18:51:40 -0500
Subject: [PATCH] server: Add an object operation to grab the esync file
@@ -10,7 +10,7 @@ Split off to decrease patch size.
server/atom.c | 1 +
server/change.c | 1 +
server/clipboard.c | 1 +
server/completion.c | 1 +
server/completion.c | 2 ++
server/console.c | 7 +++++++
server/debugger.c | 2 ++
server/device.c | 4 ++++
@@ -25,6 +25,7 @@ Split off to decrease patch size.
server/mapping.c | 3 +++
server/mutex.c | 1 +
server/named_pipe.c | 5 +++++
server/object.c | 2 ++
server/object.h | 2 ++
server/process.c | 3 +++
server/queue.c | 2 ++
@@ -40,13 +41,13 @@ Split off to decrease patch size.
server/token.c | 1 +
server/window.c | 1 +
server/winstation.c | 2 ++
34 files changed, 68 insertions(+)
35 files changed, 71 insertions(+)
diff --git a/server/async.c b/server/async.c
index 9cb251df5ce..337bba8631b 100644
index 749c547af4f..2377c737e98 100644
--- a/server/async.c
+++ b/server/async.c
@@ -77,6 +77,7 @@ static const struct object_ops async_ops =
@@ -78,6 +78,7 @@ static const struct object_ops async_ops =
add_queue, /* add_queue */
remove_queue, /* remove_queue */
async_signaled, /* signaled */
@@ -54,7 +55,7 @@ index 9cb251df5ce..337bba8631b 100644
async_satisfied, /* satisfied */
no_signal, /* signal */
no_get_fd, /* get_fd */
@@ -676,6 +677,7 @@ static const struct object_ops iosb_ops =
@@ -698,6 +699,7 @@ static const struct object_ops iosb_ops =
no_add_queue, /* add_queue */
NULL, /* remove_queue */
NULL, /* signaled */
@@ -75,7 +76,7 @@ index ff0799f5880..d9824de8eac 100644
no_signal, /* signal */
no_get_fd, /* get_fd */
diff --git a/server/change.c b/server/change.c
index 7a806abc017..e080511bb23 100644
index f42ce066340..d0a90a99261 100644
--- a/server/change.c
+++ b/server/change.c
@@ -112,6 +112,7 @@ static const struct object_ops dir_ops =
@@ -87,7 +88,7 @@ index 7a806abc017..e080511bb23 100644
no_signal, /* signal */
dir_get_fd, /* get_fd */
diff --git a/server/clipboard.c b/server/clipboard.c
index 8118a467dd8..8b265f2dcea 100644
index 91f159bc7c9..0df7fd2f18e 100644
--- a/server/clipboard.c
+++ b/server/clipboard.c
@@ -76,6 +76,7 @@ static const struct object_ops clipboard_ops =
@@ -99,10 +100,18 @@ index 8118a467dd8..8b265f2dcea 100644
no_signal, /* signal */
no_get_fd, /* get_fd */
diff --git a/server/completion.c b/server/completion.c
index 6933195e72d..3d4be86a212 100644
index f9e68c523f1..9093132efac 100644
--- a/server/completion.c
+++ b/server/completion.c
@@ -75,6 +75,7 @@ static const struct object_ops completion_ops =
@@ -92,6 +92,7 @@ static const struct object_ops completion_wait_ops =
add_queue, /* add_queue */
remove_queue, /* remove_queue */
completion_wait_signaled, /* signaled */
+ NULL, /* get_esync_fd */
completion_wait_satisfied, /* satisfied */
no_signal, /* signal */
no_get_fd, /* get_fd */
@@ -166,6 +167,7 @@ static const struct object_ops completion_ops =
add_queue, /* add_queue */
remove_queue, /* remove_queue */
completion_signaled, /* signaled */
@@ -171,7 +180,7 @@ index b64283baf4a..1cc9eea6a50 100644
no_signal, /* signal */
console_connection_get_fd, /* get_fd */
diff --git a/server/debugger.c b/server/debugger.c
index 48adb244b09..d85a2000684 100644
index c59a0abea77..ca04d4c71ce 100644
--- a/server/debugger.c
+++ b/server/debugger.c
@@ -86,6 +86,7 @@ static const struct object_ops debug_event_ops =
@@ -227,7 +236,7 @@ index 436dac6bfe9..f730fa81afa 100644
no_signal, /* signal */
device_file_get_fd, /* get_fd */
diff --git a/server/directory.c b/server/directory.c
index 23d7eb0a2b7..bc161b9ab7e 100644
index b37ec969a9e..a6c0e292071 100644
--- a/server/directory.c
+++ b/server/directory.c
@@ -69,6 +69,7 @@ static const struct object_ops object_type_ops =
@@ -279,7 +288,7 @@ index f1b79b1b35e..c727bfdd1ba 100644
no_signal, /* signal */
no_get_fd, /* get_fd */
diff --git a/server/fd.c b/server/fd.c
index 74ad95fd4d1..4ce498ec0ef 100644
index 16328063df6..4ce78db5b33 100644
--- a/server/fd.c
+++ b/server/fd.c
@@ -172,6 +172,7 @@ static const struct object_ops fd_ops =
@@ -315,7 +324,7 @@ index 74ad95fd4d1..4ce498ec0ef 100644
no_signal, /* signal */
no_get_fd, /* get_fd */
diff --git a/server/file.c b/server/file.c
index b4f99ddc93b..1b4efb04bc5 100644
index 2a839968c25..cbef0c63383 100644
--- a/server/file.c
+++ b/server/file.c
@@ -94,6 +94,7 @@ static const struct object_ops file_ops =
@@ -327,7 +336,7 @@ index b4f99ddc93b..1b4efb04bc5 100644
no_signal, /* signal */
file_get_fd, /* get_fd */
diff --git a/server/handle.c b/server/handle.c
index 0595fdb403b..d41c7e86454 100644
index e65831b3b22..e6c5707556f 100644
--- a/server/handle.c
+++ b/server/handle.c
@@ -126,6 +126,7 @@ static const struct object_ops handle_table_ops =
@@ -339,10 +348,10 @@ index 0595fdb403b..d41c7e86454 100644
no_signal, /* signal */
no_get_fd, /* get_fd */
diff --git a/server/hook.c b/server/hook.c
index 5abdf39ad37..da351d6791f 100644
index c2d2823cd61..ab4d0e9dd31 100644
--- a/server/hook.c
+++ b/server/hook.c
@@ -80,6 +80,7 @@ static const struct object_ops hook_table_ops =
@@ -81,6 +81,7 @@ static const struct object_ops hook_table_ops =
no_add_queue, /* add_queue */
NULL, /* remove_queue */
NULL, /* signaled */
@@ -351,10 +360,10 @@ index 5abdf39ad37..da351d6791f 100644
no_signal, /* signal */
no_get_fd, /* get_fd */
diff --git a/server/mailslot.c b/server/mailslot.c
index 2d8697ec9bd..4cf9b73f784 100644
index 61eceec94e2..92fe938d3b9 100644
--- a/server/mailslot.c
+++ b/server/mailslot.c
@@ -74,6 +74,7 @@ static const struct object_ops mailslot_ops =
@@ -81,6 +81,7 @@ static const struct object_ops mailslot_ops =
add_queue, /* add_queue */
remove_queue, /* remove_queue */
default_fd_signaled, /* signaled */
@@ -362,7 +371,7 @@ index 2d8697ec9bd..4cf9b73f784 100644
no_satisfied, /* satisfied */
no_signal, /* signal */
mailslot_get_fd, /* get_fd */
@@ -133,6 +134,7 @@ static const struct object_ops mail_writer_ops =
@@ -142,6 +143,7 @@ static const struct object_ops mail_writer_ops =
no_add_queue, /* add_queue */
NULL, /* remove_queue */
NULL, /* signaled */
@@ -370,7 +379,7 @@ index 2d8697ec9bd..4cf9b73f784 100644
NULL, /* satisfied */
no_signal, /* signal */
mail_writer_get_fd, /* get_fd */
@@ -196,6 +198,7 @@ static const struct object_ops mailslot_device_ops =
@@ -207,6 +209,7 @@ static const struct object_ops mailslot_device_ops =
no_add_queue, /* add_queue */
NULL, /* remove_queue */
NULL, /* signaled */
@@ -378,7 +387,7 @@ index 2d8697ec9bd..4cf9b73f784 100644
no_satisfied, /* satisfied */
no_signal, /* signal */
no_get_fd, /* get_fd */
@@ -226,6 +229,7 @@ static const struct object_ops mailslot_device_file_ops =
@@ -237,6 +240,7 @@ static const struct object_ops mailslot_device_file_ops =
add_queue, /* add_queue */
remove_queue, /* remove_queue */
default_fd_signaled, /* signaled */
@@ -387,7 +396,7 @@ index 2d8697ec9bd..4cf9b73f784 100644
no_signal, /* signal */
mailslot_device_file_get_fd, /* get_fd */
diff --git a/server/mapping.c b/server/mapping.c
index 2d0a0b783e2..1acfb032bfd 100644
index 2bf45780375..b84bb08a77b 100644
--- a/server/mapping.c
+++ b/server/mapping.c
@@ -67,6 +67,7 @@ static const struct object_ops ranges_ops =
@@ -427,7 +436,7 @@ index af0efe72132..4785a830e92 100644
mutex_signal, /* signal */
no_get_fd, /* get_fd */
diff --git a/server/named_pipe.c b/server/named_pipe.c
index f3404a33c3b..f28cb14cb45 100644
index dd8c14b30a9..5880b601d3a 100644
--- a/server/named_pipe.c
+++ b/server/named_pipe.c
@@ -119,6 +119,7 @@ static const struct object_ops named_pipe_ops =
@@ -470,8 +479,28 @@ index f3404a33c3b..f28cb14cb45 100644
no_satisfied, /* satisfied */
no_signal, /* signal */
named_pipe_device_file_get_fd, /* get_fd */
diff --git a/server/object.c b/server/object.c
index b1665fb5372..0a4d1bede06 100644
--- a/server/object.c
+++ b/server/object.c
@@ -108,6 +108,7 @@ static const struct object_ops apc_reserve_ops =
no_add_queue, /* add_queue */
NULL, /* remove_queue */
NULL, /* signaled */
+ NULL, /* get_esync_fd */
no_satisfied, /* satisfied */
no_signal, /* signal */
no_get_fd, /* get_fd */
@@ -132,6 +133,7 @@ static const struct object_ops completion_reserve_ops =
no_add_queue, /* add_queue */
NULL, /* remove_queue */
NULL, /* signaled */
+ NULL, /* get_esync_fd */
no_satisfied, /* satisfied */
no_signal, /* signal */
no_get_fd, /* get_fd */
diff --git a/server/object.h b/server/object.h
index dfdd691601f..711af54b579 100644
index 6222e3352ed..0a65d0e3892 100644
--- a/server/object.h
+++ b/server/object.h
@@ -78,6 +78,8 @@ struct object_ops
@@ -484,7 +513,7 @@ index dfdd691601f..711af54b579 100644
void (*satisfied)(struct object *,struct wait_queue_entry *);
/* signal an object */
diff --git a/server/process.c b/server/process.c
index a0d5ea64d97..777bf7c2fe2 100644
index 49f5c75005f..dc83a089655 100644
--- a/server/process.c
+++ b/server/process.c
@@ -105,6 +105,7 @@ static const struct object_ops process_ops =
@@ -512,10 +541,10 @@ index a0d5ea64d97..777bf7c2fe2 100644
no_signal, /* signal */
no_get_fd, /* get_fd */
diff --git a/server/queue.c b/server/queue.c
index 348fdac3214..2cd8949a252 100644
index 984d466b66e..8a95055db40 100644
--- a/server/queue.c
+++ b/server/queue.c
@@ -174,6 +174,7 @@ static const struct object_ops msg_queue_ops =
@@ -165,6 +165,7 @@ static const struct object_ops msg_queue_ops =
msg_queue_add_queue, /* add_queue */
msg_queue_remove_queue, /* remove_queue */
msg_queue_signaled, /* signaled */
@@ -523,7 +552,7 @@ index 348fdac3214..2cd8949a252 100644
msg_queue_satisfied, /* satisfied */
no_signal, /* signal */
no_get_fd, /* get_fd */
@@ -211,6 +212,7 @@ static const struct object_ops thread_input_ops =
@@ -202,6 +203,7 @@ static const struct object_ops thread_input_ops =
no_add_queue, /* add_queue */
NULL, /* remove_queue */
NULL, /* signaled */
@@ -532,7 +561,7 @@ index 348fdac3214..2cd8949a252 100644
no_signal, /* signal */
no_get_fd, /* get_fd */
diff --git a/server/registry.c b/server/registry.c
index 629d67c832f..d6b39b99b22 100644
index cc9a33fff1d..c19e92c9750 100644
--- a/server/registry.c
+++ b/server/registry.c
@@ -180,6 +180,7 @@ static const struct object_ops key_ops =
@@ -544,7 +573,7 @@ index 629d67c832f..d6b39b99b22 100644
no_signal, /* signal */
no_get_fd, /* get_fd */
diff --git a/server/request.c b/server/request.c
index 7021741c765..ca83fdbd2af 100644
index dabcea68309..832a33917b4 100644
--- a/server/request.c
+++ b/server/request.c
@@ -90,6 +90,7 @@ static const struct object_ops master_socket_ops =
@@ -568,10 +597,10 @@ index 53b42a886df..e3889f24601 100644
semaphore_signal, /* signal */
no_get_fd, /* get_fd */
diff --git a/server/serial.c b/server/serial.c
index d665eb7fa35..11e204e4419 100644
index 209f2e9174e..0d49a996c2a 100644
--- a/server/serial.c
+++ b/server/serial.c
@@ -85,6 +85,7 @@ static const struct object_ops serial_ops =
@@ -91,6 +91,7 @@ static const struct object_ops serial_ops =
add_queue, /* add_queue */
remove_queue, /* remove_queue */
default_fd_signaled, /* signaled */
@@ -592,10 +621,10 @@ index 19b76d44c16..55cd6aa037e 100644
no_signal, /* signal */
no_get_fd, /* get_fd */
diff --git a/server/sock.c b/server/sock.c
index 52175b08987..77b41716cd1 100644
index d2ec882554f..44a4e3b7b15 100644
--- a/server/sock.c
+++ b/server/sock.c
@@ -451,6 +451,7 @@ static const struct object_ops sock_ops =
@@ -471,6 +471,7 @@ static const struct object_ops sock_ops =
add_queue, /* add_queue */
remove_queue, /* remove_queue */
default_fd_signaled, /* signaled */
@@ -603,7 +632,7 @@ index 52175b08987..77b41716cd1 100644
no_satisfied, /* satisfied */
no_signal, /* signal */
sock_get_fd, /* get_fd */
@@ -3481,6 +3482,7 @@ static const struct object_ops ifchange_ops =
@@ -3599,6 +3600,7 @@ static const struct object_ops ifchange_ops =
no_add_queue, /* add_queue */
NULL, /* remove_queue */
NULL, /* signaled */
@@ -611,7 +640,7 @@ index 52175b08987..77b41716cd1 100644
no_satisfied, /* satisfied */
no_signal, /* signal */
ifchange_get_fd, /* get_fd */
@@ -3702,6 +3704,7 @@ static const struct object_ops socket_device_ops =
@@ -3820,6 +3822,7 @@ static const struct object_ops socket_device_ops =
no_add_queue, /* add_queue */
NULL, /* remove_queue */
NULL, /* signaled */
@@ -620,7 +649,7 @@ index 52175b08987..77b41716cd1 100644
no_signal, /* signal */
no_get_fd, /* get_fd */
diff --git a/server/symlink.c b/server/symlink.c
index 27d48e2f994..8cb24b4ff6e 100644
index dd28efd3a75..c7f34412317 100644
--- a/server/symlink.c
+++ b/server/symlink.c
@@ -71,6 +71,7 @@ static const struct object_ops symlink_ops =
@@ -632,7 +661,7 @@ index 27d48e2f994..8cb24b4ff6e 100644
no_signal, /* signal */
no_get_fd, /* get_fd */
diff --git a/server/thread.c b/server/thread.c
index 0d5bdcf21d9..9dc38d4cce9 100644
index 506adfc0a6f..339cdfec1fa 100644
--- a/server/thread.c
+++ b/server/thread.c
@@ -96,6 +96,7 @@ static const struct object_ops thread_apc_ops =
@@ -672,10 +701,10 @@ index 96dc9d00ca1..f59902d5607 100644
no_signal, /* signal */
no_get_fd, /* get_fd */
diff --git a/server/token.c b/server/token.c
index 4df8d2e0c6e..8b4d2f0c1b1 100644
index 48ee1eca8fe..479596bdbfa 100644
--- a/server/token.c
+++ b/server/token.c
@@ -143,6 +143,7 @@ static const struct object_ops token_ops =
@@ -145,6 +145,7 @@ static const struct object_ops token_ops =
no_add_queue, /* add_queue */
NULL, /* remove_queue */
NULL, /* signaled */
@@ -684,7 +713,7 @@ index 4df8d2e0c6e..8b4d2f0c1b1 100644
no_signal, /* signal */
no_get_fd, /* get_fd */
diff --git a/server/window.c b/server/window.c
index 242e93f303a..3aa7ad4ad79 100644
index 412592fbc71..94a70ce890f 100644
--- a/server/window.c
+++ b/server/window.c
@@ -107,6 +107,7 @@ static const struct object_ops window_ops =
@@ -696,7 +725,7 @@ index 242e93f303a..3aa7ad4ad79 100644
no_signal, /* signal */
no_get_fd, /* get_fd */
diff --git a/server/winstation.c b/server/winstation.c
index 5903497d61e..7692fbe3ed2 100644
index e5f4bfec357..50fe34aa9ce 100644
--- a/server/winstation.c
+++ b/server/winstation.c
@@ -76,6 +76,7 @@ static const struct object_ops winstation_ops =
@@ -716,5 +745,5 @@ index 5903497d61e..7692fbe3ed2 100644
no_signal, /* signal */
no_get_fd, /* get_fd */
--
2.42.0
2.45.2

View File

@@ -1,4 +1,4 @@
From 7476e7b2e8680352cf2e1de7552ae58e11ff7869 Mon Sep 17 00:00:00 2001
From 0ef3de9bd3b51a1e37c50fd75ceb3db6ea24abd0 Mon Sep 17 00:00:00 2001
From: Zebediah Figura <zfigura@codeweavers.com>
Date: Mon, 6 Jul 2020 15:19:37 -0500
Subject: [PATCH] ntdll, server: Implement waiting on server-bound objects.
@@ -16,14 +16,15 @@ With this patch we break waiting on svcctl.exe.
dlls/ntdll/unix/esync.c | 84 ++++++++++++++++++++++++++++++++++++++---
server/esync.c | 16 ++++++++
server/esync.h | 1 +
server/named_pipe.c | 1 +
server/thread.c | 4 ++
4 files changed, 99 insertions(+), 6 deletions(-)
5 files changed, 100 insertions(+), 6 deletions(-)
diff --git a/dlls/ntdll/unix/esync.c b/dlls/ntdll/unix/esync.c
index 4f993689e0d..6fd195df759 100644
index 65ef70acd36..b0168f5cde5 100644
--- a/dlls/ntdll/unix/esync.c
+++ b/dlls/ntdll/unix/esync.c
@@ -199,6 +199,72 @@ static struct esync *get_cached_object( HANDLE handle )
@@ -193,6 +193,72 @@ static struct esync *get_cached_object( HANDLE handle )
return &esync_list[entry][idx];
}
@@ -96,7 +97,7 @@ index 4f993689e0d..6fd195df759 100644
NTSTATUS esync_close( HANDLE handle )
{
UINT_PTR entry, idx = handle_to_index( handle, &entry );
@@ -278,10 +344,11 @@ NTSTATUS esync_release_semaphore( HANDLE handle, ULONG count, ULONG *prev )
@@ -272,10 +338,11 @@ NTSTATUS esync_release_semaphore( HANDLE handle, ULONG count, ULONG *prev )
struct semaphore *semaphore;
uint64_t count64 = count;
ULONG current;
@@ -109,7 +110,7 @@ index 4f993689e0d..6fd195df759 100644
semaphore = obj->shm;
do
@@ -320,10 +387,11 @@ NTSTATUS esync_set_event( HANDLE handle )
@@ -314,10 +381,11 @@ NTSTATUS esync_set_event( HANDLE handle )
{
static const uint64_t value = 1;
struct esync *obj;
@@ -122,7 +123,7 @@ index 4f993689e0d..6fd195df759 100644
if (write( obj->fd, &value, sizeof(value) ) == -1)
ERR("write: %s\n", strerror(errno));
@@ -335,10 +403,11 @@ NTSTATUS esync_reset_event( HANDLE handle )
@@ -329,10 +397,11 @@ NTSTATUS esync_reset_event( HANDLE handle )
{
uint64_t value;
struct esync *obj;
@@ -135,7 +136,7 @@ index 4f993689e0d..6fd195df759 100644
if (read( obj->fd, &value, sizeof(value) ) == -1 && errno != EWOULDBLOCK && errno != EAGAIN)
ERR("read: %s\n", strerror(errno));
@@ -427,10 +496,13 @@ NTSTATUS esync_wait_objects( DWORD count, const HANDLE *handles, BOOLEAN wait_an
@@ -421,10 +490,13 @@ NTSTATUS esync_wait_objects( DWORD count, const HANDLE *handles, BOOLEAN wait_an
for (i = 0; i < count; i++)
{
@@ -151,7 +152,7 @@ index 4f993689e0d..6fd195df759 100644
}
if (has_esync && has_server)
@@ -483,7 +555,7 @@ NTSTATUS esync_wait_objects( DWORD count, const HANDLE *handles, BOOLEAN wait_an
@@ -477,7 +549,7 @@ NTSTATUS esync_wait_objects( DWORD count, const HANDLE *handles, BOOLEAN wait_an
int64_t value;
ssize_t size;
@@ -161,10 +162,10 @@ index 4f993689e0d..6fd195df759 100644
/* Don't grab the object, just check if it's signaled. */
if (fds[i].revents & POLLIN)
diff --git a/server/esync.c b/server/esync.c
index e18b76bff5b..2b9307267f9 100644
index 44214e5fe02..60e98936455 100644
--- a/server/esync.c
+++ b/server/esync.c
@@ -315,6 +315,22 @@ int esync_create_fd( int initval, int flags )
@@ -313,6 +313,22 @@ int esync_create_fd( int initval, int flags )
#endif
}
@@ -188,19 +189,31 @@ index e18b76bff5b..2b9307267f9 100644
{
struct esync *esync;
diff --git a/server/esync.h b/server/esync.h
index 6a0a367124d..1e12560ddd6 100644
index 8522d8a69ae..1241e6d9f1a 100644
--- a/server/esync.h
+++ b/server/esync.h
@@ -21,3 +21,4 @@
@@ -23,3 +23,4 @@
extern int do_esync(void);
void esync_init(void);
int esync_create_fd( int initval, int flags );
+void esync_wake_up( struct object *obj );
diff --git a/server/named_pipe.c b/server/named_pipe.c
index 68fa8953cca..1535c5188ec 100644
--- a/server/named_pipe.c
+++ b/server/named_pipe.c
@@ -344,6 +344,7 @@ static const struct object_ops named_pipe_dir_ops =
add_queue, /* add_queue */
remove_queue, /* remove_queue */
default_fd_signaled, /* signaled */
+ NULL, /* get_esync_fd */
no_satisfied, /* satisfied */
no_signal, /* signal */
named_pipe_dir_get_fd, /* get_fd */
diff --git a/server/thread.c b/server/thread.c
index 1e6f60182df..0413e889c7d 100644
index 339cdfec1fa..4262b841fca 100644
--- a/server/thread.c
+++ b/server/thread.c
@@ -51,6 +51,7 @@
@@ -50,6 +50,7 @@
#include "request.h"
#include "user.h"
#include "security.h"
@@ -208,7 +221,7 @@ index 1e6f60182df..0413e889c7d 100644
/* thread queues */
@@ -1053,6 +1054,9 @@ void wake_up( struct object *obj, int max )
@@ -1073,6 +1074,9 @@ void wake_up( struct object *obj, int max )
struct list *ptr;
int ret;
@@ -219,5 +232,5 @@ index 1e6f60182df..0413e889c7d 100644
{
struct wait_queue_entry *entry = LIST_ENTRY( ptr, struct wait_queue_entry, entry );
--
2.30.2
2.45.2

View File

@@ -1,119 +0,0 @@
From dc2aaa6a25ebccc30c7903fa68235d5971f8d6b8 Mon Sep 17 00:00:00 2001
From: Daniel Wendt <daniel.wendt@linux.com>
Date: Fri, 15 Nov 2013 12:52:37 +0100
Subject: [PATCH] gdi32: fix for rotated Arc, ArcTo, Chord and Pie drawing
problem
Wine-Bug: http://bugs.winehq.org/show_bug.cgi?id=34579
---
dlls/win32u/dibdrv/graphics.c | 80 +++++++++++++++++++++++++++++++++++
1 file changed, 80 insertions(+)
diff --git a/dlls/win32u/dibdrv/graphics.c b/dlls/win32u/dibdrv/graphics.c
index 410f29e8f19..3a6f8184009 100644
--- a/dlls/win32u/dibdrv/graphics.c
+++ b/dlls/win32u/dibdrv/graphics.c
@@ -310,6 +310,60 @@ static int get_arc_points( int arc_dir, const RECT *rect, POINT start, POINT end
return pos - count;
}
+/*
+ Check if matrix has uniform scale and shear and contains a rotation.
+*/
+static BOOL xform_has_rotate_and_uniform_scale_and_shear( const XFORM *xform )
+{
+ return xform->eM21 != 0 && xform->eM11 == xform->eM22 && -xform->eM21 == xform->eM12;
+}
+
+/*
+ Decompose rotation and translation from matrix xform.
+
+ If parameter rotation_and_translation is != NULL, save rotation and translation into it.
+
+ Note: The current implementation only works on matrixes with uniform scale and shear,
+ which has to be checked by a call to xform_has_rotate_and_uniform_scale_and_shear().
+ Hints how to get unique values for non-uniform matrixes are welcome.
+*/
+static BOOL xform_decompose_rotation_and_translation( XFORM *xform, XFORM *rotation_and_translation )
+{
+ XFORM inverse_matrix_scale;
+ XFORM origin_matrix = *xform;
+ double determinant = 0;
+
+ /* xform = xfrom-transposed * xform */
+ xform->eM11 = sqrt( xform->eM11 * xform->eM11 + xform->eM21 * xform->eM21 );
+ xform->eM22 = sqrt( xform->eM12 * xform->eM12 + xform->eM22 * xform->eM22 );
+ xform->eM12 = 0;
+ xform->eM21 = 0;
+ xform->eDx = 0;
+ xform->eDy = 0;
+
+ if ( rotation_and_translation == NULL )
+ return TRUE;
+
+ if ( xform->eM11 == 0 || xform->eM22 == 0 )
+ return FALSE;
+
+ determinant = xform->eM11 * xform->eM22;
+
+ inverse_matrix_scale.eM11 = xform->eM22 / determinant;
+ inverse_matrix_scale.eM12 = 0;
+ inverse_matrix_scale.eM21 = 0;
+ inverse_matrix_scale.eM22 = xform->eM11 / determinant;
+
+ /* calculate the rotation matrix */
+ rotation_and_translation->eM11 = inverse_matrix_scale.eM11 * origin_matrix.eM11;
+ rotation_and_translation->eM12 = inverse_matrix_scale.eM11 * origin_matrix.eM12;
+ rotation_and_translation->eM21 = inverse_matrix_scale.eM22 * origin_matrix.eM12 * -1;
+ rotation_and_translation->eM22 = inverse_matrix_scale.eM22 * origin_matrix.eM22;
+ rotation_and_translation->eDx = origin_matrix.eDx;
+ rotation_and_translation->eDy = origin_matrix.eDy;
+ return TRUE;
+}
+
/* backend for arc functions; extra_lines is -1 for ArcTo, 0 for Arc, 1 for Chord, 2 for Pie */
static BOOL draw_arc( PHYSDEV dev, INT left, INT top, INT right, INT bottom,
INT start_x, INT start_y, INT end_x, INT end_y, INT extra_lines )
@@ -322,6 +376,22 @@ static BOOL draw_arc( PHYSDEV dev, INT left, INT top, INT right, INT bottom,
BOOL ret = TRUE;
HRGN outline = 0, interior = 0;
+ BOOL exclude_rotation = FALSE;
+ XFORM old;
+ XFORM rotation_and_translation;
+ if (dc->attr->graphics_mode == GM_ADVANCED)
+ {
+ XFORM xf;
+ NtGdiGetTransform( pdev->dev.hdc, 0x203, &old );
+ xf = old;
+ if (xform_has_rotate_and_uniform_scale_and_shear( &xf ) &&
+ xform_decompose_rotation_and_translation( &xf, &rotation_and_translation ))
+ {
+ NtGdiModifyWorldTransform( pdev->dev.hdc, &xf, MWT_SET );
+ exclude_rotation = TRUE;
+ }
+ }
+
if (!get_pen_device_rect( dc, pdev, &rect, left, top, right, bottom )) return TRUE;
width = rect.right - rect.left;
@@ -355,6 +425,16 @@ static BOOL draw_arc( PHYSDEV dev, INT left, INT top, INT right, INT bottom,
points[count].y = rect.top + height / 2;
count++;
}
+
+ if (exclude_rotation == TRUE)
+ {
+ NtGdiModifyWorldTransform( pdev->dev.hdc, &rotation_and_translation, MWT_SET );
+ /* apply rotation and translation to calculated points */
+ NtGdiTransformPoints( dev->hdc, points, points, count, NtGdiLPtoDP );
+ /* restore origin matrix */
+ NtGdiModifyWorldTransform( pdev->dev.hdc, &old, MWT_SET );
+ }
+
if (count < 2)
{
free( points );
--
2.33.0

View File

@@ -1,110 +0,0 @@
From fdc9d34400af31765d20ca7b070e53d7eec710e4 Mon Sep 17 00:00:00 2001
From: Daniel Wendt <daniel.wendt@linux.com>
Date: Tue, 10 Dec 2013 14:55:32 +0100
Subject: [PATCH] gdi32: fix for rotated ellipse
Bug: http://bugs.winehq.org/show_bug.cgi?id=35331
---
dlls/win32u/dibdrv/graphics.c | 63 ++++++++++++++++++++++++-----------
1 file changed, 44 insertions(+), 19 deletions(-)
diff --git a/dlls/win32u/dibdrv/graphics.c b/dlls/win32u/dibdrv/graphics.c
index 21d2eabbc9e..1eeea1d68ea 100644
--- a/dlls/win32u/dibdrv/graphics.c
+++ b/dlls/win32u/dibdrv/graphics.c
@@ -1531,10 +1531,28 @@ BOOL dibdrv_RoundRect( PHYSDEV dev, INT left, INT top, INT right, INT bottom,
DC *dc = get_physdev_dc( dev );
RECT rect;
POINT pt[2], *points;
- int i, end, count;
+ int i, end;
+ ULONG count;
BOOL ret = TRUE;
HRGN outline = 0, interior = 0;
+ BOOL exclude_rotation_translation = FALSE;
+ XFORM old;
+ XFORM rotation_and_translation;
+
+ if (dc->attr->graphics_mode == GM_ADVANCED)
+ {
+ XFORM xf;
+ NtGdiGetTransform( pdev->dev.hdc, 0x203, &old );
+ xf = old;
+ if (xform_has_rotate_and_uniform_scale_and_shear( &xf ) &&
+ xform_decompose_rotation_and_translation( &xf, &rotation_and_translation ))
+ {
+ NtGdiModifyWorldTransform( pdev->dev.hdc, &xf, MWT_SET );
+ exclude_rotation_translation = TRUE;
+ }
+ }
+
if (!get_pen_device_rect( dc, pdev, &rect, left, top, right, bottom )) return TRUE;
pt[0].x = pt[0].y = 0;
@@ -1555,23 +1573,6 @@ BOOL dibdrv_RoundRect( PHYSDEV dev, INT left, INT top, INT right, INT bottom,
return FALSE;
}
- if (pdev->brush.style != BS_NULL &&
- !(interior = NtGdiCreateRoundRectRgn( rect.left, rect.top, rect.right + 1, rect.bottom + 1,
- ellipse_width, ellipse_height )))
- {
- free( points );
- if (outline) NtGdiDeleteObjectApp( outline );
- return FALSE;
- }
-
- /* if not using a region, paint the interior first so the outline can overlap it */
- if (interior && !outline)
- {
- ret = brush_region( pdev, interior );
- NtGdiDeleteObjectApp( interior );
- interior = 0;
- }
-
count = ellipse_first_quadrant( ellipse_width, ellipse_height, points );
if (dc->attr->arc_direction == AD_CLOCKWISE)
@@ -1615,13 +1616,37 @@ BOOL dibdrv_RoundRect( PHYSDEV dev, INT left, INT top, INT right, INT bottom,
}
count = end + 1;
+ if (exclude_rotation_translation == TRUE)
+ {
+ NtGdiModifyWorldTransform( pdev->dev.hdc, &rotation_and_translation, MWT_SET );
+ /* apply rotation and translation to calculated points */
+ NtGdiTransformPoints( dev->hdc, points, points, count, NtGdiLPtoDP );
+ /* restore origin matrix */
+ NtGdiModifyWorldTransform( pdev->dev.hdc, &old, MWT_SET );
+ }
+
+ if (pdev->brush.style != BS_NULL &&
+ !(interior = ULongToHandle(NtGdiPolyPolyDraw( ULongToHandle(ALTERNATE), points, &count, 1, NtGdiPolyPolygonRgn ))))
+ {
+ free( points );
+ if (outline) NtGdiDeleteObjectApp( outline );
+ return FALSE;
+ }
+
+ /* if not using a region, paint the interior first so the outline can overlap it */
+ if (interior && !outline)
+ {
+ ret = brush_region( pdev, interior );
+ NtGdiDeleteObjectApp( interior );
+ interior = 0;
+ }
+
reset_dash_origin( pdev );
pdev->pen_lines( pdev, count, points, TRUE, outline );
add_pen_lines_bounds( pdev, count, points, outline );
if (interior)
{
- NtGdiCombineRgn( interior, interior, outline, RGN_DIFF );
ret = brush_region( pdev, interior );
NtGdiDeleteObjectApp( interior );
}
--
2.43.0

View File

@@ -1,3 +0,0 @@
Fixes: [34579] gdi32: fix for rotated Arc, ArcTo, Chord and Pie drawing problem
Fixes: [35331] gdi32: fix for rotated ellipse
Disabled: True

View File

@@ -1,18 +1,18 @@
From 24c407828bf5606e25e2905dfb920556ec1347b8 Mon Sep 17 00:00:00 2001
From 2cf5a014dcd6f85a1afa76ad8ca6c65f2c17db39 Mon Sep 17 00:00:00 2001
From: Paul Gofman <pgofman@codeweavers.com>
Date: Tue, 14 Jul 2020 15:00:34 +0300
Subject: [PATCH] ntdll: Support x86_64 syscall emulation.
---
configure.ac | 1 +
dlls/ntdll/unix/signal_x86_64.c | 192 ++++++++++++++++++++++++++++++++
2 files changed, 193 insertions(+)
dlls/ntdll/unix/signal_x86_64.c | 195 ++++++++++++++++++++++++++++++++
2 files changed, 196 insertions(+)
diff --git a/configure.ac b/configure.ac
index bd655accac3..d581dbc1eae 100644
index ef21a4313d4..db709285f79 100644
--- a/configure.ac
+++ b/configure.ac
@@ -420,6 +420,7 @@ AC_CHECK_HEADERS(\
@@ -384,6 +384,7 @@ AC_CHECK_HEADERS(\
linux/ioctl.h \
linux/major.h \
linux/param.h \
@@ -21,7 +21,7 @@ index bd655accac3..d581dbc1eae 100644
linux/types.h \
linux/ucdrom.h \
diff --git a/dlls/ntdll/unix/signal_x86_64.c b/dlls/ntdll/unix/signal_x86_64.c
index 0c291633ac6..a28762915be 100644
index 537e4e1f60e..58397374ea4 100644
--- a/dlls/ntdll/unix/signal_x86_64.c
+++ b/dlls/ntdll/unix/signal_x86_64.c
@@ -27,6 +27,7 @@
@@ -56,7 +56,7 @@ index 0c291633ac6..a28762915be 100644
#include "ntstatus.h"
#define WIN32_NO_STATUS
#include "windef.h"
@@ -1783,6 +1794,186 @@ static inline DWORD is_privileged_instr( CONTEXT *context )
@@ -1824,6 +1835,186 @@ static inline DWORD is_privileged_instr( CONTEXT *context )
return 0;
}
@@ -243,14 +243,21 @@ index 0c291633ac6..a28762915be 100644
/***********************************************************************
* handle_interrupt
@@ -2460,6 +2651,7 @@ void signal_init_process(void)
@@ -2560,10 +2751,14 @@ void signal_init_process(void)
if (sigaction( SIGSEGV, &sig_act, NULL ) == -1) goto error;
if (sigaction( SIGILL, &sig_act, NULL ) == -1) goto error;
if (sigaction( SIGBUS, &sig_act, NULL ) == -1) goto error;
+
#ifdef __APPLE__
sig_act.sa_sigaction = sigsys_handler;
if (sigaction( SIGSYS, &sig_act, NULL ) == -1) goto error;
#endif
+
+ install_bpf(&sig_act);
+
return;
error:
--
2.43.0
2.45.2

View File

@@ -1,4 +1,4 @@
From f649ffcd8f68f82be173367b66f3c505ff75bcc3 Mon Sep 17 00:00:00 2001
From 222ae102097fd34e6ff52813d1c0a165c7165776 Mon Sep 17 00:00:00 2001
From: Sebastian Lackner <sebastian@fds-team.de>
Date: Mon, 12 Nov 2018 18:10:32 +0200
Subject: [PATCH] server: Do not signal violently terminated threads until they
@@ -27,10 +27,10 @@ Signed-off-by: Gabriel Ivăncescu <gabrielopcode@gmail.com>
2 files changed, 30 insertions(+), 3 deletions(-)
diff --git a/server/thread.c b/server/thread.c
index 55386192fe6..60cd4ee16a8 100644
index f7e5e5fabe8..506adfc0a6f 100644
--- a/server/thread.c
+++ b/server/thread.c
@@ -241,6 +241,7 @@ static inline void init_thread_structure( struct thread *thread )
@@ -246,6 +246,7 @@ static inline void init_thread_structure( struct thread *thread )
thread->token = NULL;
thread->desc = NULL;
thread->desc_len = 0;
@@ -38,7 +38,7 @@ index 55386192fe6..60cd4ee16a8 100644
thread->creation_time = current_time;
thread->exit_time = 0;
@@ -431,6 +432,7 @@ static void destroy_thread( struct object *obj )
@@ -450,6 +451,7 @@ static void destroy_thread( struct object *obj )
list_remove( &thread->entry );
cleanup_thread( thread );
release_object( thread->process );
@@ -46,7 +46,7 @@ index 55386192fe6..60cd4ee16a8 100644
if (thread->id) free_ptid( thread->id );
if (thread->token) release_object( thread->token );
}
@@ -455,7 +457,7 @@ static struct object_type *thread_get_type( struct object *obj )
@@ -467,7 +469,7 @@ static void dump_thread( struct object *obj, int verbose )
static int thread_signaled( struct object *obj, struct wait_queue_entry *entry )
{
struct thread *mythread = (struct thread *)obj;
@@ -55,7 +55,7 @@ index 55386192fe6..60cd4ee16a8 100644
}
static unsigned int thread_map_access( struct object *obj, unsigned int access )
@@ -1249,6 +1251,26 @@ int thread_get_inflight_fd( struct thread *thread, int client )
@@ -1275,6 +1277,26 @@ int thread_get_inflight_fd( struct thread *thread, int client )
return -1;
}
@@ -82,7 +82,7 @@ index 55386192fe6..60cd4ee16a8 100644
/* kill a thread on the spot */
void kill_thread( struct thread *thread, int violent_death )
{
@@ -1268,8 +1290,12 @@ void kill_thread( struct thread *thread, int violent_death )
@@ -1294,8 +1316,12 @@ void kill_thread( struct thread *thread, int violent_death )
}
kill_console_processes( thread, 0 );
abandon_mutexes( thread );
@@ -98,17 +98,17 @@ index 55386192fe6..60cd4ee16a8 100644
remove_process_thread( thread->process, thread );
release_object( thread );
diff --git a/server/thread.h b/server/thread.h
index 184fa92d250..077ab0929ba 100644
index a1bc5060bb9..edf2a825451 100644
--- a/server/thread.h
+++ b/server/thread.h
@@ -90,6 +90,7 @@ struct thread
struct list kernel_object; /* list of kernel object pointers */
@@ -93,6 +93,7 @@ struct thread
data_size_t desc_len; /* thread description length in bytes */
WCHAR *desc; /* thread description string */
struct completion_wait *completion_wait; /* completion port wait object the thread is associated with */
+ struct timeout_user *exit_poll; /* poll if the thread/process has exited already */
};
extern struct thread *current;
--
2.29.2
2.45.2

View File

@@ -1,4 +1,4 @@
From 8e45c14f92426d1a9610ef21f0f3223b7276b13f Mon Sep 17 00:00:00 2001
From cd57704c5a232a8ed0beb3b951fb0b4a06d28b43 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?R=C3=A9mi=20Bernon?= <rbernon@codeweavers.com>
Date: Fri, 8 Mar 2024 11:15:57 +0100
Subject: [PATCH] winex11: Add support for absolute position in RawMotion
@@ -9,7 +9,7 @@ Subject: [PATCH] winex11: Add support for absolute position in RawMotion
1 file changed, 35 insertions(+), 6 deletions(-)
diff --git a/dlls/winex11.drv/mouse.c b/dlls/winex11.drv/mouse.c
index b596ec546b4..59fbd2bbe52 100644
index 43df1408f39..6b0fb873fad 100644
--- a/dlls/winex11.drv/mouse.c
+++ b/dlls/winex11.drv/mouse.c
@@ -30,6 +30,7 @@
@@ -52,7 +52,7 @@ index b596ec546b4..59fbd2bbe52 100644
thread_data->x_valuator.value = 0;
thread_data->y_valuator.value = 0;
@@ -1669,6 +1680,7 @@ static BOOL map_raw_event_coords( XIRawEvent *event, INPUT *input )
@@ -1667,6 +1678,7 @@ static BOOL map_raw_event_coords( XIRawEvent *event, INPUT *input )
{
struct x11drv_thread_data *thread_data = x11drv_thread_data();
XIValuatorClassInfo *x = &thread_data->x_valuator, *y = &thread_data->y_valuator;
@@ -60,11 +60,11 @@ index b596ec546b4..59fbd2bbe52 100644
double x_value = 0, y_value = 0, x_scale, y_scale;
const double *values = event->valuators.values;
RECT virtual_rect;
@@ -1679,7 +1691,15 @@ static BOOL map_raw_event_coords( XIRawEvent *event, INPUT *input )
@@ -1677,7 +1689,15 @@ static BOOL map_raw_event_coords( XIRawEvent *event, INPUT *input )
if (!xinput2_available) return FALSE;
if (event->deviceid != thread_data->xinput2_pointer) return FALSE;
- virtual_rect = NtUserGetVirtualScreenRect( MDT_DEFAULT );
- virtual_rect = NtUserGetVirtualScreenRect( MDT_RAW_DPI );
+ if (x->mode == XIModeRelative && y->mode == XIModeRelative)
+ input->mi.dwFlags &= ~absolute_flags;
+ else if (x->mode == XIModeAbsolute && y->mode == XIModeAbsolute)
@@ -73,11 +73,11 @@ index b596ec546b4..59fbd2bbe52 100644
+ FIXME( "Unsupported relative/absolute X/Y axis mismatch\n." );
+
+ if (input->mi.dwFlags & MOUSEEVENTF_VIRTUALDESK) SetRect( &virtual_rect, 0, 0, UINT16_MAX, UINT16_MAX );
+ else virtual_rect = NtUserGetVirtualScreenRect( MDT_DEFAULT );
+ else virtual_rect = NtUserGetVirtualScreenRect( MDT_RAW_DPI );
if (x->max <= x->min) x_scale = 1;
else x_scale = (virtual_rect.right - virtual_rect.left) / (x->max - x->min);
@@ -1692,17 +1712,26 @@ static BOOL map_raw_event_coords( XIRawEvent *event, INPUT *input )
@@ -1690,17 +1710,26 @@ static BOOL map_raw_event_coords( XIRawEvent *event, INPUT *input )
if (i == x->number)
{
x_value = *values;

View File

@@ -1,4 +1,4 @@
From a0452d319eecec33d0e130e19e9d1993b52caa2f Mon Sep 17 00:00:00 2001
From 03ca1a439ace6f14b8551a5e9a83dec83872577f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?R=C3=A9mi=20Bernon?= <rbernon@codeweavers.com>
Date: Thu, 19 Dec 2019 22:34:44 +0100
Subject: [PATCH] winex11: Keep track of mouse device and pointer button
@@ -17,10 +17,10 @@ Original patch by Andrew Eikum <aeikum@codeweavers.com>.
5 files changed, 114 insertions(+), 6 deletions(-)
diff --git a/configure.ac b/configure.ac
index d95ff178367..5d38e874089 100644
index d7d8411c1a3..720e016d0af 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1194,6 +1194,7 @@ then
@@ -1203,6 +1203,7 @@ then
dnl *** All of the following tests require X11/Xlib.h
AC_CHECK_HEADERS([X11/extensions/shape.h \
@@ -29,10 +29,10 @@ index d95ff178367..5d38e874089 100644
X11/extensions/XShm.h \
X11/extensions/Xfixes.h \
diff --git a/dlls/winex11.drv/keyboard.c b/dlls/winex11.drv/keyboard.c
index 23f07b851a7..130b7e516a2 100644
index bb5bf6220e1..af0bdb54205 100644
--- a/dlls/winex11.drv/keyboard.c
+++ b/dlls/winex11.drv/keyboard.c
@@ -1838,11 +1838,7 @@ BOOL X11DRV_ActivateKeyboardLayout(HKL hkl, UINT flags)
@@ -1820,11 +1820,7 @@ BOOL X11DRV_ActivateKeyboardLayout(HKL hkl, UINT flags)
return TRUE;
}
@@ -45,7 +45,7 @@ index 23f07b851a7..130b7e516a2 100644
{
HWND hwnd;
@@ -1856,6 +1852,24 @@ BOOL X11DRV_MappingNotify( HWND dummy, XEvent *event )
@@ -1838,6 +1834,24 @@ BOOL X11DRV_MappingNotify( HWND dummy, XEvent *event )
return TRUE;
}
@@ -71,7 +71,7 @@ index 23f07b851a7..130b7e516a2 100644
/***********************************************************************
* VkKeyScanEx (X11DRV.@)
diff --git a/dlls/winex11.drv/mouse.c b/dlls/winex11.drv/mouse.c
index d3c97468fdb..5a5ec51e370 100644
index e513e302351..23ceb5eb00a 100644
--- a/dlls/winex11.drv/mouse.c
+++ b/dlls/winex11.drv/mouse.c
@@ -31,6 +31,9 @@
@@ -175,7 +175,7 @@ index d3c97468fdb..5a5ec51e370 100644
#ifdef HAVE_X11_EXTENSIONS_XINPUT2_H
/***********************************************************************
* update_relative_valuators
@@ -1674,6 +1754,8 @@ static BOOL X11DRV_DeviceChanged( XGenericEventCookie *xev )
@@ -1671,6 +1751,8 @@ static BOOL X11DRV_DeviceChanged( XGenericEventCookie *xev )
if (event->deviceid != data->xinput2_pointer) return FALSE;
update_relative_valuators( event->classes, event->num_classes );
@@ -184,7 +184,7 @@ index d3c97468fdb..5a5ec51e370 100644
return TRUE;
}
@@ -1822,7 +1904,7 @@ static BOOL X11DRV_TouchEvent( HWND hwnd, XGenericEventCookie *xev )
@@ -1819,7 +1901,7 @@ static BOOL X11DRV_TouchEvent( HWND hwnd, XGenericEventCookie *xev )
*/
void x11drv_xinput2_load(void)
{
@@ -193,7 +193,7 @@ index d3c97468fdb..5a5ec51e370 100644
int event, error;
void *libxi_handle = dlopen( SONAME_LIBXI, RTLD_NOW );
@@ -1838,11 +1920,20 @@ void x11drv_xinput2_load(void)
@@ -1835,11 +1917,20 @@ void x11drv_xinput2_load(void)
return; \
}
@@ -215,22 +215,22 @@ index d3c97468fdb..5a5ec51e370 100644
xinput2_available = XQueryExtension( gdi_display, "XInputExtension", &xinput2_opcode, &event, &error );
diff --git a/dlls/winex11.drv/x11drv.h b/dlls/winex11.drv/x11drv.h
index 70ef0a112ac..a56eb8b0046 100644
index 1e669f9fe61..a6cfd5a483e 100644
--- a/dlls/winex11.drv/x11drv.h
+++ b/dlls/winex11.drv/x11drv.h
@@ -682,6 +682,7 @@ extern void retry_grab_clipping_window(void);
@@ -687,6 +687,7 @@ extern void reapply_cursor_clipping(void);
extern void ungrab_clipping_window(void);
extern void move_resize_window( HWND hwnd, int dir );
extern void X11DRV_InitKeyboard( Display *display );
+extern void X11DRV_InitMouse( Display *display );
extern BOOL process_events( Display *display, Bool (*filter)(Display*, XEvent*, XPointer), ULONG_PTR arg );
extern BOOL X11DRV_ProcessEvents( DWORD mask );
extern HWND *build_hwnd_list(void);
diff --git a/dlls/winex11.drv/x11drv_main.c b/dlls/winex11.drv/x11drv_main.c
index c9e0d43c9ce..930f3a1c088 100644
index abc14032c61..d95c4761529 100644
--- a/dlls/winex11.drv/x11drv_main.c
+++ b/dlls/winex11.drv/x11drv_main.c
@@ -680,6 +680,7 @@ static NTSTATUS x11drv_init( void *arg )
@@ -672,6 +672,7 @@ static NTSTATUS x11drv_init( void *arg )
XkbUseExtension( gdi_display, NULL, NULL );
X11DRV_InitKeyboard( gdi_display );
@@ -239,5 +239,5 @@ index c9e0d43c9ce..930f3a1c088 100644
init_user_driver();
--
2.43.0
2.45.2

View File

@@ -0,0 +1,478 @@
From 9f1222c0cc241c9a3256403a637d16ffd26587fc Mon Sep 17 00:00:00 2001
From: Alistair Leslie-Hughes <leslie_alistair@hotmail.com>
Date: Thu, 24 Oct 2024 07:08:51 +1100
Subject: [PATCH] Updated vkd3d to 91701f83035c0d67d1ab917e0f6b73f91e8583d4.
---
libs/vkd3d/libs/vkd3d-shader/d3dbc.c | 12 --
libs/vkd3d/libs/vkd3d-shader/dxil.c | 15 ---
libs/vkd3d/libs/vkd3d-shader/tpf.c | 12 --
.../libs/vkd3d-shader/vkd3d_shader_main.c | 105 +++++++++---------
.../libs/vkd3d-shader/vkd3d_shader_private.h | 6 -
libs/vkd3d/libs/vkd3d/device.c | 65 ++++++-----
libs/vkd3d/libs/vkd3d/resource.c | 14 ++-
libs/vkd3d/libs/vkd3d/state.c | 21 ++--
libs/vkd3d/libs/vkd3d/vkd3d_private.h | 23 ++--
9 files changed, 123 insertions(+), 150 deletions(-)
diff --git a/libs/vkd3d/libs/vkd3d-shader/d3dbc.c b/libs/vkd3d/libs/vkd3d-shader/d3dbc.c
index bbebf86e6d5..9e2eacbcfa6 100644
--- a/libs/vkd3d/libs/vkd3d-shader/d3dbc.c
+++ b/libs/vkd3d/libs/vkd3d-shader/d3dbc.c
@@ -1391,18 +1391,6 @@ int d3dbc_parse(const struct vkd3d_shader_compile_info *compile_info, uint64_t c
if (ret < 0)
{
- WARN("Failed to parse shader.\n");
- vsir_program_cleanup(program);
- return ret;
- }
-
- if ((ret = vkd3d_shader_parser_validate(&sm1.p, config_flags)) < 0)
- {
- WARN("Failed to validate shader after parsing, ret %d.\n", ret);
-
- if (TRACE_ON())
- vsir_program_trace(program);
-
vsir_program_cleanup(program);
return ret;
}
diff --git a/libs/vkd3d/libs/vkd3d-shader/dxil.c b/libs/vkd3d/libs/vkd3d-shader/dxil.c
index 570af5eca5a..3235a278769 100644
--- a/libs/vkd3d/libs/vkd3d-shader/dxil.c
+++ b/libs/vkd3d/libs/vkd3d-shader/dxil.c
@@ -10603,22 +10603,7 @@ int dxil_parse(const struct vkd3d_shader_compile_info *compile_info, uint64_t co
vkd3d_free(byte_code);
if (ret < 0)
- {
- WARN("Failed to parse shader.\n");
- return ret;
- }
-
- if ((ret = vkd3d_shader_parser_validate(&sm6.p, config_flags)) < 0)
- {
- WARN("Failed to validate shader after parsing, ret %d.\n", ret);
-
- if (TRACE_ON())
- vsir_program_trace(program);
-
- sm6_parser_cleanup(&sm6);
- vsir_program_cleanup(program);
return ret;
- }
sm6_parser_cleanup(&sm6);
diff --git a/libs/vkd3d/libs/vkd3d-shader/tpf.c b/libs/vkd3d/libs/vkd3d-shader/tpf.c
index f96d300676c..c937b245559 100644
--- a/libs/vkd3d/libs/vkd3d-shader/tpf.c
+++ b/libs/vkd3d/libs/vkd3d-shader/tpf.c
@@ -2964,22 +2964,10 @@ int tpf_parse(const struct vkd3d_shader_compile_info *compile_info, uint64_t con
if (sm4.p.failed)
{
- WARN("Failed to parse shader.\n");
vsir_program_cleanup(program);
return VKD3D_ERROR_INVALID_SHADER;
}
- if ((ret = vkd3d_shader_parser_validate(&sm4.p, config_flags)) < 0)
- {
- WARN("Failed to validate shader after parsing, ret %d.\n", ret);
-
- if (TRACE_ON())
- vsir_program_trace(program);
-
- vsir_program_cleanup(program);
- return ret;
- }
-
return VKD3D_OK;
}
diff --git a/libs/vkd3d/libs/vkd3d-shader/vkd3d_shader_main.c b/libs/vkd3d/libs/vkd3d-shader/vkd3d_shader_main.c
index ca012d4948a..3355e18b88e 100644
--- a/libs/vkd3d/libs/vkd3d-shader/vkd3d_shader_main.c
+++ b/libs/vkd3d/libs/vkd3d-shader/vkd3d_shader_main.c
@@ -489,13 +489,13 @@ static void vkd3d_shader_dump_shader(const struct shader_dump_data *dump_data,
if ((f = fopen(filename, "wb")))
{
if (fwrite(data, 1, size, f) != size)
- ERR("Failed to write shader to %s.\n", filename);
+ WARN("Failed to write shader to %s.\n", filename);
if (fclose(f))
- ERR("Failed to close stream %s.\n", filename);
+ WARN("Failed to close stream %s.\n", filename);
}
else
{
- ERR("Failed to open %s for dumping shader.\n", filename);
+ WARN("Failed to open %s for dumping shader.\n", filename);
}
}
@@ -680,6 +680,50 @@ static int vkd3d_shader_validate_compile_info(const struct vkd3d_shader_compile_
return VKD3D_OK;
}
+static enum vkd3d_result vsir_parse(const struct vkd3d_shader_compile_info *compile_info, uint64_t config_flags,
+ struct vkd3d_shader_message_context *message_context, struct vsir_program *program)
+{
+ enum vkd3d_result ret;
+
+ switch (compile_info->source_type)
+ {
+ case VKD3D_SHADER_SOURCE_D3D_BYTECODE:
+ ret = d3dbc_parse(compile_info, config_flags, message_context, program);
+ break;
+
+ case VKD3D_SHADER_SOURCE_DXBC_TPF:
+ ret = tpf_parse(compile_info, config_flags, message_context, program);
+ break;
+
+ case VKD3D_SHADER_SOURCE_DXBC_DXIL:
+ ret = dxil_parse(compile_info, config_flags, message_context, program);
+ break;
+
+ default:
+ ERR("Unsupported source type %#x.\n", compile_info->source_type);
+ ret = VKD3D_ERROR_INVALID_ARGUMENT;
+ break;
+ }
+
+ if (ret < 0)
+ {
+ WARN("Failed to parse shader.\n");
+ return ret;
+ }
+
+ if ((ret = vsir_program_validate(program, config_flags, compile_info->source_name, message_context)) < 0)
+ {
+ WARN("Failed to validate shader after parsing, ret %d.\n", ret);
+
+ if (TRACE_ON())
+ vsir_program_trace(program);
+
+ vsir_program_cleanup(program);
+ }
+
+ return ret;
+}
+
void vkd3d_shader_free_messages(char *messages)
{
TRACE("messages %p.\n", messages);
@@ -1578,31 +1622,7 @@ int vkd3d_shader_scan(const struct vkd3d_shader_compile_info *compile_info, char
uint64_t config_flags = vkd3d_shader_init_config_flags();
struct vsir_program program;
- switch (compile_info->source_type)
- {
- case VKD3D_SHADER_SOURCE_D3D_BYTECODE:
- ret = d3dbc_parse(compile_info, config_flags, &message_context, &program);
- break;
-
- case VKD3D_SHADER_SOURCE_DXBC_TPF:
- ret = tpf_parse(compile_info, config_flags, &message_context, &program);
- break;
-
- case VKD3D_SHADER_SOURCE_DXBC_DXIL:
- ret = dxil_parse(compile_info, config_flags, &message_context, &program);
- break;
-
- default:
- ERR("Unsupported source type %#x.\n", compile_info->source_type);
- ret = VKD3D_ERROR_INVALID_ARGUMENT;
- break;
- }
-
- if (ret < 0)
- {
- WARN("Failed to parse shader.\n");
- }
- else
+ if (!(ret = vsir_parse(compile_info, config_flags, &message_context, &program)))
{
ret = vsir_program_scan(&program, compile_info, &message_context, NULL);
vsir_program_cleanup(&program);
@@ -1719,38 +1739,15 @@ int vkd3d_shader_compile(const struct vkd3d_shader_compile_info *compile_info,
uint64_t config_flags = vkd3d_shader_init_config_flags();
struct vsir_program program;
- switch (compile_info->source_type)
- {
- case VKD3D_SHADER_SOURCE_D3D_BYTECODE:
- ret = d3dbc_parse(compile_info, config_flags, &message_context, &program);
- break;
-
- case VKD3D_SHADER_SOURCE_DXBC_TPF:
- ret = tpf_parse(compile_info, config_flags, &message_context, &program);
- break;
-
- case VKD3D_SHADER_SOURCE_DXBC_DXIL:
- ret = dxil_parse(compile_info, config_flags, &message_context, &program);
- break;
-
- default:
- ERR("Unsupported source type %#x.\n", compile_info->source_type);
- ret = VKD3D_ERROR_INVALID_ARGUMENT;
- break;
- }
-
- if (ret < 0)
- {
- WARN("Failed to parse shader.\n");
- }
- else
+ if (!(ret = vsir_parse(compile_info, config_flags, &message_context, &program)))
{
ret = vsir_program_compile(&program, config_flags, compile_info, out, &message_context);
vsir_program_cleanup(&program);
}
}
- vkd3d_shader_dump_shader(&dump_data, out->code, out->size, false);
+ if (ret >= 0)
+ vkd3d_shader_dump_shader(&dump_data, out->code, out->size, false);
vkd3d_shader_message_context_trace_messages(&message_context);
if (!vkd3d_shader_message_context_copy_messages(&message_context, messages))
diff --git a/libs/vkd3d/libs/vkd3d-shader/vkd3d_shader_private.h b/libs/vkd3d/libs/vkd3d-shader/vkd3d_shader_private.h
index d6c68155ee7..5ae938e0525 100644
--- a/libs/vkd3d/libs/vkd3d-shader/vkd3d_shader_private.h
+++ b/libs/vkd3d/libs/vkd3d-shader/vkd3d_shader_private.h
@@ -1477,12 +1477,6 @@ void vkd3d_shader_parser_init(struct vkd3d_shader_parser *parser, struct vsir_pr
void vkd3d_shader_parser_warning(struct vkd3d_shader_parser *parser,
enum vkd3d_shader_error error, const char *format, ...) VKD3D_PRINTF_FUNC(3, 4);
-static inline enum vkd3d_result vkd3d_shader_parser_validate(struct vkd3d_shader_parser *parser, uint64_t config_flags)
-{
- return vsir_program_validate(parser->program, config_flags,
- parser->location.source_name, parser->message_context);
-}
-
struct vkd3d_shader_descriptor_info1
{
enum vkd3d_shader_descriptor_type type;
diff --git a/libs/vkd3d/libs/vkd3d/device.c b/libs/vkd3d/libs/vkd3d/device.c
index fd0ca20838f..54a39e18a0f 100644
--- a/libs/vkd3d/libs/vkd3d/device.c
+++ b/libs/vkd3d/libs/vkd3d/device.c
@@ -136,7 +136,8 @@ static HRESULT vkd3d_create_vk_descriptor_heap_layout(struct d3d12_device *devic
VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
};
- if (device->vk_info.EXT_mutable_descriptor_type && index && index != VKD3D_SET_INDEX_UAV_COUNTER
+ if (device->vk_info.EXT_mutable_descriptor_type
+ && index != VKD3D_SET_INDEX_MUTABLE && index != VKD3D_SET_INDEX_UAV_COUNTER
&& device->vk_descriptor_heap_layouts[index].applicable_heap_type == D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV)
{
device->vk_descriptor_heap_layouts[index].vk_set_layout = VK_NULL_HANDLE;
@@ -144,7 +145,7 @@ static HRESULT vkd3d_create_vk_descriptor_heap_layout(struct d3d12_device *devic
}
binding.binding = 0;
- binding.descriptorType = (device->vk_info.EXT_mutable_descriptor_type && !index)
+ binding.descriptorType = (device->vk_info.EXT_mutable_descriptor_type && index == VKD3D_SET_INDEX_MUTABLE)
? VK_DESCRIPTOR_TYPE_MUTABLE_EXT : device->vk_descriptor_heap_layouts[index].type;
binding.descriptorCount = device->vk_descriptor_heap_layouts[index].count;
binding.stageFlags = VK_SHADER_STAGE_ALL;
@@ -200,14 +201,20 @@ static HRESULT vkd3d_vk_descriptor_heap_layouts_init(struct d3d12_device *device
{
static const struct vkd3d_vk_descriptor_heap_layout vk_descriptor_heap_layouts[VKD3D_SET_INDEX_COUNT] =
{
- {VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, true, D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV},
- {VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER, true, D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV},
- {VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, false, D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV},
- {VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, true, D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV},
- {VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, false, D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV},
- {VK_DESCRIPTOR_TYPE_SAMPLER, false, D3D12_DESCRIPTOR_HEAP_TYPE_SAMPLER},
- /* UAV counters */
- {VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, true, D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV},
+ [VKD3D_SET_INDEX_UNIFORM_BUFFER] =
+ {VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, true, D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV},
+ [VKD3D_SET_INDEX_UNIFORM_TEXEL_BUFFER] =
+ {VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER, true, D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV},
+ [VKD3D_SET_INDEX_SAMPLED_IMAGE] =
+ {VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, false, D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV},
+ [VKD3D_SET_INDEX_STORAGE_TEXEL_BUFFER] =
+ {VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, true, D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV},
+ [VKD3D_SET_INDEX_STORAGE_IMAGE] =
+ {VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, false, D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV},
+ [VKD3D_SET_INDEX_SAMPLER] =
+ {VK_DESCRIPTOR_TYPE_SAMPLER, false, D3D12_DESCRIPTOR_HEAP_TYPE_SAMPLER},
+ [VKD3D_SET_INDEX_UAV_COUNTER] =
+ {VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, true, D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV},
};
const struct vkd3d_device_descriptor_limits *limits = &device->vk_info.descriptor_limits;
enum vkd3d_vk_descriptor_set_index set;
@@ -1918,24 +1925,26 @@ static HRESULT vkd3d_init_device_caps(struct d3d12_device *device,
&& descriptor_indexing->descriptorBindingUniformTexelBufferUpdateAfterBind
&& descriptor_indexing->descriptorBindingStorageTexelBufferUpdateAfterBind;
- /* Many Vulkan implementations allow up to 8 descriptor sets. Unfortunately
- * using vkd3d with Vulkan heaps and push descriptors currently requires up
- * to 9 descriptor sets (up to one for the push descriptors, up to one for
- * the static samplers and seven for Vulkan heaps, one for each needed
- * descriptor type). If we detect such situation, we disable push
- * descriptors, which allows us to stay within the limits (not doing so is
- * fatal on many implmentations).
- *
- * It is possible that a different strategy might be used. For example, we
- * could move the static samplers to one of the seven Vulkan heaps sets. Or
- * we could decide whether to create the push descriptor set when creating
- * the root signature, depending on whether there are static samplers or
- * not. */
- if (device->vk_info.device_limits.maxBoundDescriptorSets == 8 && device->use_vk_heaps
- && device->vk_info.KHR_push_descriptor)
- {
- TRACE("Disabling VK_KHR_push_descriptor to save a descriptor set.\n");
- device->vk_info.KHR_push_descriptor = VK_FALSE;
+ if (device->use_vk_heaps && device->vk_info.KHR_push_descriptor)
+ {
+ /* VKD3D_SET_INDEX_COUNT for the Vulkan heaps, one for the push
+ * descriptors set and one for the static samplers set. */
+ unsigned int descriptor_set_count = VKD3D_SET_INDEX_COUNT + 2;
+
+ /* A mutable descriptor set can replace all those that should otherwise
+ * back the SRV-UAV-CBV descriptor heap. */
+ if (device->vk_info.EXT_mutable_descriptor_type)
+ descriptor_set_count -= VKD3D_SET_INDEX_COUNT - (VKD3D_SET_INDEX_MUTABLE + 1);
+
+ /* For many Vulkan implementations maxBoundDescriptorSets == 8; also,
+ * if mutable descriptors are not available the descriptor set count
+ * will be 9; so saving a descriptor set is going to be often
+ * significant. */
+ if (descriptor_set_count > device->vk_info.device_limits.maxBoundDescriptorSets)
+ {
+ WARN("Disabling VK_KHR_push_descriptor to save a descriptor set.\n");
+ device->vk_info.KHR_push_descriptor = VK_FALSE;
+ }
}
if (device->use_vk_heaps)
diff --git a/libs/vkd3d/libs/vkd3d/resource.c b/libs/vkd3d/libs/vkd3d/resource.c
index 6d6820d3752..1f7d90eb95f 100644
--- a/libs/vkd3d/libs/vkd3d/resource.c
+++ b/libs/vkd3d/libs/vkd3d/resource.c
@@ -2498,7 +2498,7 @@ static void d3d12_desc_write_vk_heap_null_descriptor(struct d3d12_descriptor_hea
enum vkd3d_vk_descriptor_set_index set, end;
unsigned int i = writes->count;
- end = device->vk_info.EXT_mutable_descriptor_type ? VKD3D_SET_INDEX_UNIFORM_BUFFER
+ end = device->vk_info.EXT_mutable_descriptor_type ? VKD3D_SET_INDEX_MUTABLE
: VKD3D_SET_INDEX_STORAGE_IMAGE;
/* Binding a shader with the wrong null descriptor type works in Windows.
* To support that here we must write one to all applicable Vulkan sets. */
@@ -4250,7 +4250,8 @@ static HRESULT d3d12_descriptor_heap_create_descriptor_pool(struct d3d12_descrip
if (device->vk_descriptor_heap_layouts[set].applicable_heap_type == desc->Type
&& device->vk_descriptor_heap_layouts[set].vk_set_layout)
{
- pool_sizes[pool_desc.poolSizeCount].type = (device->vk_info.EXT_mutable_descriptor_type && !set)
+ pool_sizes[pool_desc.poolSizeCount].type =
+ (device->vk_info.EXT_mutable_descriptor_type && set == VKD3D_SET_INDEX_MUTABLE)
? VK_DESCRIPTOR_TYPE_MUTABLE_EXT : device->vk_descriptor_heap_layouts[set].type;
pool_sizes[pool_desc.poolSizeCount++].descriptorCount = desc->NumDescriptors;
}
@@ -4280,11 +4281,12 @@ static HRESULT d3d12_descriptor_heap_create_descriptor_set(struct d3d12_descript
if (!device->vk_descriptor_heap_layouts[set].vk_set_layout)
{
- /* Set 0 uses mutable descriptors, and this set is unused. */
- if (!descriptor_heap->vk_descriptor_sets[0].vk_set
- && FAILED(hr = d3d12_descriptor_heap_create_descriptor_set(descriptor_heap, device, 0)))
+ /* Mutable descriptors are in use, and this set is unused. */
+ if (!descriptor_heap->vk_descriptor_sets[VKD3D_SET_INDEX_MUTABLE].vk_set
+ && FAILED(hr = d3d12_descriptor_heap_create_descriptor_set(descriptor_heap,
+ device, VKD3D_SET_INDEX_MUTABLE)))
return hr;
- descriptor_set->vk_set = descriptor_heap->vk_descriptor_sets[0].vk_set;
+ descriptor_set->vk_set = descriptor_heap->vk_descriptor_sets[VKD3D_SET_INDEX_MUTABLE].vk_set;
descriptor_set->vk_type = device->vk_descriptor_heap_layouts[set].type;
return S_OK;
}
diff --git a/libs/vkd3d/libs/vkd3d/state.c b/libs/vkd3d/libs/vkd3d/state.c
index 8e5ec70a577..e7476a01bd7 100644
--- a/libs/vkd3d/libs/vkd3d/state.c
+++ b/libs/vkd3d/libs/vkd3d/state.c
@@ -1016,7 +1016,7 @@ static void vkd3d_descriptor_heap_binding_from_descriptor_range(const struct d3d
}
else
{
- binding->set = 0;
+ binding->set = VKD3D_SET_INDEX_MUTABLE;
descriptor_set_size = descriptor_limits->sampled_image_max_descriptors;
}
}
@@ -1483,21 +1483,24 @@ static unsigned int d3d12_root_signature_copy_descriptor_set_layouts(const struc
{
const struct d3d12_device *device = root_signature->device;
enum vkd3d_vk_descriptor_set_index set;
+ VkDescriptorSetLayout vk_set_layout;
unsigned int i;
for (i = 0; i < root_signature->vk_set_count; ++i)
vk_set_layouts[i] = root_signature->descriptor_set_layouts[i].vk_layout;
- if (device->use_vk_heaps)
+ if (!device->use_vk_heaps)
+ return i;
+
+ for (set = 0; set < ARRAY_SIZE(device->vk_descriptor_heap_layouts); ++set)
{
- VkDescriptorSetLayout mutable_layout = device->vk_descriptor_heap_layouts[0].vk_set_layout;
+ vk_set_layout = device->vk_descriptor_heap_layouts[set].vk_set_layout;
- for (set = 0; set < ARRAY_SIZE(device->vk_descriptor_heap_layouts); ++set)
- {
- VkDescriptorSetLayout vk_set_layout = device->vk_descriptor_heap_layouts[set].vk_set_layout;
- /* All layouts must be valid, so if null, just set it to the mutable one. */
- vk_set_layouts[i++] = vk_set_layout ? vk_set_layout : mutable_layout;
- }
+ VKD3D_ASSERT(vk_set_layout);
+ vk_set_layouts[i++] = vk_set_layout;
+
+ if (device->vk_info.EXT_mutable_descriptor_type && set == VKD3D_SET_INDEX_MUTABLE)
+ break;
}
return i;
diff --git a/libs/vkd3d/libs/vkd3d/vkd3d_private.h b/libs/vkd3d/libs/vkd3d/vkd3d_private.h
index e6d477a5c12..97a99782d6a 100644
--- a/libs/vkd3d/libs/vkd3d/vkd3d_private.h
+++ b/libs/vkd3d/libs/vkd3d/vkd3d_private.h
@@ -772,14 +772,21 @@ void d3d12_dsv_desc_create_dsv(struct d3d12_dsv_desc *dsv_desc, struct d3d12_dev
enum vkd3d_vk_descriptor_set_index
{
- VKD3D_SET_INDEX_UNIFORM_BUFFER = 0,
- VKD3D_SET_INDEX_UNIFORM_TEXEL_BUFFER = 1,
- VKD3D_SET_INDEX_SAMPLED_IMAGE = 2,
- VKD3D_SET_INDEX_STORAGE_TEXEL_BUFFER = 3,
- VKD3D_SET_INDEX_STORAGE_IMAGE = 4,
- VKD3D_SET_INDEX_SAMPLER = 5,
- VKD3D_SET_INDEX_UAV_COUNTER = 6,
- VKD3D_SET_INDEX_COUNT = 7
+ VKD3D_SET_INDEX_SAMPLER,
+ VKD3D_SET_INDEX_UAV_COUNTER,
+ VKD3D_SET_INDEX_MUTABLE,
+
+ /* These are used when mutable descriptors are not available to back
+ * SRV-UAV-CBV descriptor heaps. They must stay at the end of this
+ * enumeration, so that they can be ignored when mutable descriptors are
+ * used. */
+ VKD3D_SET_INDEX_UNIFORM_BUFFER = VKD3D_SET_INDEX_MUTABLE,
+ VKD3D_SET_INDEX_UNIFORM_TEXEL_BUFFER,
+ VKD3D_SET_INDEX_SAMPLED_IMAGE,
+ VKD3D_SET_INDEX_STORAGE_TEXEL_BUFFER,
+ VKD3D_SET_INDEX_STORAGE_IMAGE,
+
+ VKD3D_SET_INDEX_COUNT
};
extern const enum vkd3d_vk_descriptor_set_index vk_descriptor_set_index_table[];
--
2.45.2

Some files were not shown because too many files have changed in this diff Show More