You've already forked wine-staging
mirror of
https://gitlab.winehq.org/wine/wine-staging.git
synced 2025-04-13 14:42:51 -07:00
Compare commits
6 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
5a1b9d5093 | ||
|
c1f62cba4d | ||
|
02792d0328 | ||
|
44f9ec9761 | ||
|
81492f7156 | ||
|
683813d151 |
@@ -1,4 +1,4 @@
|
||||
From e222dd363cf419eecb0d5c97390b60de15f37951 Mon Sep 17 00:00:00 2001
|
||||
From 0c97689e30108869e0ffc5fb7a13edcb42de7450 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
|
||||
@@ -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, 70 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 =
|
||||
@@ -171,7 +172,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 +228,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 +280,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 +316,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 +328,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 +340,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 +352,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 +363,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 +371,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 +379,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 +388,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 +428,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 +471,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 +505,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 +533,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 +544,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 +553,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 +565,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 +589,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 +613,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 +624,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 +632,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 +641,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 +653,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 cf69b3b53c3..4b537586e31 100644
|
||||
--- a/server/thread.c
|
||||
+++ b/server/thread.c
|
||||
@@ -96,6 +96,7 @@ static const struct object_ops thread_apc_ops =
|
||||
@@ -672,10 +693,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 +705,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 +717,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 +737,5 @@ index 5903497d61e..7692fbe3ed2 100644
|
||||
no_signal, /* signal */
|
||||
no_get_fd, /* get_fd */
|
||||
--
|
||||
2.42.0
|
||||
2.45.2
|
||||
|
||||
|
@@ -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
|
||||
|
@@ -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
|
||||
|
@@ -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
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,386 @@
|
||||
From 4b1bc5d293eca9de7f1f00f3afac32e329364515 Mon Sep 17 00:00:00 2001
|
||||
From: Alistair Leslie-Hughes <leslie_alistair@hotmail.com>
|
||||
Date: Thu, 10 Oct 2024 07:16:15 +1100
|
||||
Subject: [PATCH] Updated vkd3d to 9cb4207c92ec3ee05fce15580c89f2e5146354db.
|
||||
|
||||
---
|
||||
libs/vkd3d/libs/vkd3d-shader/dxil.c | 15 +++
|
||||
libs/vkd3d/libs/vkd3d-shader/glsl.c | 101 ++++++++++++++++--
|
||||
libs/vkd3d/libs/vkd3d-shader/ir.c | 40 +++++++
|
||||
libs/vkd3d/libs/vkd3d-shader/spirv.c | 24 ++---
|
||||
libs/vkd3d/libs/vkd3d-shader/tpf.c | 15 +++
|
||||
.../libs/vkd3d-shader/vkd3d_shader_main.c | 2 +
|
||||
.../libs/vkd3d-shader/vkd3d_shader_private.h | 1 +
|
||||
7 files changed, 173 insertions(+), 25 deletions(-)
|
||||
|
||||
diff --git a/libs/vkd3d/libs/vkd3d-shader/dxil.c b/libs/vkd3d/libs/vkd3d-shader/dxil.c
|
||||
index c66b059325a..5db9d6da063 100644
|
||||
--- a/libs/vkd3d/libs/vkd3d-shader/dxil.c
|
||||
+++ b/libs/vkd3d/libs/vkd3d-shader/dxil.c
|
||||
@@ -10315,6 +10315,21 @@ static enum vkd3d_result sm6_parser_init(struct sm6_parser *sm6, struct vsir_pro
|
||||
sm6->ptr = &sm6->start[1];
|
||||
sm6->bitpos = 2;
|
||||
|
||||
+ switch (program->shader_version.type)
|
||||
+ {
|
||||
+ case VKD3D_SHADER_TYPE_HULL:
|
||||
+ case VKD3D_SHADER_TYPE_DOMAIN:
|
||||
+ break;
|
||||
+
|
||||
+ default:
|
||||
+ if (program->patch_constant_signature.element_count != 0)
|
||||
+ {
|
||||
+ WARN("The patch constant signature only makes sense for Hull and Domain Shaders, ignoring it.\n");
|
||||
+ shader_signature_cleanup(&program->patch_constant_signature);
|
||||
+ }
|
||||
+ break;
|
||||
+ }
|
||||
+
|
||||
input_signature = &program->input_signature;
|
||||
output_signature = &program->output_signature;
|
||||
patch_constant_signature = &program->patch_constant_signature;
|
||||
diff --git a/libs/vkd3d/libs/vkd3d-shader/glsl.c b/libs/vkd3d/libs/vkd3d-shader/glsl.c
|
||||
index 4dc95899a11..91ee355ed39 100644
|
||||
--- a/libs/vkd3d/libs/vkd3d-shader/glsl.c
|
||||
+++ b/libs/vkd3d/libs/vkd3d-shader/glsl.c
|
||||
@@ -651,6 +651,20 @@ static void shader_glsl_cast(struct vkd3d_glsl_generator *gen, const struct vkd3
|
||||
glsl_dst_cleanup(&dst, &gen->string_buffers);
|
||||
}
|
||||
|
||||
+static void shader_glsl_end_block(struct vkd3d_glsl_generator *gen)
|
||||
+{
|
||||
+ --gen->indent;
|
||||
+ shader_glsl_print_indent(gen->buffer, gen->indent);
|
||||
+ vkd3d_string_buffer_printf(gen->buffer, "}\n");
|
||||
+}
|
||||
+
|
||||
+static void shader_glsl_begin_block(struct vkd3d_glsl_generator *gen)
|
||||
+{
|
||||
+ shader_glsl_print_indent(gen->buffer, gen->indent);
|
||||
+ vkd3d_string_buffer_printf(gen->buffer, "{\n");
|
||||
+ ++gen->indent;
|
||||
+}
|
||||
+
|
||||
static void shader_glsl_if(struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_instruction *ins)
|
||||
{
|
||||
const char *condition;
|
||||
@@ -664,23 +678,65 @@ static void shader_glsl_if(struct vkd3d_glsl_generator *gen, const struct vkd3d_
|
||||
|
||||
glsl_src_cleanup(&src, &gen->string_buffers);
|
||||
|
||||
- shader_glsl_print_indent(gen->buffer, gen->indent);
|
||||
- vkd3d_string_buffer_printf(gen->buffer, "{\n");
|
||||
- ++gen->indent;
|
||||
+ shader_glsl_begin_block(gen);
|
||||
}
|
||||
|
||||
static void shader_glsl_else(struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_instruction *ins)
|
||||
{
|
||||
- unsigned int i = 4 * (gen->indent - 1);
|
||||
+ shader_glsl_end_block(gen);
|
||||
+ shader_glsl_print_indent(gen->buffer, gen->indent);
|
||||
+ vkd3d_string_buffer_printf(gen->buffer, "else\n");
|
||||
+ shader_glsl_begin_block(gen);
|
||||
+}
|
||||
|
||||
- vkd3d_string_buffer_printf(gen->buffer, "%*s}\n%*selse\n%*s{\n", i, "", i, "", i, "");
|
||||
+static void shader_glsl_loop(struct vkd3d_glsl_generator *gen)
|
||||
+{
|
||||
+ shader_glsl_print_indent(gen->buffer, gen->indent);
|
||||
+ vkd3d_string_buffer_printf(gen->buffer, "for (;;)\n");
|
||||
+ shader_glsl_begin_block(gen);
|
||||
}
|
||||
|
||||
-static void shader_glsl_endif(struct vkd3d_glsl_generator *gen)
|
||||
+static void shader_glsl_break(struct vkd3d_glsl_generator *gen)
|
||||
{
|
||||
- --gen->indent;
|
||||
shader_glsl_print_indent(gen->buffer, gen->indent);
|
||||
- vkd3d_string_buffer_printf(gen->buffer, "}\n");
|
||||
+ vkd3d_string_buffer_printf(gen->buffer, "break;\n");
|
||||
+}
|
||||
+
|
||||
+static void shader_glsl_continue(struct vkd3d_glsl_generator *gen)
|
||||
+{
|
||||
+ shader_glsl_print_indent(gen->buffer, gen->indent);
|
||||
+ vkd3d_string_buffer_printf(gen->buffer, "continue;\n");
|
||||
+}
|
||||
+
|
||||
+static void shader_glsl_switch(struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_instruction *ins)
|
||||
+{
|
||||
+ struct glsl_src src;
|
||||
+
|
||||
+ glsl_src_init(&src, gen, &ins->src[0], VKD3DSP_WRITEMASK_0);
|
||||
+
|
||||
+ shader_glsl_print_indent(gen->buffer, gen->indent);
|
||||
+ vkd3d_string_buffer_printf(gen->buffer, "switch (%s)\n", src.str->buffer);
|
||||
+ shader_glsl_begin_block(gen);
|
||||
+
|
||||
+ glsl_src_cleanup(&src, &gen->string_buffers);
|
||||
+}
|
||||
+
|
||||
+static void shader_glsl_case(struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_instruction *ins)
|
||||
+{
|
||||
+ struct glsl_src src;
|
||||
+
|
||||
+ glsl_src_init(&src, gen, &ins->src[0], VKD3DSP_WRITEMASK_0);
|
||||
+
|
||||
+ shader_glsl_print_indent(gen->buffer, gen->indent);
|
||||
+ vkd3d_string_buffer_printf(gen->buffer, "case %s:\n", src.str->buffer);
|
||||
+
|
||||
+ glsl_src_cleanup(&src, &gen->string_buffers);
|
||||
+}
|
||||
+
|
||||
+static void shader_glsl_default(struct vkd3d_glsl_generator *gen)
|
||||
+{
|
||||
+ shader_glsl_print_indent(gen->buffer, gen->indent);
|
||||
+ vkd3d_string_buffer_printf(gen->buffer, "default:\n");
|
||||
}
|
||||
|
||||
static void shader_glsl_ld(struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_instruction *ins)
|
||||
@@ -1013,6 +1069,9 @@ static void shader_glsl_shader_prologue(struct vkd3d_glsl_generator *gen)
|
||||
case VKD3D_SHADER_COMPONENT_UINT:
|
||||
vkd3d_string_buffer_printf(buffer, " = uintBitsToFloat(shader_in_%u)", i);
|
||||
break;
|
||||
+ case VKD3D_SHADER_COMPONENT_INT:
|
||||
+ vkd3d_string_buffer_printf(buffer, " = intBitsToFloat(shader_in_%u)", i);
|
||||
+ break;
|
||||
default:
|
||||
vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
|
||||
"Internal compiler error: Unhandled input component type %#x.", e->component_type);
|
||||
@@ -1127,6 +1186,15 @@ static void vkd3d_glsl_handle_instruction(struct vkd3d_glsl_generator *gen,
|
||||
case VKD3DSIH_AND:
|
||||
shader_glsl_binop(gen, ins, "&");
|
||||
break;
|
||||
+ case VKD3DSIH_BREAK:
|
||||
+ shader_glsl_break(gen);
|
||||
+ break;
|
||||
+ case VKD3DSIH_CASE:
|
||||
+ shader_glsl_case(gen, ins);
|
||||
+ break;
|
||||
+ case VKD3DSIH_CONTINUE:
|
||||
+ shader_glsl_continue(gen);
|
||||
+ break;
|
||||
case VKD3DSIH_DCL_INDEXABLE_TEMP:
|
||||
shader_glsl_dcl_indexable_temp(gen, ins);
|
||||
break;
|
||||
@@ -1138,6 +1206,9 @@ static void vkd3d_glsl_handle_instruction(struct vkd3d_glsl_generator *gen,
|
||||
case VKD3DSIH_DCL_OUTPUT_SIV:
|
||||
case VKD3DSIH_NOP:
|
||||
break;
|
||||
+ case VKD3DSIH_DEFAULT:
|
||||
+ shader_glsl_default(gen);
|
||||
+ break;
|
||||
case VKD3DSIH_DIV:
|
||||
shader_glsl_binop(gen, ins, "/");
|
||||
break;
|
||||
@@ -1154,7 +1225,9 @@ static void vkd3d_glsl_handle_instruction(struct vkd3d_glsl_generator *gen,
|
||||
shader_glsl_else(gen, ins);
|
||||
break;
|
||||
case VKD3DSIH_ENDIF:
|
||||
- shader_glsl_endif(gen);
|
||||
+ case VKD3DSIH_ENDLOOP:
|
||||
+ case VKD3DSIH_ENDSWITCH:
|
||||
+ shader_glsl_end_block(gen);
|
||||
break;
|
||||
case VKD3DSIH_EQO:
|
||||
case VKD3DSIH_IEQ:
|
||||
@@ -1184,6 +1257,7 @@ static void vkd3d_glsl_handle_instruction(struct vkd3d_glsl_generator *gen,
|
||||
break;
|
||||
case VKD3DSIH_ILT:
|
||||
case VKD3DSIH_LTO:
|
||||
+ case VKD3DSIH_ULT:
|
||||
shader_glsl_relop(gen, ins, "<", "lessThan");
|
||||
break;
|
||||
case VKD3DSIH_IMAX:
|
||||
@@ -1220,6 +1294,9 @@ static void vkd3d_glsl_handle_instruction(struct vkd3d_glsl_generator *gen,
|
||||
case VKD3DSIH_LOG:
|
||||
shader_glsl_intrinsic(gen, ins, "log2");
|
||||
break;
|
||||
+ case VKD3DSIH_LOOP:
|
||||
+ shader_glsl_loop(gen);
|
||||
+ break;
|
||||
case VKD3DSIH_MOV:
|
||||
shader_glsl_mov(gen, ins);
|
||||
break;
|
||||
@@ -1259,6 +1336,9 @@ static void vkd3d_glsl_handle_instruction(struct vkd3d_glsl_generator *gen,
|
||||
case VKD3DSIH_SQRT:
|
||||
shader_glsl_intrinsic(gen, ins, "sqrt");
|
||||
break;
|
||||
+ case VKD3DSIH_SWITCH:
|
||||
+ shader_glsl_switch(gen, ins);
|
||||
+ break;
|
||||
default:
|
||||
shader_glsl_unhandled(gen, ins);
|
||||
break;
|
||||
@@ -1663,6 +1743,9 @@ static void shader_glsl_generate_input_declarations(struct vkd3d_glsl_generator
|
||||
case VKD3D_SHADER_COMPONENT_UINT:
|
||||
vkd3d_string_buffer_printf(buffer, "uvec4");
|
||||
break;
|
||||
+ case VKD3D_SHADER_COMPONENT_INT:
|
||||
+ vkd3d_string_buffer_printf(buffer, "ivec4");
|
||||
+ break;
|
||||
case VKD3D_SHADER_COMPONENT_FLOAT:
|
||||
vkd3d_string_buffer_printf(buffer, "vec4");
|
||||
break;
|
||||
diff --git a/libs/vkd3d/libs/vkd3d-shader/ir.c b/libs/vkd3d/libs/vkd3d-shader/ir.c
|
||||
index 14cf23e8d1a..affbae3ea4e 100644
|
||||
--- a/libs/vkd3d/libs/vkd3d-shader/ir.c
|
||||
+++ b/libs/vkd3d/libs/vkd3d-shader/ir.c
|
||||
@@ -6505,6 +6505,30 @@ static bool vsir_validate_src_max_count(struct validation_context *ctx,
|
||||
return true;
|
||||
}
|
||||
|
||||
+static void vsir_validate_signature_element(struct validation_context *ctx,
|
||||
+ const struct shader_signature *signature, const char *signature_type,
|
||||
+ unsigned int idx)
|
||||
+{
|
||||
+ const struct signature_element *element = &signature->elements[idx];
|
||||
+
|
||||
+ if (element->register_count == 0)
|
||||
+ validator_error(ctx, VKD3D_SHADER_ERROR_VSIR_INVALID_SIGNATURE,
|
||||
+ "element %u of %s signature: Invalid zero register count.", idx, signature_type);
|
||||
+
|
||||
+ if (element->mask == 0 || (element->mask & ~0xf))
|
||||
+ validator_error(ctx, VKD3D_SHADER_ERROR_VSIR_INVALID_SIGNATURE,
|
||||
+ "element %u of %s signature: Invalid mask %#x.", idx, signature_type, element->mask);
|
||||
+}
|
||||
+
|
||||
+static void vsir_validate_signature(struct validation_context *ctx,
|
||||
+ const struct shader_signature *signature, const char *signature_type)
|
||||
+{
|
||||
+ unsigned int i;
|
||||
+
|
||||
+ for (i = 0; i < signature->element_count; ++i)
|
||||
+ vsir_validate_signature_element(ctx, signature, signature_type, i);
|
||||
+}
|
||||
+
|
||||
static const char *name_from_cf_type(enum vsir_control_flow_type type)
|
||||
{
|
||||
switch (type)
|
||||
@@ -7042,6 +7066,22 @@ enum vkd3d_result vsir_program_validate(struct vsir_program *program, uint64_t c
|
||||
if (!(config_flags & VKD3D_SHADER_CONFIG_FLAG_FORCE_VALIDATION))
|
||||
return VKD3D_OK;
|
||||
|
||||
+ switch (program->shader_version.type)
|
||||
+ {
|
||||
+ case VKD3D_SHADER_TYPE_HULL:
|
||||
+ case VKD3D_SHADER_TYPE_DOMAIN:
|
||||
+ break;
|
||||
+
|
||||
+ default:
|
||||
+ if (program->patch_constant_signature.element_count != 0)
|
||||
+ validator_error(&ctx, VKD3D_SHADER_ERROR_VSIR_INVALID_SIGNATURE,
|
||||
+ "Patch constant signature is only valid for hull and domain shaders.");
|
||||
+ }
|
||||
+
|
||||
+ vsir_validate_signature(&ctx, &program->input_signature, "input");
|
||||
+ vsir_validate_signature(&ctx, &program->output_signature, "output");
|
||||
+ vsir_validate_signature(&ctx, &program->patch_constant_signature, "patch constant");
|
||||
+
|
||||
if (!(ctx.temps = vkd3d_calloc(ctx.program->temp_count, sizeof(*ctx.temps))))
|
||||
goto fail;
|
||||
|
||||
diff --git a/libs/vkd3d/libs/vkd3d-shader/spirv.c b/libs/vkd3d/libs/vkd3d-shader/spirv.c
|
||||
index cb610c929b6..692432d5513 100644
|
||||
--- a/libs/vkd3d/libs/vkd3d-shader/spirv.c
|
||||
+++ b/libs/vkd3d/libs/vkd3d-shader/spirv.c
|
||||
@@ -3267,18 +3267,6 @@ static void spirv_compiler_emit_register_debug_name(struct vkd3d_spirv_builder *
|
||||
vkd3d_spirv_build_op_name(builder, id, "%s", debug_name);
|
||||
}
|
||||
|
||||
-static uint32_t spirv_compiler_emit_variable(struct spirv_compiler *compiler,
|
||||
- struct vkd3d_spirv_stream *stream, SpvStorageClass storage_class,
|
||||
- enum vkd3d_shader_component_type component_type, unsigned int component_count)
|
||||
-{
|
||||
- struct vkd3d_spirv_builder *builder = &compiler->spirv_builder;
|
||||
- uint32_t type_id, ptr_type_id;
|
||||
-
|
||||
- type_id = vkd3d_spirv_get_type_id(builder, component_type, component_count);
|
||||
- ptr_type_id = vkd3d_spirv_get_op_type_pointer(builder, storage_class, type_id);
|
||||
- return vkd3d_spirv_build_op_variable(builder, stream, ptr_type_id, storage_class, 0);
|
||||
-}
|
||||
-
|
||||
static uint32_t spirv_compiler_emit_array_variable(struct spirv_compiler *compiler,
|
||||
struct vkd3d_spirv_stream *stream, SpvStorageClass storage_class,
|
||||
enum vkd3d_shader_component_type component_type, unsigned int component_count,
|
||||
@@ -3288,10 +3276,6 @@ static uint32_t spirv_compiler_emit_array_variable(struct spirv_compiler *compil
|
||||
uint32_t type_id, length_id, ptr_type_id;
|
||||
unsigned int i;
|
||||
|
||||
- if (!length_count)
|
||||
- return spirv_compiler_emit_variable(compiler,
|
||||
- stream, storage_class, component_type, component_count);
|
||||
-
|
||||
type_id = vkd3d_spirv_get_type_id(builder, component_type, component_count);
|
||||
for (i = 0; i < length_count; ++i)
|
||||
{
|
||||
@@ -3305,6 +3289,14 @@ static uint32_t spirv_compiler_emit_array_variable(struct spirv_compiler *compil
|
||||
return vkd3d_spirv_build_op_variable(builder, stream, ptr_type_id, storage_class, 0);
|
||||
}
|
||||
|
||||
+static uint32_t spirv_compiler_emit_variable(struct spirv_compiler *compiler,
|
||||
+ struct vkd3d_spirv_stream *stream, SpvStorageClass storage_class,
|
||||
+ enum vkd3d_shader_component_type component_type, unsigned int component_count)
|
||||
+{
|
||||
+ return spirv_compiler_emit_array_variable(compiler, stream, storage_class,
|
||||
+ component_type, component_count, NULL, 0);
|
||||
+}
|
||||
+
|
||||
static const struct vkd3d_spec_constant_info
|
||||
{
|
||||
enum vkd3d_shader_parameter_name name;
|
||||
diff --git a/libs/vkd3d/libs/vkd3d-shader/tpf.c b/libs/vkd3d/libs/vkd3d-shader/tpf.c
|
||||
index 75bdb06fe0e..f79e97e92d4 100644
|
||||
--- a/libs/vkd3d/libs/vkd3d-shader/tpf.c
|
||||
+++ b/libs/vkd3d/libs/vkd3d-shader/tpf.c
|
||||
@@ -2914,6 +2914,21 @@ int tpf_parse(const struct vkd3d_shader_compile_info *compile_info, uint64_t con
|
||||
if (program->shader_version.type == VKD3D_SHADER_TYPE_HULL)
|
||||
uninvert_used_masks(&program->patch_constant_signature);
|
||||
|
||||
+ switch (program->shader_version.type)
|
||||
+ {
|
||||
+ case VKD3D_SHADER_TYPE_HULL:
|
||||
+ case VKD3D_SHADER_TYPE_DOMAIN:
|
||||
+ break;
|
||||
+
|
||||
+ default:
|
||||
+ if (program->patch_constant_signature.element_count != 0)
|
||||
+ {
|
||||
+ WARN("The patch constant signature only makes sense for Hull and Domain Shaders, ignoring it.\n");
|
||||
+ shader_signature_cleanup(&program->patch_constant_signature);
|
||||
+ }
|
||||
+ break;
|
||||
+ }
|
||||
+
|
||||
if (!shader_sm4_parser_validate_signature(&sm4, &program->input_signature,
|
||||
sm4.input_register_masks, "Input")
|
||||
|| !shader_sm4_parser_validate_signature(&sm4, &program->output_signature,
|
||||
diff --git a/libs/vkd3d/libs/vkd3d-shader/vkd3d_shader_main.c b/libs/vkd3d/libs/vkd3d-shader/vkd3d_shader_main.c
|
||||
index 9b320106340..f84ac551272 100644
|
||||
--- a/libs/vkd3d/libs/vkd3d-shader/vkd3d_shader_main.c
|
||||
+++ b/libs/vkd3d/libs/vkd3d-shader/vkd3d_shader_main.c
|
||||
@@ -1846,6 +1846,8 @@ void shader_signature_cleanup(struct shader_signature *signature)
|
||||
}
|
||||
vkd3d_free(signature->elements);
|
||||
signature->elements = NULL;
|
||||
+ signature->elements_capacity = 0;
|
||||
+ signature->element_count = 0;
|
||||
}
|
||||
|
||||
int vkd3d_shader_parse_input_signature(const struct vkd3d_shader_code *dxbc,
|
||||
diff --git a/libs/vkd3d/libs/vkd3d-shader/vkd3d_shader_private.h b/libs/vkd3d/libs/vkd3d-shader/vkd3d_shader_private.h
|
||||
index 1a42f385fc0..41b879af4b4 100644
|
||||
--- a/libs/vkd3d/libs/vkd3d-shader/vkd3d_shader_private.h
|
||||
+++ b/libs/vkd3d/libs/vkd3d-shader/vkd3d_shader_private.h
|
||||
@@ -245,6 +245,7 @@ enum vkd3d_shader_error
|
||||
VKD3D_SHADER_ERROR_VSIR_INVALID_GS = 9019,
|
||||
VKD3D_SHADER_ERROR_VSIR_INVALID_PARAMETER = 9020,
|
||||
VKD3D_SHADER_ERROR_VSIR_MISSING_SEMANTIC = 9021,
|
||||
+ VKD3D_SHADER_ERROR_VSIR_INVALID_SIGNATURE = 9022,
|
||||
|
||||
VKD3D_SHADER_WARNING_VSIR_DYNAMIC_DESCRIPTOR_ARRAY = 9300,
|
||||
|
||||
--
|
||||
2.45.2
|
||||
|
@@ -1,303 +0,0 @@
|
||||
From 3bca6a7e645ca8f48f2ec73a13b63a412cb7f2be Mon Sep 17 00:00:00 2001
|
||||
From: Alistair Leslie-Hughes <leslie_alistair@hotmail.com>
|
||||
Date: Wed, 25 Sep 2024 07:29:36 +1000
|
||||
Subject: [PATCH] Updated vkd3d to e8b14d765dbebae32d83aa5d2a7521932d9943f9.
|
||||
|
||||
---
|
||||
libs/vkd3d/libs/vkd3d-shader/glsl.c | 38 ++++++++++++++++++++
|
||||
libs/vkd3d/libs/vkd3d-shader/ir.c | 5 +--
|
||||
libs/vkd3d/libs/vkd3d-shader/msl.c | 50 ++++++++++++++++++++++++--
|
||||
libs/vkd3d/libs/vkd3d-shader/preproc.l | 2 +-
|
||||
libs/vkd3d/libs/vkd3d-shader/spirv.c | 25 ++++---------
|
||||
libs/vkd3d/libs/vkd3d/vkd3d_main.c | 1 +
|
||||
6 files changed, 96 insertions(+), 25 deletions(-)
|
||||
|
||||
diff --git a/libs/vkd3d/libs/vkd3d-shader/glsl.c b/libs/vkd3d/libs/vkd3d-shader/glsl.c
|
||||
index b29f13f2b19..a8cc6d87c40 100644
|
||||
--- a/libs/vkd3d/libs/vkd3d-shader/glsl.c
|
||||
+++ b/libs/vkd3d/libs/vkd3d-shader/glsl.c
|
||||
@@ -379,6 +379,9 @@ static void VKD3D_PRINTF_FUNC(3, 4) shader_glsl_print_assignment(
|
||||
case VKD3D_DATA_FLOAT:
|
||||
close = false;
|
||||
break;
|
||||
+ case VKD3D_DATA_INT:
|
||||
+ vkd3d_string_buffer_printf(buffer, "intBitsToFloat(");
|
||||
+ break;
|
||||
case VKD3D_DATA_UINT:
|
||||
vkd3d_string_buffer_printf(buffer, "uintBitsToFloat(");
|
||||
break;
|
||||
@@ -457,6 +460,28 @@ static void shader_glsl_relop(struct vkd3d_glsl_generator *gen,
|
||||
glsl_dst_cleanup(&dst, &gen->string_buffers);
|
||||
}
|
||||
|
||||
+static void shader_glsl_cast(struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_instruction *ins,
|
||||
+ const char *scalar_constructor, const char *vector_constructor)
|
||||
+{
|
||||
+ unsigned int component_count;
|
||||
+ struct glsl_src src;
|
||||
+ struct glsl_dst dst;
|
||||
+ uint32_t mask;
|
||||
+
|
||||
+ mask = glsl_dst_init(&dst, gen, ins, &ins->dst[0]);
|
||||
+ glsl_src_init(&src, gen, &ins->src[0], mask);
|
||||
+
|
||||
+ if ((component_count = vsir_write_mask_component_count(mask)) > 1)
|
||||
+ shader_glsl_print_assignment(gen, &dst, "%s%u(%s)",
|
||||
+ vector_constructor, component_count, src.str->buffer);
|
||||
+ else
|
||||
+ shader_glsl_print_assignment(gen, &dst, "%s(%s)",
|
||||
+ scalar_constructor, src.str->buffer);
|
||||
+
|
||||
+ glsl_src_cleanup(&src, &gen->string_buffers);
|
||||
+ glsl_dst_cleanup(&dst, &gen->string_buffers);
|
||||
+}
|
||||
+
|
||||
static void shader_glsl_mov(struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_instruction *ins)
|
||||
{
|
||||
struct glsl_src src;
|
||||
@@ -658,6 +683,12 @@ static void vkd3d_glsl_handle_instruction(struct vkd3d_glsl_generator *gen,
|
||||
case VKD3DSIH_FRC:
|
||||
shader_glsl_intrinsic(gen, ins, "fract");
|
||||
break;
|
||||
+ case VKD3DSIH_FTOI:
|
||||
+ shader_glsl_cast(gen, ins, "int", "ivec");
|
||||
+ break;
|
||||
+ case VKD3DSIH_FTOU:
|
||||
+ shader_glsl_cast(gen, ins, "uint", "uvec");
|
||||
+ break;
|
||||
case VKD3DSIH_GEO:
|
||||
shader_glsl_relop(gen, ins, ">=", "greaterThanEqual");
|
||||
break;
|
||||
@@ -665,6 +696,10 @@ static void vkd3d_glsl_handle_instruction(struct vkd3d_glsl_generator *gen,
|
||||
case VKD3DSIH_NEU:
|
||||
shader_glsl_relop(gen, ins, "!=", "notEqual");
|
||||
break;
|
||||
+ case VKD3DSIH_ITOF:
|
||||
+ case VKD3DSIH_UTOF:
|
||||
+ shader_glsl_cast(gen, ins, "float", "vec");
|
||||
+ break;
|
||||
case VKD3DSIH_MOV:
|
||||
shader_glsl_mov(gen, ins);
|
||||
break;
|
||||
@@ -680,6 +715,9 @@ static void vkd3d_glsl_handle_instruction(struct vkd3d_glsl_generator *gen,
|
||||
case VKD3DSIH_RET:
|
||||
shader_glsl_ret(gen, ins);
|
||||
break;
|
||||
+ case VKD3DSIH_ROUND_PI:
|
||||
+ shader_glsl_intrinsic(gen, ins, "ceil");
|
||||
+ break;
|
||||
default:
|
||||
shader_glsl_unhandled(gen, ins);
|
||||
break;
|
||||
diff --git a/libs/vkd3d/libs/vkd3d-shader/ir.c b/libs/vkd3d/libs/vkd3d-shader/ir.c
|
||||
index db9992d9715..0bbe13ad7d8 100644
|
||||
--- a/libs/vkd3d/libs/vkd3d-shader/ir.c
|
||||
+++ b/libs/vkd3d/libs/vkd3d-shader/ir.c
|
||||
@@ -1211,12 +1211,13 @@ static bool io_normaliser_is_in_control_point_phase(const struct io_normaliser *
|
||||
static bool shader_signature_find_element_for_reg(const struct shader_signature *signature,
|
||||
unsigned int reg_idx, unsigned int write_mask, unsigned int *element_idx)
|
||||
{
|
||||
+ const struct signature_element *e;
|
||||
unsigned int i, base_write_mask;
|
||||
|
||||
for (i = 0; i < signature->element_count; ++i)
|
||||
{
|
||||
- struct signature_element *e = &signature->elements[i];
|
||||
- if (e->register_index <= reg_idx && e->register_index + e->register_count > reg_idx
|
||||
+ e = &signature->elements[i];
|
||||
+ if (e->register_index <= reg_idx && e->register_count > reg_idx - e->register_index
|
||||
&& (e->mask & write_mask) == write_mask)
|
||||
{
|
||||
*element_idx = i;
|
||||
diff --git a/libs/vkd3d/libs/vkd3d-shader/msl.c b/libs/vkd3d/libs/vkd3d-shader/msl.c
|
||||
index 7d2e713cddc..6b41363d60e 100644
|
||||
--- a/libs/vkd3d/libs/vkd3d-shader/msl.c
|
||||
+++ b/libs/vkd3d/libs/vkd3d-shader/msl.c
|
||||
@@ -55,12 +55,44 @@ static void msl_print_indent(struct vkd3d_string_buffer *buffer, unsigned int in
|
||||
vkd3d_string_buffer_printf(buffer, "%*s", 4 * indent, "");
|
||||
}
|
||||
|
||||
+static void msl_print_register_datatype(struct vkd3d_string_buffer *buffer,
|
||||
+ struct msl_generator *gen, const struct vkd3d_shader_register *reg)
|
||||
+{
|
||||
+ vkd3d_string_buffer_printf(buffer, ".");
|
||||
+ switch (reg->data_type)
|
||||
+ {
|
||||
+ case VKD3D_DATA_FLOAT:
|
||||
+ vkd3d_string_buffer_printf(buffer, "f");
|
||||
+ break;
|
||||
+ case VKD3D_DATA_INT:
|
||||
+ vkd3d_string_buffer_printf(buffer, "i");
|
||||
+ break;
|
||||
+ case VKD3D_DATA_UINT:
|
||||
+ vkd3d_string_buffer_printf(buffer, "u");
|
||||
+ break;
|
||||
+ default:
|
||||
+ msl_compiler_error(gen, VKD3D_SHADER_ERROR_MSL_INTERNAL,
|
||||
+ "Internal compiler error: Unhandled register datatype %#x.", reg->data_type);
|
||||
+ vkd3d_string_buffer_printf(buffer, "<unrecognised register datatype %#x>", reg->data_type);
|
||||
+ break;
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
static void msl_print_register_name(struct vkd3d_string_buffer *buffer,
|
||||
struct msl_generator *gen, const struct vkd3d_shader_register *reg)
|
||||
{
|
||||
- msl_compiler_error(gen, VKD3D_SHADER_ERROR_MSL_INTERNAL,
|
||||
- "Internal compiler error: Unhandled register type %#x.", reg->type);
|
||||
- vkd3d_string_buffer_printf(buffer, "<unrecognised register %#x>", reg->type);
|
||||
+ switch (reg->type)
|
||||
+ {
|
||||
+ case VKD3DSPR_TEMP:
|
||||
+ vkd3d_string_buffer_printf(buffer, "r[%u]", reg->idx[0].offset);
|
||||
+ msl_print_register_datatype(buffer, gen, reg);
|
||||
+ break;
|
||||
+ default:
|
||||
+ msl_compiler_error(gen, VKD3D_SHADER_ERROR_MSL_INTERNAL,
|
||||
+ "Internal compiler error: Unhandled register type %#x.", reg->type);
|
||||
+ vkd3d_string_buffer_printf(buffer, "<unrecognised register %#x>", reg->type);
|
||||
+ break;
|
||||
+ }
|
||||
}
|
||||
|
||||
static void msl_print_swizzle(struct vkd3d_string_buffer *buffer, uint32_t swizzle, uint32_t mask)
|
||||
@@ -221,9 +253,21 @@ static void msl_generator_generate(struct msl_generator *gen)
|
||||
|
||||
vkd3d_string_buffer_printf(gen->buffer, "/* Generated by %s. */\n\n", vkd3d_shader_get_version(NULL, NULL));
|
||||
|
||||
+ vkd3d_string_buffer_printf(gen->buffer, "union vkd3d_vec4\n{\n");
|
||||
+ vkd3d_string_buffer_printf(gen->buffer, " uint4 u;\n");
|
||||
+ vkd3d_string_buffer_printf(gen->buffer, " int4 i;\n");
|
||||
+ vkd3d_string_buffer_printf(gen->buffer, " float4 f;\n};\n\n");
|
||||
+
|
||||
vkd3d_string_buffer_printf(gen->buffer, "void shader_main()\n{\n");
|
||||
|
||||
++gen->indent;
|
||||
+
|
||||
+ if (gen->program->temp_count)
|
||||
+ {
|
||||
+ msl_print_indent(gen->buffer, gen->indent);
|
||||
+ vkd3d_string_buffer_printf(gen->buffer, "vkd3d_vec4 r[%u];\n\n", gen->program->temp_count);
|
||||
+ }
|
||||
+
|
||||
for (i = 0; i < instructions->count; ++i)
|
||||
{
|
||||
msl_handle_instruction(gen, &instructions->elements[i]);
|
||||
diff --git a/libs/vkd3d/libs/vkd3d-shader/preproc.l b/libs/vkd3d/libs/vkd3d-shader/preproc.l
|
||||
index 7fc963192cf..41c21cca1f5 100644
|
||||
--- a/libs/vkd3d/libs/vkd3d-shader/preproc.l
|
||||
+++ b/libs/vkd3d/libs/vkd3d-shader/preproc.l
|
||||
@@ -67,7 +67,7 @@ static void update_location(struct preproc_ctx *ctx);
|
||||
|
||||
NEWLINE \r?\n
|
||||
WS [ \t\r]
|
||||
-IDENTIFIER [A-Za-z_][A-Za-z0-9_]*
|
||||
+IDENTIFIER (::)?[A-Za-z_]((::)?[A-Za-z0-9_]+)*
|
||||
INT_SUFFIX [uUlL]{0,2}
|
||||
|
||||
%%
|
||||
diff --git a/libs/vkd3d/libs/vkd3d-shader/spirv.c b/libs/vkd3d/libs/vkd3d-shader/spirv.c
|
||||
index 1876ad38653..0278a6ca232 100644
|
||||
--- a/libs/vkd3d/libs/vkd3d-shader/spirv.c
|
||||
+++ b/libs/vkd3d/libs/vkd3d-shader/spirv.c
|
||||
@@ -6354,7 +6354,7 @@ static SpvImageFormat image_format_for_image_read(enum vkd3d_shader_component_ty
|
||||
static uint32_t spirv_compiler_get_image_type_id(struct spirv_compiler *compiler,
|
||||
const struct vkd3d_shader_register *reg, const struct vkd3d_shader_register_range *range,
|
||||
const struct vkd3d_spirv_resource_type *resource_type_info, enum vkd3d_shader_component_type data_type,
|
||||
- bool raw_structured, uint32_t depth)
|
||||
+ bool raw_structured)
|
||||
{
|
||||
struct vkd3d_spirv_builder *builder = &compiler->spirv_builder;
|
||||
const struct vkd3d_shader_descriptor_info1 *d;
|
||||
@@ -6377,7 +6377,7 @@ static uint32_t spirv_compiler_get_image_type_id(struct spirv_compiler *compiler
|
||||
|
||||
sampled_type_id = vkd3d_spirv_get_type_id(builder, data_type, 1);
|
||||
return vkd3d_spirv_get_op_type_image(builder, sampled_type_id, resource_type_info->dim,
|
||||
- depth, resource_type_info->arrayed, resource_type_info->ms,
|
||||
+ 2, resource_type_info->arrayed, resource_type_info->ms,
|
||||
reg->type == VKD3DSPR_UAV ? 2 : 1, format);
|
||||
}
|
||||
|
||||
@@ -6392,18 +6392,14 @@ static void spirv_compiler_emit_combined_sampler_declarations(struct spirv_compi
|
||||
const struct vkd3d_shader_combined_resource_sampler *current;
|
||||
uint32_t image_type_id, type_id, ptr_type_id, var_id;
|
||||
enum vkd3d_shader_binding_flag resource_type_flag;
|
||||
- const struct vkd3d_shader_descriptor_info1 *d;
|
||||
struct vkd3d_symbol symbol;
|
||||
unsigned int i;
|
||||
- bool depth;
|
||||
|
||||
resource_type_flag = resource_type == VKD3D_SHADER_RESOURCE_BUFFER
|
||||
? VKD3D_SHADER_BINDING_FLAG_BUFFER : VKD3D_SHADER_BINDING_FLAG_IMAGE;
|
||||
|
||||
for (i = 0; i < shader_interface->combined_sampler_count; ++i)
|
||||
{
|
||||
- struct vkd3d_shader_register_range sampler_range;
|
||||
-
|
||||
current = &shader_interface->combined_samplers[i];
|
||||
|
||||
if (current->resource_space != resource_range->space || current->resource_index != resource_range->first)
|
||||
@@ -6425,16 +6421,8 @@ static void spirv_compiler_emit_combined_sampler_declarations(struct spirv_compi
|
||||
current->sampler_space, current->binding.count);
|
||||
}
|
||||
|
||||
- sampler_range.space = current->sampler_space;
|
||||
- sampler_range.first = current->sampler_index;
|
||||
- sampler_range.last = current->sampler_index;
|
||||
- d = spirv_compiler_get_descriptor_info(compiler,
|
||||
- VKD3D_SHADER_DESCRIPTOR_TYPE_SAMPLER, &sampler_range);
|
||||
- depth = current->sampler_index != VKD3D_SHADER_DUMMY_SAMPLER_INDEX
|
||||
- && (d->flags & VKD3D_SHADER_DESCRIPTOR_INFO_FLAG_SAMPLER_COMPARISON_MODE);
|
||||
-
|
||||
image_type_id = spirv_compiler_get_image_type_id(compiler, resource, resource_range,
|
||||
- resource_type_info, sampled_type, structure_stride || raw, depth);
|
||||
+ resource_type_info, sampled_type, structure_stride || raw);
|
||||
type_id = vkd3d_spirv_get_op_type_sampled_image(builder, image_type_id);
|
||||
|
||||
ptr_type_id = vkd3d_spirv_get_op_type_pointer(builder, storage_class, type_id);
|
||||
@@ -6528,7 +6516,7 @@ static void spirv_compiler_emit_resource_declaration(struct spirv_compiler *comp
|
||||
else
|
||||
{
|
||||
type_id = spirv_compiler_get_image_type_id(compiler, ®, range,
|
||||
- resource_type_info, sampled_type, structure_stride || raw, 0);
|
||||
+ resource_type_info, sampled_type, structure_stride || raw);
|
||||
}
|
||||
|
||||
var_id = spirv_compiler_build_descriptor_variable(compiler, storage_class,
|
||||
@@ -8440,11 +8428,10 @@ static void spirv_compiler_prepare_image(struct spirv_compiler *compiler,
|
||||
struct vkd3d_spirv_builder *builder = &compiler->spirv_builder;
|
||||
uint32_t sampler_var_id, sampler_id, sampled_image_type_id;
|
||||
const struct vkd3d_symbol *symbol = NULL;
|
||||
- bool load, sampled, depth_comparison;
|
||||
+ bool load, sampled;
|
||||
|
||||
load = !(flags & VKD3D_IMAGE_FLAG_NO_LOAD);
|
||||
sampled = flags & VKD3D_IMAGE_FLAG_SAMPLED;
|
||||
- depth_comparison = flags & VKD3D_IMAGE_FLAG_DEPTH;
|
||||
|
||||
if (resource_reg->type == VKD3DSPR_RESOURCE)
|
||||
symbol = spirv_compiler_find_combined_sampler(compiler, resource_reg, sampler_reg);
|
||||
@@ -8498,7 +8485,7 @@ static void spirv_compiler_prepare_image(struct spirv_compiler *compiler,
|
||||
|
||||
image->image_type_id = spirv_compiler_get_image_type_id(compiler, resource_reg,
|
||||
&symbol->info.resource.range, image->resource_type_info,
|
||||
- image->sampled_type, image->structure_stride || image->raw, depth_comparison);
|
||||
+ image->sampled_type, image->structure_stride || image->raw);
|
||||
|
||||
if (sampled)
|
||||
{
|
||||
diff --git a/libs/vkd3d/libs/vkd3d/vkd3d_main.c b/libs/vkd3d/libs/vkd3d/vkd3d_main.c
|
||||
index 9eccec111c7..5215cf8ef86 100644
|
||||
--- a/libs/vkd3d/libs/vkd3d/vkd3d_main.c
|
||||
+++ b/libs/vkd3d/libs/vkd3d/vkd3d_main.c
|
||||
@@ -415,6 +415,7 @@ HRESULT vkd3d_create_versioned_root_signature_deserializer(const void *data, SIZ
|
||||
if (FAILED(hr = d3d12_versioned_root_signature_deserializer_init(object, &dxbc)))
|
||||
{
|
||||
vkd3d_free(object);
|
||||
+ *deserializer = NULL;
|
||||
return hr;
|
||||
}
|
||||
|
||||
--
|
||||
2.45.2
|
||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,232 @@
|
||||
From de25c3d088ef5feba4c45ca9e885451604781749 Mon Sep 17 00:00:00 2001
|
||||
From: Dmitry Timoshkov <dmitry@baikal.ru>
|
||||
Date: Wed, 7 Feb 2024 19:14:29 +0300
|
||||
Subject: [PATCH 1/2] win32u: Fix device<->world width/height converters.
|
||||
|
||||
Signed-off-by: Dmitry Timoshkov <dmitry@baikal.ru>
|
||||
---
|
||||
dlls/win32u/font.c | 130 +++++++++++++++++++++------------------------
|
||||
1 file changed, 60 insertions(+), 70 deletions(-)
|
||||
|
||||
diff --git a/dlls/win32u/font.c b/dlls/win32u/font.c
|
||||
index 62a4dc51035..8fbd8dc3f01 100644
|
||||
--- a/dlls/win32u/font.c
|
||||
+++ b/dlls/win32u/font.c
|
||||
@@ -229,12 +229,10 @@ static inline int facename_compare( const WCHAR *str1, const WCHAR *str2, SIZE_T
|
||||
*/
|
||||
static inline INT INTERNAL_XDSTOWS(DC *dc, INT width)
|
||||
{
|
||||
- double floatWidth;
|
||||
+ float scale_x;
|
||||
|
||||
- /* Perform operation with floating point */
|
||||
- floatWidth = (double)width * dc->xformVport2World.eM11;
|
||||
- /* Round to integers */
|
||||
- return GDI_ROUND(floatWidth);
|
||||
+ scale_x = hypotf(dc->xformWorld2Vport.eM11, dc->xformWorld2Vport.eM12);
|
||||
+ return GDI_ROUND( (float)width / scale_x );
|
||||
}
|
||||
|
||||
/* Performs a device to world transformation on the specified size (which
|
||||
@@ -242,34 +240,26 @@ static inline INT INTERNAL_XDSTOWS(DC *dc, INT width)
|
||||
*/
|
||||
static inline INT INTERNAL_YDSTOWS(DC *dc, INT height)
|
||||
{
|
||||
- double floatHeight;
|
||||
+ float scale_y;
|
||||
|
||||
- /* Perform operation with floating point */
|
||||
- floatHeight = (double)height * dc->xformVport2World.eM22;
|
||||
- /* Round to integers */
|
||||
- return GDI_ROUND(floatHeight);
|
||||
+ scale_y = hypotf(dc->xformWorld2Vport.eM21, dc->xformWorld2Vport.eM22);
|
||||
+ return GDI_ROUND( (float)height / scale_y );
|
||||
}
|
||||
|
||||
-/* scale width and height but don't mirror them */
|
||||
-
|
||||
-static inline INT width_to_LP( DC *dc, INT width )
|
||||
+static inline INT INTERNAL_XWSTODS(DC *dc, INT width)
|
||||
{
|
||||
- return GDI_ROUND( (double)width * fabs( dc->xformVport2World.eM11 ));
|
||||
-}
|
||||
+ float scale_x;
|
||||
|
||||
-static inline INT height_to_LP( DC *dc, INT height )
|
||||
-{
|
||||
- return GDI_ROUND( (double)height * fabs( dc->xformVport2World.eM22 ));
|
||||
+ scale_x = hypotf(dc->xformWorld2Vport.eM11, dc->xformWorld2Vport.eM12);
|
||||
+ return GDI_ROUND( (float)width / scale_x );
|
||||
}
|
||||
|
||||
static inline INT INTERNAL_YWSTODS(DC *dc, INT height)
|
||||
{
|
||||
- POINT pt[2];
|
||||
- pt[0].x = pt[0].y = 0;
|
||||
- pt[1].x = 0;
|
||||
- pt[1].y = height;
|
||||
- lp_to_dp(dc, pt, 2);
|
||||
- return pt[1].y - pt[0].y;
|
||||
+ float scale_y;
|
||||
+
|
||||
+ scale_y = hypotf(dc->xformWorld2Vport.eM21, dc->xformWorld2Vport.eM22);
|
||||
+ return GDI_ROUND( (float)height / scale_y );
|
||||
}
|
||||
|
||||
static INT FONT_GetObjectW( HGDIOBJ handle, INT count, LPVOID buffer );
|
||||
@@ -4215,8 +4205,8 @@ static void scale_outline_font_metrics( const struct gdi_font *font, OUTLINETEXT
|
||||
else
|
||||
scale_x = font->scale_y;
|
||||
|
||||
- scale_x *= fabs(font->matrix.eM11);
|
||||
- scale_y = font->scale_y * fabs(font->matrix.eM22);
|
||||
+ scale_x *= hypotf(font->matrix.eM11, font->matrix.eM12);
|
||||
+ scale_y = font->scale_y * hypotf(font->matrix.eM21, font->matrix.eM22);
|
||||
|
||||
/* Windows scales these values as signed integers even if they are unsigned */
|
||||
#define SCALE_X(x) (x) = GDI_ROUND((int)(x) * (scale_x))
|
||||
@@ -4430,8 +4420,8 @@ static void scale_font_metrics( struct gdi_font *font, TEXTMETRICW *tm )
|
||||
else
|
||||
scale_x = font->scale_y;
|
||||
|
||||
- scale_x *= fabs(font->matrix.eM11);
|
||||
- scale_y = font->scale_y * fabs(font->matrix.eM22);
|
||||
+ scale_x *= hypotf(font->matrix.eM11, font->matrix.eM12);
|
||||
+ scale_y = font->scale_y * hypotf(font->matrix.eM21, font->matrix.eM22);
|
||||
|
||||
#define SCALE_X(x) (x) = GDI_ROUND((x) * scale_x)
|
||||
#define SCALE_Y(y) (y) = GDI_ROUND((y) * scale_y)
|
||||
@@ -5400,14 +5390,14 @@ BOOL WINAPI NtGdiGetTextMetricsW( HDC hdc, TEXTMETRICW *metrics, ULONG flags )
|
||||
|
||||
metrics->tmDigitizedAspectX = NtGdiGetDeviceCaps(hdc, LOGPIXELSX);
|
||||
metrics->tmDigitizedAspectY = NtGdiGetDeviceCaps(hdc, LOGPIXELSY);
|
||||
- metrics->tmHeight = height_to_LP( dc, metrics->tmHeight );
|
||||
- metrics->tmAscent = height_to_LP( dc, metrics->tmAscent );
|
||||
- metrics->tmDescent = height_to_LP( dc, metrics->tmDescent );
|
||||
- metrics->tmInternalLeading = height_to_LP( dc, metrics->tmInternalLeading );
|
||||
- metrics->tmExternalLeading = height_to_LP( dc, metrics->tmExternalLeading );
|
||||
- metrics->tmAveCharWidth = width_to_LP( dc, metrics->tmAveCharWidth );
|
||||
- metrics->tmMaxCharWidth = width_to_LP( dc, metrics->tmMaxCharWidth );
|
||||
- metrics->tmOverhang = width_to_LP( dc, metrics->tmOverhang );
|
||||
+ metrics->tmHeight = INTERNAL_YDSTOWS( dc, metrics->tmHeight );
|
||||
+ metrics->tmAscent = INTERNAL_YDSTOWS( dc, metrics->tmAscent );
|
||||
+ metrics->tmDescent = INTERNAL_YDSTOWS( dc, metrics->tmDescent );
|
||||
+ metrics->tmInternalLeading = INTERNAL_YDSTOWS( dc, metrics->tmInternalLeading );
|
||||
+ metrics->tmExternalLeading = INTERNAL_YDSTOWS( dc, metrics->tmExternalLeading );
|
||||
+ metrics->tmAveCharWidth = INTERNAL_XDSTOWS( dc, metrics->tmAveCharWidth );
|
||||
+ metrics->tmMaxCharWidth = INTERNAL_XDSTOWS( dc, metrics->tmMaxCharWidth );
|
||||
+ metrics->tmOverhang = INTERNAL_XDSTOWS( dc, metrics->tmOverhang );
|
||||
ret = TRUE;
|
||||
|
||||
TRACE("text metrics:\n"
|
||||
@@ -5463,38 +5453,38 @@ UINT WINAPI NtGdiGetOutlineTextMetricsInternalW( HDC hdc, UINT cbData,
|
||||
{
|
||||
output->otmTextMetrics.tmDigitizedAspectX = NtGdiGetDeviceCaps(hdc, LOGPIXELSX);
|
||||
output->otmTextMetrics.tmDigitizedAspectY = NtGdiGetDeviceCaps(hdc, LOGPIXELSY);
|
||||
- output->otmTextMetrics.tmHeight = height_to_LP( dc, output->otmTextMetrics.tmHeight );
|
||||
- output->otmTextMetrics.tmAscent = height_to_LP( dc, output->otmTextMetrics.tmAscent );
|
||||
- output->otmTextMetrics.tmDescent = height_to_LP( dc, output->otmTextMetrics.tmDescent );
|
||||
- output->otmTextMetrics.tmInternalLeading = height_to_LP( dc, output->otmTextMetrics.tmInternalLeading );
|
||||
- output->otmTextMetrics.tmExternalLeading = height_to_LP( dc, output->otmTextMetrics.tmExternalLeading );
|
||||
- output->otmTextMetrics.tmAveCharWidth = width_to_LP( dc, output->otmTextMetrics.tmAveCharWidth );
|
||||
- output->otmTextMetrics.tmMaxCharWidth = width_to_LP( dc, output->otmTextMetrics.tmMaxCharWidth );
|
||||
- output->otmTextMetrics.tmOverhang = width_to_LP( dc, output->otmTextMetrics.tmOverhang );
|
||||
- output->otmAscent = height_to_LP( dc, output->otmAscent);
|
||||
- output->otmDescent = height_to_LP( dc, output->otmDescent);
|
||||
+ output->otmTextMetrics.tmHeight = INTERNAL_YDSTOWS( dc, output->otmTextMetrics.tmHeight );
|
||||
+ output->otmTextMetrics.tmAscent = INTERNAL_YDSTOWS( dc, output->otmTextMetrics.tmAscent );
|
||||
+ output->otmTextMetrics.tmDescent = INTERNAL_YDSTOWS( dc, output->otmTextMetrics.tmDescent );
|
||||
+ output->otmTextMetrics.tmInternalLeading = INTERNAL_YDSTOWS( dc, output->otmTextMetrics.tmInternalLeading );
|
||||
+ output->otmTextMetrics.tmExternalLeading = INTERNAL_YDSTOWS( dc, output->otmTextMetrics.tmExternalLeading );
|
||||
+ output->otmTextMetrics.tmAveCharWidth = INTERNAL_XDSTOWS( dc, output->otmTextMetrics.tmAveCharWidth );
|
||||
+ output->otmTextMetrics.tmMaxCharWidth = INTERNAL_XDSTOWS( dc, output->otmTextMetrics.tmMaxCharWidth );
|
||||
+ output->otmTextMetrics.tmOverhang = INTERNAL_XDSTOWS( dc, output->otmTextMetrics.tmOverhang );
|
||||
+ output->otmAscent = INTERNAL_YDSTOWS( dc, output->otmAscent);
|
||||
+ output->otmDescent = INTERNAL_YDSTOWS( dc, output->otmDescent);
|
||||
output->otmLineGap = INTERNAL_YDSTOWS(dc, output->otmLineGap);
|
||||
output->otmsCapEmHeight = INTERNAL_YDSTOWS(dc, output->otmsCapEmHeight);
|
||||
output->otmsXHeight = INTERNAL_YDSTOWS(dc, output->otmsXHeight);
|
||||
- output->otmrcFontBox.top = height_to_LP( dc, output->otmrcFontBox.top);
|
||||
- output->otmrcFontBox.bottom = height_to_LP( dc, output->otmrcFontBox.bottom);
|
||||
- output->otmrcFontBox.left = width_to_LP( dc, output->otmrcFontBox.left);
|
||||
- output->otmrcFontBox.right = width_to_LP( dc, output->otmrcFontBox.right);
|
||||
- output->otmMacAscent = height_to_LP( dc, output->otmMacAscent);
|
||||
- output->otmMacDescent = height_to_LP( dc, output->otmMacDescent);
|
||||
+ output->otmrcFontBox.top = INTERNAL_YDSTOWS( dc, output->otmrcFontBox.top);
|
||||
+ output->otmrcFontBox.bottom = INTERNAL_YDSTOWS( dc, output->otmrcFontBox.bottom);
|
||||
+ output->otmrcFontBox.left = INTERNAL_XDSTOWS( dc, output->otmrcFontBox.left);
|
||||
+ output->otmrcFontBox.right = INTERNAL_XDSTOWS( dc, output->otmrcFontBox.right);
|
||||
+ output->otmMacAscent = INTERNAL_YDSTOWS( dc, output->otmMacAscent);
|
||||
+ output->otmMacDescent = INTERNAL_YDSTOWS( dc, output->otmMacDescent);
|
||||
output->otmMacLineGap = INTERNAL_YDSTOWS(dc, output->otmMacLineGap);
|
||||
- output->otmptSubscriptSize.x = width_to_LP( dc, output->otmptSubscriptSize.x);
|
||||
- output->otmptSubscriptSize.y = height_to_LP( dc, output->otmptSubscriptSize.y);
|
||||
- output->otmptSubscriptOffset.x = width_to_LP( dc, output->otmptSubscriptOffset.x);
|
||||
- output->otmptSubscriptOffset.y = height_to_LP( dc, output->otmptSubscriptOffset.y);
|
||||
- output->otmptSuperscriptSize.x = width_to_LP( dc, output->otmptSuperscriptSize.x);
|
||||
- output->otmptSuperscriptSize.y = height_to_LP( dc, output->otmptSuperscriptSize.y);
|
||||
- output->otmptSuperscriptOffset.x = width_to_LP( dc, output->otmptSuperscriptOffset.x);
|
||||
- output->otmptSuperscriptOffset.y = height_to_LP( dc, output->otmptSuperscriptOffset.y);
|
||||
+ output->otmptSubscriptSize.x = INTERNAL_XDSTOWS( dc, output->otmptSubscriptSize.x);
|
||||
+ output->otmptSubscriptSize.y = INTERNAL_YDSTOWS( dc, output->otmptSubscriptSize.y);
|
||||
+ output->otmptSubscriptOffset.x = INTERNAL_XDSTOWS( dc, output->otmptSubscriptOffset.x);
|
||||
+ output->otmptSubscriptOffset.y = INTERNAL_YDSTOWS( dc, output->otmptSubscriptOffset.y);
|
||||
+ output->otmptSuperscriptSize.x = INTERNAL_XDSTOWS( dc, output->otmptSuperscriptSize.x);
|
||||
+ output->otmptSuperscriptSize.y = INTERNAL_YDSTOWS( dc, output->otmptSuperscriptSize.y);
|
||||
+ output->otmptSuperscriptOffset.x = INTERNAL_XDSTOWS( dc, output->otmptSuperscriptOffset.x);
|
||||
+ output->otmptSuperscriptOffset.y = INTERNAL_YDSTOWS( dc, output->otmptSuperscriptOffset.y);
|
||||
output->otmsStrikeoutSize = INTERNAL_YDSTOWS(dc, output->otmsStrikeoutSize);
|
||||
- output->otmsStrikeoutPosition = height_to_LP( dc, output->otmsStrikeoutPosition);
|
||||
- output->otmsUnderscoreSize = height_to_LP( dc, output->otmsUnderscoreSize);
|
||||
- output->otmsUnderscorePosition = height_to_LP( dc, output->otmsUnderscorePosition);
|
||||
+ output->otmsStrikeoutPosition = INTERNAL_YDSTOWS( dc, output->otmsStrikeoutPosition);
|
||||
+ output->otmsUnderscoreSize = INTERNAL_YDSTOWS( dc, output->otmsUnderscoreSize);
|
||||
+ output->otmsUnderscorePosition = INTERNAL_YDSTOWS( dc, output->otmsUnderscorePosition);
|
||||
|
||||
if(output != lpOTM)
|
||||
{
|
||||
@@ -5554,7 +5544,7 @@ BOOL WINAPI NtGdiGetCharWidthW( HDC hdc, UINT first, UINT last, WCHAR *chars,
|
||||
INT *buffer = buf;
|
||||
/* convert device units to logical */
|
||||
for (i = 0; i < count; i++)
|
||||
- buffer[i] = width_to_LP( dc, buffer[i] );
|
||||
+ buffer[i] = INTERNAL_XDSTOWS( dc, buffer[i] );
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -5853,7 +5843,7 @@ BOOL nulldrv_ExtTextOut( PHYSDEV dev, INT x, INT y, UINT flags, const RECT *rect
|
||||
*/
|
||||
static inline int get_line_width( DC *dc, int metric_size )
|
||||
{
|
||||
- int width = abs( INTERNAL_YWSTODS( dc, metric_size ));
|
||||
+ int width = abs( INTERNAL_XWSTODS( dc, metric_size ));
|
||||
if (width == 0) width = 1;
|
||||
if (metric_size < 0) width = -width;
|
||||
return width;
|
||||
@@ -6287,9 +6277,9 @@ BOOL WINAPI NtGdiGetCharABCWidthsW( HDC hdc, UINT first, UINT last, WCHAR *chars
|
||||
/* convert device units to logical */
|
||||
for (i = 0; i < count; i++)
|
||||
{
|
||||
- abc[i].abcA = width_to_LP( dc, abc[i].abcA );
|
||||
- abc[i].abcB = width_to_LP( dc, abc[i].abcB );
|
||||
- abc[i].abcC = width_to_LP( dc, abc[i].abcC );
|
||||
+ abc[i].abcA = INTERNAL_XDSTOWS( dc, abc[i].abcA );
|
||||
+ abc[i].abcB = INTERNAL_XDSTOWS( dc, abc[i].abcB );
|
||||
+ abc[i].abcC = INTERNAL_XDSTOWS( dc, abc[i].abcC );
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -7078,8 +7068,8 @@ BOOL WINAPI NtGdiGetCharWidthInfo( HDC hdc, struct char_width_info *info )
|
||||
|
||||
if (ret)
|
||||
{
|
||||
- info->lsb = width_to_LP( dc, info->lsb );
|
||||
- info->rsb = width_to_LP( dc, info->rsb );
|
||||
+ info->lsb = INTERNAL_XDSTOWS( dc, info->lsb );
|
||||
+ info->rsb = INTERNAL_XDSTOWS( dc, info->rsb );
|
||||
}
|
||||
release_dc_ptr(dc);
|
||||
return ret;
|
||||
--
|
||||
2.46.0
|
||||
|
@@ -0,0 +1,55 @@
|
||||
From 33d132644a7398e4a3a17f1745dcb626ea6694af Mon Sep 17 00:00:00 2001
|
||||
From: Dmitry Timoshkov <dmitry@baikal.ru>
|
||||
Date: Wed, 22 Nov 2023 11:51:23 +0300
|
||||
Subject: [PATCH 2/2] win32u: NtGdiExtTextOutW() should translate x,y from
|
||||
logical to device units at the last step.
|
||||
|
||||
Bug: https://bugs.winehq.org/show_bug.cgi?id=33190
|
||||
|
||||
Signed-off-by: Dmitry Timoshkov <dmitry@baikal.ru>
|
||||
---
|
||||
dlls/win32u/font.c | 14 ++++++--------
|
||||
1 file changed, 6 insertions(+), 8 deletions(-)
|
||||
|
||||
diff --git a/dlls/win32u/font.c b/dlls/win32u/font.c
|
||||
index 8fbd8dc3f01..f32becbe669 100644
|
||||
--- a/dlls/win32u/font.c
|
||||
+++ b/dlls/win32u/font.c
|
||||
@@ -5972,12 +5972,6 @@ BOOL WINAPI NtGdiExtTextOutW( HDC hdc, INT x, INT y, UINT flags, const RECT *lpr
|
||||
goto done;
|
||||
}
|
||||
|
||||
- pt.x = x;
|
||||
- pt.y = y;
|
||||
- lp_to_dp(dc, &pt, 1);
|
||||
- x = pt.x;
|
||||
- y = pt.y;
|
||||
-
|
||||
char_extra = dc->attr->char_extra;
|
||||
if (char_extra && lpDx && NtGdiGetDeviceCaps( hdc, TECHNOLOGY ) == DT_RASPRINTER)
|
||||
char_extra = 0; /* Printer drivers don't add char_extra if lpDx is supplied */
|
||||
@@ -6074,8 +6068,6 @@ BOOL WINAPI NtGdiExtTextOutW( HDC hdc, INT x, INT y, UINT flags, const RECT *lpr
|
||||
width = desired[1];
|
||||
}
|
||||
|
||||
- tm.tmAscent = abs(INTERNAL_YWSTODS(dc, tm.tmAscent));
|
||||
- tm.tmDescent = abs(INTERNAL_YWSTODS(dc, tm.tmDescent));
|
||||
switch( align & (TA_LEFT | TA_RIGHT | TA_CENTER) )
|
||||
{
|
||||
case TA_LEFT:
|
||||
@@ -6143,6 +6135,12 @@ BOOL WINAPI NtGdiExtTextOutW( HDC hdc, INT x, INT y, UINT flags, const RECT *lpr
|
||||
}
|
||||
}
|
||||
|
||||
+ pt.x = x;
|
||||
+ pt.y = y;
|
||||
+ lp_to_dp(dc, &pt, 1);
|
||||
+ x = pt.x;
|
||||
+ y = pt.y;
|
||||
+
|
||||
ret = physdev->funcs->pExtTextOut( physdev, x, y, (flags & ~ETO_OPAQUE), &rc,
|
||||
str, count, (INT*)deltas );
|
||||
|
||||
--
|
||||
2.46.0
|
||||
|
3
patches/win32u-NtGdiExtTextOutW-rotation/definition
Normal file
3
patches/win32u-NtGdiExtTextOutW-rotation/definition
Normal file
@@ -0,0 +1,3 @@
|
||||
Fixes [33190]: win32u - Fix rendering of the rotated and scaled text.
|
||||
|
||||
# Merge Request !5068
|
@@ -1 +1 @@
|
||||
Wine Staging 9.19
|
||||
Wine Staging 9.20
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user