Some applications (e.g. UE4) requires
the DriverVersion string in the registry.
The string is taken from `dlls/wbemprox/builtin.c`
--
v3: win32u: Add DriverVersion string for GPUs to registry
https://gitlab.winehq.org/wine/wine/-/merge_requests/3104
Recap:
I implemented relative addressing in !229, but I was suggested to handle register indexes by moving all the registers to the heap, which I did in my [nonconst-offsets-6](https://gitlab.winehq.org/fcasas/vkd3d/-/commits/noncon… branch. A part of this implementation required !269, but I was asked to try to turn the sm4 register structs into the vkd3d-shader register structs instead, to get closer to a common low level IR.
This is the first part of that transformation. The whole thing is in my [use_vkd3d_reg](https://gitlab.winehq.org/fcasas/vkd3d/-/commits/use_vkd3d_r… branch.
~~This is built on top of !225 (the first two patches), so it may be good to get that upstream first.~~
---
This patch series aims to do the following replacements:
```
struct sm4_register -> struct vkd3d_shader_register
struct sm4_dst_register -> struct vkd3d_shader_dst_param
struct sm4_src_register -> struct vkd3d_shader_src_param
```
to get us closer to a common level IR and simplify the implementation of relative-addressing.
To achieve this, the fields in the sm4 register structs are replaced with fields in the vkd3d-shader structs or removed altogether, one at the time.
As can be seen when looking at the whole branch, it is possible to do this transformation without having to add additional fields to `struct vkd3d_shader_register`, by restricting each register type to a single `enum vkd3d_sm4_dimension` (and its src registers to a single `enum vkd3d_sm4_swizzle_type`) by default.
The only exception we need so far is for sampler registers: They always have dimension NONE, except when used as arguments of gather instructions, in which case they have dimension VEC4 and SCALAR swizzle. This, and similar exceptions we may find in the future, can be handled using the opcode_info, as in 7/8 [81e17506](https://gitlab.winehq.org/fcasas/vkd3d/-/commit/81e17506ba2cb1fbf….
--
v3: vkd3d-shader/tpf: Get rid of sm4_register.dim.
vkd3d-shader/tpf: Use 's' in src_info to expect sampler register with vec4 dimension.
vkd3d-shader/tpf: Separate dst register write function.
vkd3d-shader/tpf: Separate src register write function.
vkd3d-shader/tpf: Make register_type_table an array of structs.
vkd3d-shader/tpf: Use struct vkd3d_shader_register_index in sm4_register.idx[].
vkd3d-shader/tpf: Allow passing NULL register type on hlsl_sm4_register_from_semantic().
vkd3d-shader/tpf: Use enum vkd3d_shader_register_type in sm4_register.type.
https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/281
--
v10: vkd3d-shader/tpf: Add support for writing 'resinfo' instruction.
vkd3d-shader/tpf: Add support for writing 'sampleinfo' instruction.
vkd3d-shader/hlsl: Parse GetDimensions() method.
tests: Add some tests for GetDimensions().
https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/218
Same as MR !2394
Signed-off-by: Zhao Yi zhaoyi(a)uniontech.com
--
v6: comctl32/listview: Reset bNoItemMetrics to TRUE in LISTVIEW_DeleteAllItems() to arrange listview items.
https://gitlab.winehq.org/wine/wine/-/merge_requests/3392
On Wed Jul 26 19:17:48 2023 +0000, Nikolay Sivov wrote:
> I had to learn what's going on in there once again. I think what we need
> to do is basically stop using 'presenter->cs' in the streaming thread
> entirely, MFVP_MESSAGE_ENDSTREAMING handling will remain unchanged.
> This means two things:
> - queue itself should be protected with its own lock;
> - video_presenter_process_input() should not be called in the streaming
> thread all. Instead it could be called right in
> video_presenter_allocator_cb_NotifyRelease(), with appropriate locking.
It's slightly more complicated, I can see now why EVRM_PROCESS_INPUT was added - it was probably to avoid interacting with tracking thread. The point still stands, I think we'll need to remove remaining presenter lock from streaming thread, one way or another.
--
https://gitlab.winehq.org/wine/wine/-/merge_requests/3319#note_40394
This get us pass the "Update your browser" blocker in adobe's sign-in page. The page itself doesn't make use of `window.MutationObserver`.
However the sign-in page is still broken.
--
v16: mshtml: add stubs for MutationObserver methods
mshtml: implement window.MutationObserver with MutationObserver stub
https://gitlab.winehq.org/wine/wine/-/merge_requests/3391
On Wed Jul 26 17:26:57 2023 +0000, Santino Mazza wrote:
> Oh I just saw that we have `PRESENTER_MIXER_HAS_INPUT` flag and is set
> when it receives the `MFVP_MESSAGE_PROCESSINPUTNOTIFY` message, but when
> the streaming thread receives the `EVRM_PROCESS_INPUT` message it
> doesn't set that flag, shouldn't we set that flag and check for it
> before waiting for the thread?
I had to learn what's going on in there once again. I think what we need to do is basically stop using 'presenter->cs' in the streaming thread entirely, MFVP_MESSAGE_ENDSTREAMING handling will remain unchanged.
This means two things:
- queue itself should be protected with its own lock;
- video_presenter_process_input() should not be called in the streaming thread all. Instead it could be called right in video_presenter_allocator_cb_NotifyRelease(), with appropriate locking.
--
https://gitlab.winehq.org/wine/wine/-/merge_requests/3319#note_40382
This get us pass the "Update your browser" blocker in adobe's sign-in page. The page itself doesn't make use of `window.MutationObserver`.
However the sign-in page is still broken.
--
v15: mshtml: add stubs for MutationObserver methods
mshtml: implement window.MutationObserver with MutationObserver stub
https://gitlab.winehq.org/wine/wine/-/merge_requests/3391
On Wed Jul 26 17:25:19 2023 +0000, Santino Mazza wrote:
> mmm, what about adding a timeout for WaitForSingleObject and do the
> LeaveCriticalSection if the timeout passed? Not sure how long it should be.
Oh I just saw that we have `PRESENTER_MIXER_HAS_INPUT` flag and is set when it receives the `MFVP_MESSAGE_PROCESSINPUTNOTIFY` message, but when the streaming thread receives the `EVRM_PROCESS_INPUT` message it doesn't set that flag, shouldn't we set that flag and check for it before waiting for the thread?
--
https://gitlab.winehq.org/wine/wine/-/merge_requests/3319#note_40361
This is meant to simplify testing conditions that generally hold true
but may occasionally fail due to interference from external factors
(such as processes that start / stop, network connections being
opened / closed, etc).
The trick is to loop a few times on the set of flaky conditions until
they succeed. During the last attempt all failures are recorded as
usual, while in the previous runs, the tryok() failures area ignored
but cause one more attempt to be made.
The simplest case looks like this:
LOOP_ON_FLAKY_TESTS(3)
{
// ok() failures are never ignored and not retried
ok(..., "check 1", ...);
// tryok() failures are ignored except on the last attempt
tryok(..., "check 2", ...);
}
There is also:
* attempt_retry() which marks the current attempt as failed as if
calling tryok(0), and returns true if another attempt can be made.
* attempt_failed() which returns true if an ok() call failed.
---
This is independent from the 'flaky' mechanism which adds some naming
constraints. The loop macro is still called LOOP_ON_FLAKY_TESTS()
despite being unrelated to the flaky mechanism. The attempt_retry()
and attempt_failed() macro names also don't make it obvious that they
are related to tryok().
I think this mechanism is better than the flaky one because a flaky test
can go bad without anyone noticing, whereas if a tryok() starts failing
systematically it will cause a real failure.
The other side of that coin is that, unlike flaky, the tryok()
mechanism does not entirely eliminate the possibility of getting a
failure, it just reduces it; though by adjusting the maximum number of
attempts one can achieve an arbitrarily low failure rate. For instance
if an ok() call fails 10% of the time and one wants a maximum of 1 in
a million failure rate, use LOOP_ON_FLAKY_TESTS(6). The cost is an
increased run time in the worst case.
This also limits the use of this mechanism to tests that have a
reasonably low failure rate to start with (otherwise one has to loop
too many times). Also note that there are cases where looping
essentially reduce the failure rate to zero. For instance
ieframe:webbrowser fails if IE creates a net session while the test is
counting them. But IE only creates the one net session on start up so
trying even one more time should guarantee that the test will succeed.
Other cases like scheduling delays and the creation of network
connections are more probabilistic in nature. Maybe a comment in test.h
should offer some guideline as to the target failure rate.
Eventually this may replace the flaky mechanism but that depends on
how well it works in practice and how practical it is to loop on flaky
tests. It seems to be going well in the few cases I looked at. But I
think this mechanism has value even if the two end up coexisting
indefinitely.
This MR uses the tryok() in some actual tests for illustration and testing purposes. The final MR will probably split most of those off to separate MRs.
--
v2: mmdevapi/tests: Replace flaky with tryok() in the capture tests.
mmdevapi/tests: Replace flaky with tryok() in the render tests.
quartz/tests: Replace flaky() with tryok() to work around scheduling delays.
DEBUG ieframe/tests: tryok() framework testing ground.
ieframe/tests: Work around a network session race condition.
advapi32/tests: Replace the custom loop with tryok() mechanism.
https://gitlab.winehq.org/wine/wine/-/merge_requests/3418
On Wed Jul 26 15:17:52 2023 +0000, Nikolay Sivov wrote:
> This should be arranged differently, you can't generally assume that
> you've entered this lock when calling the helper.
mmm, what about adding a timeout for WaitForSingleObject and do the LeaveCriticalSection if the timeout passed? Not sure how long it should be.
--
https://gitlab.winehq.org/wine/wine/-/merge_requests/3319#note_40359
On Wed Jul 26 15:17:52 2023 +0000, Nikolay Sivov wrote:
> This does hang on my system, but is it reliable or is it depending on
> calls made close one after another in time?
It's definitely not a reliable way to test for this behavior, but I'm not sure how could I do it.
--
https://gitlab.winehq.org/wine/wine/-/merge_requests/3319#note_40353
Nikolay Sivov (@nsivov) commented about dlls/evr/presenter.c:
>
> PostThreadMessageW(presenter->thread.tid, EVRM_STOP, 0, 0);
>
> + /* Make sure streaming thread is not blocked by critical section before waiting for it. */
> + LeaveCriticalSection(&presenter->cs);
> WaitForSingleObject(presenter->thread.hthread, INFINITE);
> CloseHandle(presenter->thread.hthread);
> + EnterCriticalSection(&presenter->cs);
>
This should be arranged differently, you can't generally assume that you've entered this lock when calling the helper.
--
https://gitlab.winehq.org/wine/wine/-/merge_requests/3319#note_40348
Ensured to work with both the current `klist` implementation and the one modified to use KerbQueryTicketCacheExMessage. Patch for `klist` will be sent separately.
--
v5: dlls/kerberos: Implement KerbQueryTicketCacheExMessage.
https://gitlab.winehq.org/wine/wine/-/merge_requests/3393
This is meant to simplify testing conditions that generally hold true
but may occasionally fail due to interference from external factors
(such as processes that start / stop, network connections being
opened / closed, etc).
The trick is to loop a few times on the set of flaky conditions until
they succeed. During the last attempt all failures are recorded as
usual, while in the previous runs, the tryok() failures area ignored
but cause one more attempt to be made.
The simplest case looks like this:
LOOP_ON_FLAKY_TESTS(3)
{
// ok() failures are never ignored and not retried
ok(..., "check 1", ...);
// tryok() failures are ignored except on the last attempt
tryok(..., "check 2", ...);
}
There is also:
* attempt_retry() which marks the current attempt as failed as if
calling tryok(0), and returns true if another attempt can be made.
* attempt_failed() which returns true if an ok() call failed.
---
This is independent from the 'flaky' mechanism which adds some naming
constraints. The loop macro is still called LOOP_ON_FLAKY_TESTS()
despite being unrelated to the flaky mechanism. The attempt_retry()
and attempt_failed() macro names also don't make it obvious that they
are related to tryok().
I think this mechanism is better than the flaky one because a flaky test
can go bad without anyone noticing, whereas if a tryok() starts failing
systematically it will cause a real failure.
The other side of that coin is that, unlike flaky, the tryok()
mechanism does not entirely eliminate the possibility of getting a
failure, it just reduces it; though by adjusting the maximum number of
attempts one can achieve an arbitrarily low failure rate. For instance
if an ok() call fails 10% of the time and one wants a maximum of 1 in
a million failure rate, use LOOP_ON_FLAKY_TESTS(6). The cost is an
increased run time in the worst case.
This also limits the use of this mechanism to tests that have a
reasonably low failure rate to start with (otherwise one has to loop
too many times). Also note that there are cases where looping
essentially reduce the failure rate to zero. For instance
ieframe:webbrowser fails if IE creates a net session while the test is
counting them. But IE only creates the one net session on start up so
trying even one more time should guarantee that the test will succeed.
Other cases like scheduling delays and the creation of network
connections are more probabilistic in nature. Maybe a comment in test.h
should offer some guideline as to the target failure rate.
Eventually this may replace the flaky mechanism but that depends on
how well it works in practice and how practical it is to loop on flaky
tests. It seems to be going well in the few cases I looked at. But I
think this mechanism has value even if the two end up coexisting
indefinitely.
This MR uses the tryok() in some actual tests for illustration and testing purposes. The final MR will probably split most of those off to separate MRs.
--
https://gitlab.winehq.org/wine/wine/-/merge_requests/3418
This get us pass the "Update your browser" blocker in adobe's sign-in page. The page itself doesn't make use of `window.MutationObserver`.
However the sign-in page is still broken.
--
v14: mshtml: add stubs for MutationObserver methods
mshtml: implement window.MutationObserver with MutationObserver stub
https://gitlab.winehq.org/wine/wine/-/merge_requests/3391
This is first part in a series that implements Cycle Collection for every mshtml object (dispex) and cleans up rest of the code based on it, which is obviously needed due to dynamic props and other extra object-specific refs.
In an effort to split it up as much as possible, since it already has quite a lot of restructuring and changes, some of the earlier patches will introduce temporary leaks or cyclic refs, but that's because we'll later handle them properly with the dispex CC. These shouldn't affect behavior, though, so it shouldn't pose problems for functionality.
Nodes are, initially, not changed much (other than to make it compatible with the dispex) to keep changes as small as possible. They still use their own CC mechanism and refcounting, which is hackish but that is solved in a follow-up MR, so it's temporary only.
Eventually, every object (including nodes) will use the dispex's vtbl to do its Cycle Collection, except for stuff like outer window (which is a special case).
In this first part, the objects that are using the node CC will have no-op dispex CC methods since they are using the node's, but this is temporary only.
--
https://gitlab.winehq.org/wine/wine/-/merge_requests/3408
Ensured to work with both the current `klist` implementation and the one modified to use KerbQueryTicketCacheExMessage. Patch for `klist` will be sent separately.
--
v4: dlls/kerberos: Implement KerbQueryTicketCacheExMessage.
https://gitlab.winehq.org/wine/wine/-/merge_requests/3393
This framework is present in all macOS SDKs we support, starting at macOS 10.13 and still present in macOS Sonoma.
Getting pcsclite completely working correctly is a lot harder on macOS and this would give us better integration.
--
v2: configure: Use PCSC.framework when pcsclite is not available on macOS.
https://gitlab.winehq.org/wine/wine/-/merge_requests/3389