Module: wine
Branch: master
Commit: e17ae0dc0fa5535ed4646696c4d81d7f72ba3ce5
URL: https://source.winehq.org/git/wine.git/?a=commit;h=e17ae0dc0fa5535ed4646696…
Author: Rémi Bernon <rbernon(a)codeweavers.com>
Date: Tue Jan 19 14:04:51 2021 +0100
include: Add windows.media.speechsynthesis.idl stub.
Signed-off-by: Rémi Bernon <rbernon(a)codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard(a)winehq.org>
---
include/Makefile.in | 1 +
include/windows.media.speechsynthesis.idl | 47 +++++++++++++++++++++++++++++++
2 files changed, 48 insertions(+)
diff --git a/include/Makefile.in b/include/Makefile.in
index 74a1d8e0c89..fc5ffbbc721 100644
--- a/include/Makefile.in
+++ b/include/Makefile.in
@@ -746,6 +746,7 @@ SOURCES = \
windns.h \
windows.foundation.idl \
windows.h \
+ windows.media.speechsynthesis.idl \
windowscontracts.idl \
windowsx.h \
wine/debug.h \
diff --git a/include/windows.media.speechsynthesis.idl b/include/windows.media.speechsynthesis.idl
new file mode 100644
index 00000000000..7a1de5fcba6
--- /dev/null
+++ b/include/windows.media.speechsynthesis.idl
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2020 Rémi Bernon for CodeWeavers
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifdef __WIDL__
+#pragma winrt ns_prefix
+#endif
+
+import "inspectable.idl";
+import "windows.foundation.idl";
+
+namespace Windows {
+ namespace Media {
+ namespace SpeechSynthesis {
+ typedef enum VoiceGender VoiceGender;
+ interface IInstalledVoicesStatic;
+ interface IVoiceInformation;
+ }
+ }
+}
+
+namespace Windows {
+ namespace Media {
+ namespace SpeechSynthesis {
+ [contract(Windows.Foundation.UniversalApiContract, 1.0)]
+ enum VoiceGender
+ {
+ Male = 0,
+ Female = 1
+ };
+ }
+ }
+}
Module: wine
Branch: master
Commit: 9c138562fe4f6ceffb6cfe5cc7ecdf6a89e993cb
URL: https://source.winehq.org/git/wine.git/?a=commit;h=9c138562fe4f6ceffb6cfe5c…
Author: Zebediah Figura <z.figura12(a)gmail.com>
Date: Tue Jan 19 21:35:38 2021 -0600
winegstreamer: Manage our own streaming thread.
This is a rather large and complex change. It comprises several parts:
(1) Instead of directly sending EOS, segment, and sample events to the
downstream DirectShow sink, first queue them in a local buffer (i.e.
"pin->event").
(2) Spawn a separate thread per source pin (i.e. "stream_thread") which consumes
said events and sends them downstream.
(3) When flushing or stopping, explicitly wait for this thread to pause or stop
(respectively).
There are a few reasons for this:
(1) It reduces the number of Unix -> PE callbacks we need to make, easing PE
conversion. This is not a great advantage *a priori*, and may not be worth a
similar dedicated "handler" thread for most modules, but winegstreamer is
different—we were already marshalling these calls onto another thread, and
now that marshalling can go away (almost).
(2) Because GStreamer can only do pad negotiation (and hence autoplugging) while
running (in contrast to DirectShow, which can do it while stopped), we
currently have to renegotiate every time the pipeline is started. Most
applications don't start the graph more than once, but even that requires
two negotiations, and startup time is demonstrably too high. It would be
nice to keep the graph in PAUSED state all of the time, but this is
difficult to do without more fine-grained control over the streaming thread.
[In particular, we cannot reliably wait for all samples to be delivered
except by stopping the GStreamer pipeline.]
Signed-off-by: Zebediah Figura <z.figura12(a)gmail.com>
Signed-off-by: Alexandre Julliard <julliard(a)winehq.org>
---
dlls/winegstreamer/gst_private.h | 1 +
dlls/winegstreamer/gstdemux.c | 340 +++++++++++++++++++++++++++++++++------
2 files changed, 289 insertions(+), 52 deletions(-)
Diff: https://source.winehq.org/git/wine.git/?a=commitdiff;h=9c138562fe4f6ceffb6c…
Module: tools
Branch: master
Commit: 1b3cd386fb5b51525336b721c4027c9042394da8
URL: https://source.winehq.org/git/tools.git/?a=commit;h=1b3cd386fb5b51525336b72…
Author: Francois Gouget <fgouget(a)codeweavers.com>
Date: Wed Jan 20 13:57:00 2021 +0100
testbot/TestWTBS: Allow verifying the presence of specific errors.
This allows verifying that the TestBot detected the errors issued by the
test suite; or reported the expected consistency issues.
For instance:
----- TestWTBS -----
g 0 tests.report.Report validation errors
n 0 kernel32:comm has unaccounted for failure messages
----- TestWTBS -----
Signed-off-by: Francois Gouget <fgouget(a)codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard(a)winehq.org>
---
testbot/tests/TestWTBS | 114 +++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 114 insertions(+)
diff --git a/testbot/tests/TestWTBS b/testbot/tests/TestWTBS
index 6e1e7ed..af43060 100755
--- a/testbot/tests/TestWTBS
+++ b/testbot/tests/TestWTBS
@@ -297,6 +297,24 @@ sub LoadTestInfo($)
fail("$FileName: $Entry is not a valid property name");
}
}
+ foreach my $RawGroupName (@{$RawInfo->{ErrGroupNames}})
+ {
+ my $GroupName = lcfirst($RawGroupName);
+ if ($GroupName =~ s/^(tasks|build|tests|win|win32|win64|wine)\.(log|report)\.//)
+ {
+ my $ErrInfo = ($TestInfo->{$1}->{"$2.errors"} ||= {});
+ push @{$ErrInfo->{ErrGroupNames}}, $GroupName;
+ my $ErrGroup = $RawInfo->{ErrGroups}->{$RawGroupName};
+ $ErrInfo->{ErrGroups}->{$GroupName} = $ErrGroup;
+ $ErrInfo->{ErrCount} += @{$ErrGroup->{Errors}};
+ $ErrInfo->{NewCount} += $ErrGroup->{NewCount} || 0;
+ $HasTestInfo = 1;
+ }
+ else
+ {
+ fail("$FileName: $RawGroupName is not a valid group name");
+ }
+ }
return undef if (!$HasTestInfo);
# Fill in some useful defaults
@@ -345,6 +363,95 @@ sub IsMailingListJob($)
return $Job->Remarks =~ /^\[\Q$PatchesMailingList\E\] /;
}
+=pod
+=item <tasks.(log|report).groupname>
+
+Verifies the presence of new errors in the specified error log or report
+of the tasks in the specified category. For this, list the group and errors
+that are expected to appear; where the group name is prefixed by the task
+category and either 'log' or 'report'.
+
+For instance:
+g 0 tests.report.kernel32
+n 0 comm.c:2210: Test failed: WTBS Simulate an unreported test failure
+g 0 tests.report.Report validation errors
+n 0 kernel32:comm has unaccounted for failure messages
+
+This checks that the 'comm.c' failure appears in the 'kernel32' group
+of the reports of all test tasks; that the TestBot issues a report consistency
+failure as well; and that no other new error is present. If no preexisting
+errors are expected, that is if test unit produces no failure when run outside
+the test suite, then one could also issue the following check:
+
+p tests.TestFailures 2
+
+=cut
+
+sub CheckLogErrors($$$)
+{
+ my ($LogInfo, $RefInfo, $LogKey) = @_;
+
+ foreach my $GroupName (@{$LogInfo->{ErrGroupNames}})
+ {
+ my $LogGroup = $LogInfo->{ErrGroups}->{$GroupName};
+
+ my $RefGroup = $RefInfo->{ErrGroups}->{$GroupName};
+ if ($RefGroup)
+ {
+ my $Diff = Algorithm::Diff->new($LogGroup->{Errors}, $RefGroup->{Errors},
+ { keyGen => \&WineTestBot::LogUtils::_GetLineKey });
+ my ($LogIndex, $RefIndex) = (0, 0);
+ while ($Diff->Next())
+ {
+ my $SameCount = $Diff->Same();
+ if ($SameCount)
+ {
+ $LogIndex += $SameCount;
+ $RefIndex += $SameCount;
+ }
+ else
+ {
+ # Check for extra new errors in the log
+ my $ExtraCount = $Diff->Items(1);
+ foreach (1..$ExtraCount)
+ {
+ next if (!$LogGroup->{IsNew}->[$LogIndex]);
+ fail("$LogKey has an unexpected new error in $GroupName: $LogGroup->{Errors}->[$LogIndex]");
+ $LogIndex++;
+ }
+ # And for missing expected errors
+ my $MissingCount = $Diff->Items(2);
+ foreach (1..$MissingCount)
+ {
+ fail("$LogKey is missing an error in $GroupName: $RefGroup->{Errors}->[$RefIndex]");
+ $RefIndex++;
+ }
+ }
+ }
+ }
+ else
+ {
+ # Check that the log's extra errors are old errors
+ foreach my $ErrIndex (0..@{$LogGroup->{Errors}} - 1)
+ {
+ next if (!$LogGroup->{IsNew}->[$ErrIndex]);
+ fail("$LogKey has an unexpected new error in $GroupName: $LogGroup->{Errors}->[$ErrIndex]");
+ }
+ }
+ }
+ foreach my $GroupName (@{$RefInfo->{ErrGroupNames}})
+ {
+ my $LogGroup = $LogInfo->{ErrGroups}->{$GroupName};
+ next if ($LogGroup);
+
+ my $RefGroup = $RefInfo->{ErrGroups}->{$GroupName};
+ foreach my $Error (@{$RefGroup->{Errors}})
+ {
+ fail("$LogKey is missing an error in $GroupName: $Error");
+ }
+ }
+}
+
=pod
=item <job.Status>
@@ -378,9 +485,16 @@ sub CheckTask($$$)
my $LogPath = $Task->GetDir() ."/$LogName";
my $LogInfo = LoadLogErrors($LogPath);
+ my $LogType = "log";
if ($LogName =~ /\.report$/)
{
$ReportCount++;
+ $LogType = "report";
+ }
+ if ($TaskInfo->{"$LogType.errors"})
+ {
+ CheckLogErrors($LogInfo, $TaskInfo->{"$LogType.errors"},
+ TaskKeyStr($Task) ."/$LogName");
}
}
if ($Task->Status eq "completed" and CheckValue($TaskInfo->{TestFailures}))
Module: wine
Branch: master
Commit: 82a9e8006321f5957963c4accc2f08887f724dd9
URL: https://source.winehq.org/git/wine.git/?a=commit;h=82a9e8006321f5957963c4ac…
Author: Henri Verbeet <hverbeet(a)codeweavers.com>
Date: Tue Jan 19 14:34:57 2021 +0100
wined3d: Add some barriers between resource usage on different bind points.
A typical case would be between using a texture as render target and using it
as a shader resource.
Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard(a)winehq.org>
---
dlls/wined3d/buffer.c | 31 +++++++++++++++++++++++++++++++
dlls/wined3d/context_vk.c | 34 ++++++++++++++++++++++++++--------
dlls/wined3d/resource.c | 24 +++++++++++++++++++++++-
dlls/wined3d/swapchain.c | 1 +
dlls/wined3d/texture.c | 37 ++++++++++++++++++++++---------------
dlls/wined3d/wined3d_private.h | 34 ++++++++++++++++++++++++++++++++++
6 files changed, 137 insertions(+), 24 deletions(-)
Diff: https://source.winehq.org/git/wine.git/?a=commitdiff;h=82a9e8006321f5957963…
Module: wine
Branch: master
Commit: 4ce1d7f93a35322d149cbde29d619e2580159a80
URL: https://source.winehq.org/git/wine.git/?a=commit;h=4ce1d7f93a35322d149cbde2…
Author: Henri Verbeet <hverbeet(a)codeweavers.com>
Date: Tue Jan 19 14:34:55 2021 +0100
ddraw: Use BitBlt() for exclusive mode frontbuffer updates if the swapchain window is not in the foreground.
Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard(a)winehq.org>
---
dlls/ddraw/surface.c | 41 ++++++++++++++++++++++++++++++++++-------
1 file changed, 34 insertions(+), 7 deletions(-)
diff --git a/dlls/ddraw/surface.c b/dlls/ddraw/surface.c
index fd788a96ac0..0ca19d4f8a5 100644
--- a/dlls/ddraw/surface.c
+++ b/dlls/ddraw/surface.c
@@ -39,6 +39,16 @@ static BOOL ddraw_surface_is_lost(const struct ddraw_surface *surface)
&& (surface->ddraw->device_state != DDRAW_DEVICE_STATE_OK || surface->is_lost);
}
+static BOOL ddraw_gdi_is_front(struct ddraw *ddraw)
+{
+ struct ddraw_surface *surface;
+
+ if (!ddraw->gdi_surface || !(surface = wined3d_texture_get_sub_resource_parent(ddraw->gdi_surface, 0)))
+ return FALSE;
+
+ return surface->surface_desc.ddsCaps.dwCaps & DDSCAPS_FRONTBUFFER;
+}
+
/* This is slow, of course. Also, in case of locks, we can't prevent other
* applications from drawing to the screen while we've locked the frontbuffer.
* We'd like to do this in wined3d instead, but for that to work wined3d needs
@@ -46,6 +56,7 @@ static BOOL ddraw_surface_is_lost(const struct ddraw_surface *surface)
HRESULT ddraw_surface_update_frontbuffer(struct ddraw_surface *surface,
const RECT *rect, BOOL read, unsigned int swap_interval)
{
+ struct ddraw *ddraw = surface->ddraw;
struct wined3d_texture *dst_texture;
HDC surface_dc, screen_dc;
int x, y, w, h;
@@ -53,9 +64,9 @@ HRESULT ddraw_surface_update_frontbuffer(struct ddraw_surface *surface,
BOOL ret;
RECT r;
- if (surface->ddraw->flags & DDRAW_SWAPPED && !read)
+ if (ddraw->flags & DDRAW_SWAPPED && !read)
{
- surface->ddraw->flags &= ~DDRAW_SWAPPED;
+ ddraw->flags &= ~DDRAW_SWAPPED;
rect = NULL;
}
@@ -73,7 +84,23 @@ HRESULT ddraw_surface_update_frontbuffer(struct ddraw_surface *surface,
if (w <= 0 || h <= 0)
return DD_OK;
- if (surface->ddraw->swapchain_window)
+ /* The interaction between ddraw and GDI drawing is not all that well
+ * documented, and somewhat arcane. In ddraw exclusive mode, GDI draws
+ * seemingly go to the *original* frontbuffer/primary surface, while ddraw
+ * draws/flips go to the *current* frontbuffer surface. The bottom line is
+ * that if the current frontbuffer is not the GDI frontbuffer, and there's
+ * e.g. a popup window in front of the ddraw swapchain window, we can't
+ * use wined3d_swapchain_present() to get the ddraw contents to the screen
+ * while in exclusive mode, since it would get obscured by the popup
+ * window. On the other hand, if the current frontbuffer *is* the GDI
+ * frontbuffer, that's what's supposed to happen; the popup should obscure
+ * (oart of) the ddraw swapchain window.
+ *
+ * This affects the "Deer Hunter" demo, which uses a popup window and GDI
+ * draws to draw part of the user interface. See also the "fswindow"
+ * sample is the DirectX 7 SDK. */
+ if (ddraw->swapchain_window && (!(ddraw->cooperative_level & DDSCL_EXCLUSIVE)
+ || ddraw->swapchain_window == GetForegroundWindow() || ddraw_gdi_is_front(ddraw)))
{
/* Nothing to do, we control the frontbuffer, or at least the parts we
* care about. */
@@ -81,15 +108,15 @@ HRESULT ddraw_surface_update_frontbuffer(struct ddraw_surface *surface,
return DD_OK;
if (swap_interval)
- dst_texture = wined3d_swapchain_get_back_buffer(surface->ddraw->wined3d_swapchain, 0);
+ dst_texture = wined3d_swapchain_get_back_buffer(ddraw->wined3d_swapchain, 0);
else
- dst_texture = surface->ddraw->wined3d_frontbuffer;
+ dst_texture = ddraw->wined3d_frontbuffer;
if (SUCCEEDED(hr = wined3d_texture_blt(dst_texture, 0, rect, surface->wined3d_texture,
surface->sub_resource_idx, rect, 0, NULL, WINED3D_TEXF_POINT)) && swap_interval)
{
- hr = wined3d_swapchain_present(surface->ddraw->wined3d_swapchain, rect, rect, NULL, swap_interval, 0);
- surface->ddraw->flags |= DDRAW_SWAPPED;
+ hr = wined3d_swapchain_present(ddraw->wined3d_swapchain, rect, rect, NULL, swap_interval, 0);
+ ddraw->flags |= DDRAW_SWAPPED;
}
return hr;
}