--
v5: ntdll: Store exception reporting flags for debug events.
ntdll: Store exception reporting flags on suspend.
ntdll: Store exception reporting flags in server context.
ntdll: Set exception reporting flags in NtGetContextThread().
ntdll/tests: Add tests for CONTEXT_EXCEPTION_REQUEST.
https://gitlab.winehq.org/wine/wine/-/merge_requests/5480
I'm likely to add some of these while working on MSAA events, which aren't related to the MSAA events but are caused by other differences in Wine. I thought it'd be better to be able to properly mark todo's, so that we know when they're fixed.
This revealed some cases where we have an "optional" message for Wine, but Wine has since been fixed.
In a future MR, I plan to also rename winevent_hook_todo and use it more broadly for the opposite case.
--
https://gitlab.winehq.org/wine/wine/-/merge_requests/5546
--
v2: mf/session: Handle transform format changes and update downstream media types.
mf/session: Wrap samples in IMFMediaEvent list instead of IMFSample list.
mf/session: Introduce new session_get_topo_node_input helper.
mf/session: Introduce new session_get_topo_node_output helper.
mf/session: Get session topo_node from their IMFTopologyNode directly.
mf/session: Introduce new (allocate|release)_output_samples helpers.
https://gitlab.winehq.org/wine/wine/-/merge_requests/5450
This is a series of commits tackling dead key state handling and scan code to vkey mapping improvements (especially for French and German keyboards).
* https://gitlab.winehq.org/mzent/wine/-/commit/6c5c90b746cc341049eec216e3bb9…: Simplifies the logic a bit there and also correctly null-terminates dead keys in ToUnicodeEx
* https://gitlab.winehq.org/mzent/wine/-/commit/a05e2fc5068a22cae94bc800b4972…: Windows does not do it and some applications misbehave with this, fully fixed later in https://gitlab.winehq.org/mzent/wine/-/commit/7cf1f6a00f17b0626126448f77a1c…
* https://gitlab.winehq.org/mzent/wine/-/commit/4bd96932139a22f2c3b1311e44c43…: MSDN states single keys are always uppercased there.
* https://gitlab.winehq.org/mzent/wine/-/commit/bac8e97d7e6a7494672d76f5fc586…: There is a bug in `CFStringCompare` with the flags used there currently, resulting in the comparison of the identical buffers "ß" and "ß" to be false. In any case `UCCompareText` behaves correctly and is much faster there.
* https://gitlab.winehq.org/mzent/wine/-/commit/bac5f485a09fbddd39efb8f2c0d87…: I think this was an accidental mistake there, going through all modifiers first per symbol almost always results in the wrong match being made. The logic is adjusted there now to be similar to the other iterations involving `char_matches_string`.
* https://gitlab.winehq.org/mzent/wine/-/commit/ffde55df4ae3f6d53198839c58356…https://gitlab.winehq.org/mzent/wine/-/commit/a453d0d4c89c59c3e1ba6c24d2d0f…: Adds additional symbol vkey mappings (now completely maps a German Macintosh and PC keyboard correctly). There are still some minor defects with the French layout (around the ú region), however changing the symbol mapping there will cause issues with other layouts I think, since the wrong match happens very early there in the priority in these cases. With this change at least the number row is now behaving correctly. Additionally the French Macintosh keyboard layout is further complicated by the "=" key being next to right shift, which is in conflict with pretty much any other keyboard layout. To fix this properly would require a partial rewrite of the heuristic being used or a new approach, but most likely more of a long term project.
* https://gitlab.winehq.org/mzent/wine/-/commit/7cf1f6a00f17b0626126448f77a1c…: Gives dead keys friendly names in `GetKeyNameFriendlyText`, just like Windows does. I tried to be as exhaustive as possible, but if there are any missing the mapping can be easily extended.
All in all the incorrect scan code to vkey mapping is usually not that tragic, since an application would need to be aware of the layout and have its own mapping of scan codes of each (FFXIV does this though). The French layout corrections are now "good enough" to behave correctly for all the hotbar slots being assigned there with these changes now though.
--
v4: winemac.drv: Give dead keys a friendly name in GetKeyNameText.
winemac.drv: Add additional German symbol vkeys.
winemac.drv: Resolve symbol vkeys first without modifiers.
winemac.drv: Use UCCompareText in char_matches_string.
winemac.drv: Uppercase single keys in GetKeyNameText.
winemac.drv: Do not append " dead" to dead keycodes in GetKeyNameText.
winemac.drv: Handle length of dead keycodes in ToUnicodeEx correctly.
https://gitlab.winehq.org/wine/wine/-/merge_requests/5319
Fix for latest autodesk [fusion360 installer](https://github.com/cryinkfly/Autodesk-Fusion-360-for-Linux/issue… calling SHGetKnownFolderPath against [FOLDERID_UserPinned](https://learn.microsoft.com/lv-lv/windows/win32/shell/…
Trace Output pre-patch:
```
15285.659:057c:05c0:trace:shell:SHGetKnownFolderPath {9e3995ab-1f9c-4f13-b827-48b24b6c7174}, 0x00000000, 0000000000000000, 0000000003FB0D98
15285.659:057c:05c0:trace:shell:SHGetFolderPathAndSubDirW 0000000000000000,0x6c,0000000000000000,0,(null),000000000410E3F0
15285.659:057c:05c0:trace:shell:SHGetFolderPathAndSubDirW returning 0x80070057 (final path is L"")
15285.659:057c:05c0:trace:shell:SHGetKnownFolderPath Failed to get folder path, 0x80070057.
15285.659:057c:05c0:Ret shell32.SHGetKnownFolderPath() retval=80070057 ret=6ffff9774771
```
SHGetFolderPathAndSubDirW returns 0x57 invalid-parameter error (0x80070057) due to the folder array in shell32/shellpath.c having CSIDL_Type_Disallowed set on UserPinned and QuickLaunch folders.
--
https://gitlab.winehq.org/wine/wine/-/merge_requests/5525
Previously, `SetupDiGetINFClassW()` read INF files
with `GetPrivateProfileString()`, which does not substitute %strkey%
tokens.
This caused device installation to fail for devices which had driver
INF files using %strkey% tokens in Version section.
An example of such device is Vernier LabQuest Mini (08f7:0008) for
which Vernier's LoggerPro application includes a driver.
The INF file in question adds a new device setup class and has
following entries in Version section:
```
Class = %ClassName%
ClassGuid = %DeviceClassGUID%
```
Strings section includes following entries:
```
DeviceClassGUID = "{6B8429BF-10AD-4b66-9FBA-2FE72B891721}"
ClassName = "VST_WinUSB"
```
Previously, when LoggerPro was installed and LabQuest Mini was
hotplugged, device installation failed with the following error:
```
fixme:setupapi:SetupDiGetINFClassW failed to convert "L"%DeviceClassGUID"" into a guid
```
This caused GUID_NULL to be used and Class was not set to the registry
for the device.
With this commit, correct class GUID and names are set to the device
registry entry.
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=56579
--
v2: setupapi: use INF parser to read class GUID and class name
setupapi/tests: add tests for reading INF class with %strkey% tokens
https://gitlab.winehq.org/wine/wine/-/merge_requests/5519
Calling either SetViewportExtEx or SetWindowExtEx
fixes the viewport(MAPPING_FixIsotropic), but if both are called then it is fixed twice.
Then the mapping matrix will be incorrect and will not be calculated
using the values of viewport and wnd.
--
https://gitlab.winehq.org/wine/wine/-/merge_requests/5512
Includes !782 to prevent the 32-bit Windows CI crashing.
--
v11: vkd3d-shader/dxil: Support SV_Depth, SV_DepthGreaterEqual and SV_DepthLessEqual.
tests/hlsl: Add tests for SV_DepthLessEqual and SV_DepthGreaterEqual.
tests/hlsl: Add tests for SV_Depth.
https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/777
--
v16: vkd3d: Support aliased tile binding if available.
vkd3d: Implement ID3D12CommandQueue::UpdateTileMappings() for textures.
vkd3d: Implement ID3D12CommandQueue::UpdateTileMappings() for buffers.
vkd3d: Pre-bind sparse texture mip tails.
tests/d3d12: Add a test for freeing underlying memory of a reserved resource.
tests/d3d12: Add tests for UpdateTileMappings().
https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/631
Giovanni Mascellani (@giomasce) commented about libs/vkd3d-shader/hlsl.c:
> type->reg_size[HLSL_REGSET_TEXTURES] = 1;
> break;
>
> + case HLSL_CLASS_UAV:
> + type->reg_size[HLSL_REGSET_UAVS] = 1;
> + break;
Maybe you just don't care, but this could be
```c
case HLSL_CLASS_SAMPLER:
case HLSL_CLASS_TEXTURE:
case HLSL_CLASS_UAV:
type->reg_size[type_get_regset(type)] = 1;
break;
```
--
https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/781#note_67911
Giovanni Mascellani (@giomasce) commented about libs/vkd3d-shader/hlsl.c:
> return type->reg_size[regset];
> }
>
> +static struct hlsl_type *hlsl_new_simple_type(struct hlsl_ctx *ctx, const char *name, enum hlsl_type_class class)
> +{
> + struct hlsl_type *type;
> +
> + if (!(type = hlsl_alloc(ctx, sizeof(*type))))
> + return NULL;
> + if (!(type->name = hlsl_strdup(ctx, name)))
> + {
> + vkd3d_free(type);
> + return NULL;
> + }
> + type->class = class;
This doesn't set `dimx` and `dimy`, while in the documentation for `struct hlsl_type` we specify them for all classes. Either relaxing the specification or setting them here is fine for me, but at least one of those should happen, I think.
--
https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/781#note_67910
Giovanni Mascellani (@giomasce) commented about libs/vkd3d-shader/d3dbc.c:
> return D3DXPC_STRUCT;
> case HLSL_CLASS_VECTOR:
> return D3DXPC_VECTOR;
> - default:
> - ERR("Invalid class %#x.\n", type->class);
> - vkd3d_unreachable();
> + case HLSL_CLASS_VOID:
> + /* This shouldn't happen. */
Is the comment useful? Doesn't the following `vkd3d_unreachable()` already convey that information?
Also, could you please add a `break`? clang seems to be touchy about it:
```
../libs/vkd3d-shader/d3dbc.c:1521:30: error: label at end of compound statement: expected statement
case HLSL_CLASS_VOID:
^
;
1 error generated.
make[1]: *** [libs/vkd3d-shader/libvkd3d_shader_la-d3dbc.lo] Error 1
```
--
https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/781#note_67909
Shader Model 6 wave ops require instructions not available by extension in SPIR-V 1.0, and device support info is found in VkPhysicalDeviceSubgroupProperties, which also has no equivalent by extension in Vulkan 1.0.
--
v3: vkd3d-shader: Introduce a wave ops feature flag.
vkd3d: Use Vulkan 1.1 if available.
vkd3d-shader: Introduce SPIRV_ENVIRONMENT_VULKAN_1_1.
https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/776
~~This goes atop !773. The last three commits belong to this MR.~~
Trampolines and launchers allow us to handle code doing multilevel jumps, but they partially virtualize the control flow, which potentially makes the jobs of downstream compilers harder. So we avoid them every time we can.
--
v2: vkd3d-shader/ir: Only emit launchers when needed.
vkd3d-shader/ir: Only emit trampolines when needed.
vkd3d-shader/ir: Swap selection branches if the if branch is empty.
https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/785
These tests cover code paths untested in DXIL, except for the last commit which is to catch any signed int resource issues.
--
v3: tests/hlsl: Add tests for texture UAV signed atomics.
tests/hlsl: Add tests for texture UAV atomics.
tests/hlsl: Add a test for UAV InterlockedExchange().
tests/hlsl: Add a test for a structured UAV scalar store.
tests/hlsl: Add tests for min() and integer max().
https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/684
This should be the last piece of the puzzle for SNK games.
Basically, support for "if" conditionals for shader model 3.0 and 4.0.
This is achieved through the use of the `if_comp` instruction (VKD3DSIH_IFC), but these are not handled by the cf_flattener.
So I wrote `vsir_program_lower_ifc()` as a normalization pass to turn them into VKD3DSIH_IF in 3/4.
This requires translating the condition of IFC into a separate vsir comparison instruction. I think I got the mapping right in `get_handler_idx_from_rel_op()` but it would be good if someone with more experience in SPIR-V takes a close look.
--
https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/794
--
v3: ntdll: Store exception reporting flags for debug events.
ntdll: Store exception reporting flags on suspend.
ntdll: Store exception reporting flags in server context.
ntdll: Set exception reporting flags in NtGetContextThread().
ntdll/tests: Add tests for CONTEXT_EXCEPTION_REQUEST.
https://gitlab.winehq.org/wine/wine/-/merge_requests/5480
There is one FIXME left where I need advice: The treatment of not 8 byte aligned inputs in vkd3d_shader_cache_hash_key(), in particular regarding endianness. I think it is fairly theoretical as there are few big endian systems left that matter (and I don't have any), but I am not even sure if I am treating this right on little endian machines.
--
https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/791
Based on !723.
--
v3: vkd3d-shader/ir: Implement MAD in two operations if flagged as precise.
vkd3d-shader/ir: Move DCL_TEMPS removal to the generic instruction lowering pass.
https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/779
Hull Shaders contain two functions instead of just one, so all the algorithms that require computing a CFG need to be run twice. Here we refactor the code so that this can be done more easily.
This MR is relatively long, but it is essentially just moving code around, so hopefully it is not too difficult to review anyway.
--
v4: vkd3d-shader/ir: Split handling jumps when emitting a structured program.
vkd3d-shader/ir: Split handling selections when emitting a structured program.
vkd3d-shader/ir: Split handling loops when emitting a structured program.
vkd3d-shader/ir: Split handling blocks when emitting a structured program.
vkd3d-shader/ir: Refactor declaration emission outside of the CFG structure.
vkd3d-shader/ir: Split undominated SSA materialization.
vkd3d-shader/ir: Split program structurization.
https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/778
~~This goes atop !764. The last three commits belong to this MR.~~
Since we want to get rid of loops and 'break's as much as possible, we try to move 'break's out of selection constructs as much as possible so it's easier to match them with loops. This MR introduces a few other tricks to help that.
--
v4: vkd3d-shader/ir: Move breaks out of selections again after having optimized loops.
vkd3d-shader/ir: Append code to the non-breaking branch if there is breaking one.
vkd3d-shader/ir: Prepare for changing the destination list in vsir_cfg_optimize_recurse().
https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/773
I'm working on adding all the intrinsics we haven't implemented yet. Here's sinh, cosh, and tanh.
Sinh/cosh are implemented in the same commit because they forward to the same backing function (because the identities used only differ by a plus or minus).
--
v6: vkd3d-shader/hlsl: Implement tanh.
vkd3d-shader/hlsl: Implement hyperbolic sin and cos.
https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/740
Some tests require Vulkan extension VK_KHR_surface, which is not exposed by Mesa unless at least a platform is configured.
Hopefully this should at last make llvmpipe 24 not crash in d3d12.
--
https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/783
Includes !782 to prevent the 32-bit Windows CI crashing.
--
v10: vkd3d-shader/dxil: Support SV_Depth, SV_DepthGreaterEqual and SV_DepthLessEqual.
tests/hlsl: Add tests for SV_DepthLessEqual and SV_DepthGreaterEqual.
tests/hlsl: Add tests for SV_Depth.
https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/777
Creates test for the following things:
- Whether a combination of BackBufferCount + SwapEffect results in another buffer being added that acts as a front buffer. We used to have bugs caused by this in DXVK ages ago.
- GetFrontBufferData actually copying data from the front buffer to the target surface and not from one of the back buffers. This is motivated by a DXVK bug with a modded version of Silent Hill 2 we had recently.
- GetFrontBufferData produces a specific fixed alpha value depending on whether the swapchain is windowed or fullscreen. That's a TODO for now because neither Wine nor DXVK implements this and it's a bit annoying to implement this while not a single application is known to rely on this.
- GetFrontBufferData is supposed to capture a screenshot of the entire monitor. So this MR adds a test to make sure that the application window is positioned correctly in the target surface after calling GetFrontBufferData. Total War Medieval 2 actually hit this issue with DXVK on its loading screen in windowed mode.
All the new tests pass on Windows 11 on the Nvidia D3D9 driver.
--
v2: d3d9: Add test for GetFrontBufferData window placement.
https://gitlab.winehq.org/wine/wine/-/merge_requests/5500
Creates test for the following things:
- Whether a combination of BackBufferCount + SwapEffect results in another buffer being added that acts as a front buffer. We used to have bugs caused by this in DXVK ages ago.
- GetFrontBufferData actually copying data from the front buffer to the target surface and not from one of the back buffers. This is motivated by a DXVK bug with a modded version of Silent Hill 2 we had recently.
- GetFrontBufferData produces a specific fixed alpha value depending on whether the swapchain is windowed or fullscreen. That's a TODO for now because neither Wine nor DXVK implements this and it's a bit annoying to implement this while not a single application is known to rely on this.
- GetFrontBufferData is supposed to capture a screenshot of the entire monitor. So this MR adds a test to make sure that the application window is positioned correctly in the target surface after calling GetFrontBufferData. Total War Medieval 2 actually hit this issue with DXVK on its loading screen in windowed mode.
All the new tests pass on Windows 11 on the Nvidia D3D9 driver.
--
https://gitlab.winehq.org/wine/wine/-/merge_requests/5500
Start the DOSVM tick timer when the GET_SYSTEM_TIME interrupt
(int 1a ah 00) is fired. This fixes a bug when running Sid Meier's
CIVILIZATION for Windows 3.1 where the game would appear to hang at the
launch screen (although sound would play as expected). This was due to
the BIOSDATA.Ticks field never being updated.
I originally had written a version of this patch which moved away from using `BIOSDATA.Ticks` until I saw that the timer thread existed and seemed like a more sensible option.
--
v2: krnl386.exe16: Start DOSVM timer on GET_SYSTEM_TIME
https://gitlab.winehq.org/wine/wine/-/merge_requests/5498
Includes !782 to prevent the 32-bit Windows CI crashing.
--
v9: vkd3d-shader/dxil: Support SV_Depth, SV_DepthGreaterEqual and SV_DepthLessEqual.
tests/hlsl: Add pixel shader depth-out tests.
https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/777
This is a simplified version of !748 that doesn't handle conditional jumps. I'll submit a cleaned up version of that after this.
--
v4: vkd3d-shader/hlsl: Implement loop unrolling.
vkd3d-shader/hlsl: Parse loop and unroll loop attributes.
vkd3d-shader/hlsl: Pull evaluate_static_expression_as_uint upwards.
https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/786
This is a simplified version of !748 that doesn't handle conditional jumps. I'll submit a cleaned up version of that after this.
--
v3: vkd3d-shader/hlsl: Implement loop unrolling.
vkd3d-shader/hlsl: Parse loop and unroll loop attributes.
vkd3d-shader/hlsl: Pull evaluate_static_expression_as_uint upwards.
https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/786
This is a simplified version of !748 that doesn't handle conditional jumps. I'll submit a cleaned up version of that after this.
--
v2: vkd3d-shader/hlsl: Implement loop unrolling.
vkd3d-shader/hlsl: Parse loop and unroll loop attributes.
vkd3d-shader/hlsl: Pull evaluate_static_expression_as_uint upwards.
vkd3d-shader/hlsl: Defer bounds checks to after copy propagation.
tests/hlsl: Add a test for dynamically indexed multisampled texture loads.
https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/786
The general idea is:
* Run copy prop initially, save the copy prop state.
* Unroll one iteration, substitute all jumps by stores to synthetic control vars, move all instructions after the jumps to checks to those control vars.
* Run copy prop on the iteration, using the previous iteration's or the root's state as the parent state.
* Probe the copy prop state to check if the "loop_broken" control variable was set, stop unrolling if it true, otherwise continue.
Some stuff I'm less sure about and would love comments on:
* The way I deferred bounds checking.
* Splitting the iter block from the body. This was needed because otherwise copy prop marks variable that are changed in iter blocks (e.g "i++") as invalidated and does not propagate them to subsequent iterations.
* Messing around with copy prop internals. I attempted two other similar solutions that were less invasive: running copy prop on the entire block after each unroll and running copy prop once, after unrolling to `max_iterations`, both were too slow to be viable.
--
https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/748
Improve minidump dumping in Wine dump:
- support several -j options to only print relevant part of the file
- support a bunch of new streams (memory list, token, thread names...)
- several other cleanups and homogeinization of output
--
https://gitlab.winehq.org/wine/wine/-/merge_requests/5493
Includes !782 to prevent the 32-bit Windows CI crashing.
--
v8: vkd3d-shader/dxil: Support SV_Depth, SV_DepthGreaterEqual and SV_DepthLessEqual.
tests/hlsl: Add an SV_Depth test.
https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/777
Includes !782 to prevent the 32-bit Windows CI crashing.
--
v7: vkd3d-shader/dxil: Support SV_Depth, SV_DepthGreaterEqual and SV_DepthLessEqual.
tests/hlsl: Add an SV_Depth test.
https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/777
--
v6: vkd3d-shader/dxil: Support SV_Depth, SV_DepthGreaterEqual and SV_DepthLessEqual.
tests/hlsl: Add an SV_Depth test.
tests/hlsl: Supply data for all mip levels in calculate-lod.shader_test.
https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/777
This goes atop !773. The last three commits belong to this MR.
Trampolines and launchers allow us to handle code doing multilevel jumps, but they partially virtualize the control flow, which potentially makes the jobs of downstream compilers harder. So we avoid them every time we can.
--
https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/785
Hull Shaders contain two functions instead of just one, so all the algorithms that require computing a CFG need to be run twice. Here we refactor the code so that this can be done more easily.
This MR is relatively long, but it is essentially just moving code around, so hopefully it is not too difficult to review anyway.
--
v3: vkd3d-shader/ir: Split handling jumps when emitting a structured program.
vkd3d-shader/ir: Split handling selections when emitting a structured program.
vkd3d-shader/ir: Split handling loops when emitting a structured program.
vkd3d-shader/ir: Split handling blocks when emitting a structured program.
vkd3d-shader/ir: Refactor declaration emission outside of the CFG structure.
vkd3d-shader/ir: Split undominated SSA materialization.
vkd3d-shader/ir: Split program structurization.
https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/778
On Fri Apr 12 07:05:03 2024 +0000, Conor McCarthy wrote:
> The `Split handling * when emitting a structured program` commits do no
> more than move code to helper functions, right? Maybe the commit
> messages should state that instead.
Yes, that's what they do, and that's what "splitting" means in my mind. I'm not terribly attached to that formulation, though, so if you have another suggestion I can use yours.
--
https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/778#note_67687
Hull Shaders contain two functions instead of just one, so all the algorithms that require computing a CFG need to be run twice. Here we refactor the code so that this can be done more easily.
This MR is relatively long, but it is essentially just moving code around, so hopefully it is not too difficult to review anyway.
--
https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/778
~~This goes atop !764. The last three commits belong to this MR.~~
Since we want to get rid of loops and 'break's as much as possible, we try to move 'break's out of selection constructs as much as possible so it's easier to match them with loops. This MR introduces a few other tricks to help that.
--
v3: vkd3d-shader/ir: Move breaks out of selections again after having optimized loops.
vkd3d-shader/ir: Append code to the non-breaking branch if there is breaking one.
vkd3d-shader/ir: Prepare for changing the destination list in vsir_cfg_optimize_recurse().
https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/773
I'm working on adding all the intrinsics we haven't implemented yet. Here's sinh, cosh, and tanh.
Sinh/cosh are implemented in the same commit because they forward to the same backing function (because the identities used only differ by a plus or minus).
--
v5: vkd3d-shader/hlsl: Implement tanh.
vkd3d-shader/hlsl: Implement hyperbolic sin and cos.
https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/740