Redo of !1857, as suggested, the plan is to split original MR in half, breadcrumbs in first (this) MR, and address edit in another.
The changes are mostly cleanup (formatting, renaming, unused variables, missing free).
Visually, it hasn't changed from original MR, part 1 changes are:

And part 2:

Part 2 branch can be found [here](https://gitlab.winehq.org/vt/wine/-/commits/fd-navbar-part2).
Requires !2068, otherwise if application doesn't request comctl v6 (e.g. qapitrace), navigation bar will look like this:

Closes:
- https://bugs.winehq.org/show_bug.cgi?id=29912
- https://bugs.winehq.org/show_bug.cgi?id=54812
- https://bugs.winehq.org/show_bug.cgi?id=50338 (partially? fully with address edit?)
MR changes:
- v2
- Changed the gap between buttons to be scaled with DPI
- v3
- DPI scale the gap in layout calculation in breadcrumbs commit
missed it earlier
- remove padding from layout calculation
`GetWindowRect` was unintentionally returning double padding, 4px from `hspacing` in `itemdlg.c:update_layout`, and another 4px from somewhere else
- drop `comdlg32: Keep IExplorerBrowser in IFileDialog focused after Backspace.` hack
- retain IExplorerBrowser view focus in IFileDialog when creating new view
- redirect navigation bar buttons focus back to the previous window
- v4
- rename background to frame
- calculate overflow button width into separate variable, [will come in handy in part 2](https://gitlab.winehq.org/vt/wine/-/commit/998b6987500edda02d6a9177c7da2…
- simplify show-at-least-N-crumbs logic
- drop `comdlg32: Prevent arrow navigation of IFileDialog navigation bar buttons.`
- drop `comdlg32: Don't paint focus rect in IFileDialog navigation bar buttons.`
- add tab navigation
- avoid taking button focus by sending `VK_SPACE` instead
Description edits:
- v2
- Updated the changes image (by splitting it)
- Added MR changes
- v3
- Added description edits
- Updated the changes image again (forgot the overflow button change)
--
v5: comdlg32: Avoid taking focus on LMB click in IFileDialog navigation bar buttons.
comdlg32: Add tab navigation to IFileDialog navigation bar.
comdlg32: Retain IExplorerBrowser view focus in IFileDialog when creating new view.
comdlg32: Add breadcrumb overflow menu to IFileDialog navigation bar.
comdlg32: Add inner border to breadcrumbs in IFileDialog navigation bar.
comdlg32: Always show at least 2 crumbs in IFileDialog navigation bar.
comdlg32: Reuse address breadcrumbs in IFileDialog navigation bar.
comdlg32: Add address breadcrumbs to IFileDialog navigation bar.
comdlg32: Add go up button to IFileDialog navigation bar.
comdlg32: Add IFileDialog navigation bar control.
https://gitlab.winehq.org/wine/wine/-/merge_requests/2993
These replace Wine's 14 copies of debugstr_hstring.
--
v2: wintypes: Replace debugstr_hstring with wine_dbgstr_h.
windows.ui: Replace debugstr_hstring with wine_dbgstr_h.
windows.system.profile.systemmanufacturers: Replace debugstr_hstring with wine_dbgstr_h.
windows.perception.stub: Replace debugstr_hstring with wine_dbgstr_h.
windows.networking: Replace debugstr_hstring with wine_dbgstr_h.
windows.media.speech/tests: Replace debugstr_hstring with debugstr_h.
windows.media.devices: Replace debugstr_hstring with wine_dbgstr_h.
https://gitlab.winehq.org/wine/wine/-/merge_requests/3157
Creating a view with an unaligned offset is legal in d3d and apparently works, both on Windows and Linux, but may violate the Vulkan specification:
VUID-VkBufferViewCreateInfo-offset-00926(ERROR / SPEC): msgNum: -833749292 - Validation Error: [ VUID-VkBufferViewCreateInfo-offset-00926 ] Object 0: handle = 0x3c000000003c, type = VK_OBJECT_TYPE_BUFFER; | MessageID = 0xce4dfed4 | vkCreateBufferView(): VkBufferViewCreateInfo offset (36) must be a multiple of VkPhysicalDeviceLimits::minTexelBufferOffsetAlignment (16). The Vulkan spec states: offset must be a multiple of VkPhysicalDeviceLimits::minTexelBufferOffsetAlignment (https://www.khronos.org/registry/vulkan/specs/1.2-khr-extensions/html/vkspe…)
Without any reason to test unaligned buffer views here, just resolve this by changing the test.
--
https://gitlab.winehq.org/wine/wine/-/merge_requests/3033
Mingw targets export all symbols by default if there is no explicit export. We generate export table in winebuild and don't use explicit exports. This may make linker generate an unused export-all table.
Spotted by Gabriel Ivăncescu in !3109.
--
https://gitlab.winehq.org/wine/wine/-/merge_requests/3173
This reverts commit a19c8712917042361208b8a4a0a503e06815d20a.
It turns out commit a19c8712917042361208b8a4a0a503e06815d20a is wrong and causing regressions. Crypt provider info is actually stored in certificate and that is the only place where, e. g., secur32 can get private key from.
It turns out that Street Fightet 6 which is creating a great amount of temporary certificates and growing cert storage does the same on Windows, with the only difference that on Windows those certificates are stored on disk and not in registry.
--
v2: crypt32/tests: Test CertCreateSelfSignCertificate() without provider info.
https://gitlab.winehq.org/wine/wine/-/merge_requests/3169
The point here is to make the default implementation close to winex11, supporting a standalone systray window, and then refactor the interface to remove the duplicated code from the user drivers.
--
v2: explorer: Display the individual systray icon windows.
explorer: Create individual windows for the systray icons.
explorer: Split systray add/remove from show/hide_icon.
explorer: Remove unnecessary displayed icon array.
https://gitlab.winehq.org/wine/wine/-/merge_requests/3171
Fixes both a memory leak and an alloc/free mismatch, and the module heap
is the most appropriate place to hold the variable long-term.
--
v3: dbghelp: Allocate real_path with the CRT and copy it to the module heap.
https://gitlab.winehq.org/wine/wine/-/merge_requests/3016
The point here is to make the default implementation close to winex11, supporting a standalone systray window, and then refactor the interface to remove the duplicated code from the user drivers.
--
https://gitlab.winehq.org/wine/wine/-/merge_requests/3171
--
v6: wineoss: Use mmdevapi's AudioClient's QueryInterface.
winecoreaudio: Use mmdevapi's AudioClient's QueryInterface.
winealsa: Use mmdevapi's AudioClient's QueryInterface.
winepulse: Move AudioClient's QueryInterface into mmdevapi.
wineoss: Use mmdevapi's AudioClient's Release, AddRef.
winecoreaudio: Use mmdevapi's AudioClient's Release, AddRef.
winealsa: Use mmdevapi's AudioClient's Release, AddRef.
winepulse: Move AudioClient's Release, AddRef into mmdevapi.
winepulse: Refactor AudioClient's Release to match other drivers.
winecoreaudio: Refactor AudioClient's Release to match other drivers.
https://gitlab.winehq.org/wine/wine/-/merge_requests/2855
Needed for Age of Wonders 4.
I came across a post saying this game crashes: https://www.reddit.com/r/Lutris/comments/136f9s2/age_of_wonders_4_unexpecte…
```
wine: Call from 0000000174013E8E to unimplemented function twinapi.appcore.RegisterAppConstrainedChangeNotification, aborting
wine: Unimplemented function twinapi.appcore.RegisterAppConstrainedChangeNotification called at address 0000000174013E8E (thread 0114), starting debugger...
```
The Proton version works fine so this seems to be either the GOG version or the other non-steam ones.
--
v2: twinapi.appcore: Add UnregisterAppConstrainedChangeNotification() stub.
https://gitlab.winehq.org/wine/wine/-/merge_requests/3170
Needed for Age of Wonders 4.
I came across a post saying this game crashes: https://www.reddit.com/r/Lutris/comments/136f9s2/age_of_wonders_4_unexpecte…
```
wine: Call from 0000000174013E8E to unimplemented function twinapi.appcore.RegisterAppConstrainedChangeNotification, aborting
wine: Unimplemented function twinapi.appcore.RegisterAppConstrainedChangeNotification called at address 0000000174013E8E (thread 0114), starting debugger...
```
The Proton version works fine so this seems to be either the GOG version or the other non-steam ones.
--
https://gitlab.winehq.org/wine/wine/-/merge_requests/3170
This probably can be seen as pointless moving, but I at least appreciate the structure.
Besides structure, part of my motivation here is that I will soon want to introduce tests for d3d assembly.
I'd also like to stop once and for all the inconsistency between whether tests have "hlsl" prefixed or not.
--
https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/248
This reverts commit a19c8712917042361208b8a4a0a503e06815d20a.
It turns out commit a19c8712917042361208b8a4a0a503e06815d20a is wrong and causing regressions. Crypt provider info is actually stored in certificate and that is the only place where, e. g., secur32 can get private key from.
It turns out that Street Fightet 6 which is creating a great amount of temporary certificates and growing cert storage does the same on Windows, with the only difference that on Windows those certificates are stored on disk and not in registry.
--
https://gitlab.winehq.org/wine/wine/-/merge_requests/3169
When any of these flags:
- PFD_DRAW_TO_WINDOW
- PFD_DRAW_TO_BITMAP
- PFD_SUPPORT_GDI
- PFD_SUPPORT_OPENGL
are set on the PIXELFORMATDESCRIPTOR parameter to ChoosePixelFormat(),
the returned pixel format must also have them set, but when they are
unset, the returned pixel format may or may not have them set.
Also add support for filtering on all these flags. In particular, the
lack of filtering on PFD_SUPPORT_GDI, was causing (at least) Java 1.3
to fail to initialize graphics, because we were returning a pixel
format without the PFD_SUPPORT_GDI flag it asked for.
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=7767
--
v5: opengl32: Implement filtering on all the ChoosePixelFormat() flags that are ignored when unset
https://gitlab.winehq.org/wine/wine/-/merge_requests/3111
Java (1.3 at least) calls ChoosePixelFormat() with the PFD_SUPPORT_GDI flag set
and expects the returned PIXELFORMATDESCRIPTOR to have that flag set. If it
doesn't, an exception is thrown and it fails to initialize graphics. If no
PIXELFORMATDESCRIPTOR is returned instead, it falls back to an alternative
rendering method and proceeds further.
Therefore, when the PFD_SUPPORT_GDI flag is specified, treat it as a mandatory
requirement, and only return a PIXELFORMATDESCRIPTOR on which it is set, if
any.
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=7767
Closes #7767
--
v4: opengl32: Implement filtering on all the ChoosePixelFormat() flags that are ignored when unset
https://gitlab.winehq.org/wine/wine/-/merge_requests/3111
--
v5: vkd3d: Append CopyTileMappings() commands to the command queue op array.
vkd3d: Append UpdateTileMappings() commands to the command queue op array.
vkd3d: Add missing const attributes to ID3D12CommandQueue::UpdateTileMappings() parameters.
vkd3d: Validate plane count for tiled textures.
vkd3d: Validate tiled resources tier for 3D textures.
vkd3d: Validate tiled resources support during reserved resource creation.
vkd3d: Always pass null heap properties to vkd3d_create_image() for sparse images.
vkd3d: Check sparse image format is supported.
https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/216
--
v9: vkd3d-shader/hlsl: Handle 'texkill' discard type for sm4+.
vkd3d-shader/hlsl: Parse clip() function.
tests: Add some tests for clip().
vkd3d-shader/hlsl: Add a parameter for jump nodes and use it for 'discard'.
https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/211
There are two parts to this:
- First, a way to retrieve any signature from a DXBC shader. This is, I gather,
generally useful for reflection, and it can be used as one source with which
to implement d3d10 and d3d11 shader reflection APIs.
The rest of those APIs will need much more data to be exposed from d3d
shaders, and while I was originally planning to expose that all in a single
"vkd3d_shader_d3d_shader_info" structure, I think that signatures at least are
a reasonable enough subset to have a dedicated structure. Moreover, I did not
want to block sm1 support on too much API design.
- Second, signatures synthesized from sm1 byte code. This is conceptually a bit
weird, because sm1 does not have signatures, but in terms of how these APIs
are used by Wine (or other translation layers, as evidenced not least by the
Vulkan test shader runner, which I have locally adapted for sm1 but not
submitted yet) it fits rather nicely.
Because this is new API, it of course deserves plenty of discussion, especially
the sm1 part. Several open questions which occurred to me while writing are:
1. Should we fix the mask (and used mask) for sm1 signatures as 0xf rather than
0? SPIR-V cares about this in order to declare I/O variables, which makes
some amount of sense. In fact I have a patch in my local tree to change this,
specifically for that purpose. However, we could also normalize it later.
2. If we do fix the mask as nonzero, should single-component semantics (fog,
depth, etc...) be declared as 0x1 instead of 0xf?
3. Should BLENDINDICES get a UINT type? It's float in shader instructions (well,
kind of, although in practice it's used as an array index of course), but
the vertex attribute type is in practice "supposed" to be integer.
Part 1 of a series to implement sm1 -> spirv translation in vkd3d-shader,
brought to you by late nights spent coding and rereading The Waste Land.
Ganga was sunken, and the limp leaves
Waited for rain, while the black clouds
Gathered far distant, over Himavant.
--
v5: vkd3d-shader: Synthesize signatures for d3dbc shaders.
vkd3d-shader: Introduce an API to retrieve all signatures from DXBC shaders.
vkd3d-shader: Introduce documented semantics for the target type and other data passed to vkd3d_shader_scan().
https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/200
MSVC is too stupid to see that line 3058 will not run unless n_variants
has been set together with variants in the switch statement below.
--
v4: vkd3d-shader/hlsl: Make sure variants is initialized in declare_predefined_types().
https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/171
Block records are not processed; only the bitcode is validated.
--
v15: vkd3d-shader/dxil: Read and validate global abbreviated operands.
vkd3d-shader/dxil: Read and validate local abbreviated operands.
vkd3d-compiler: Introduce a dxbc-dxil source type.
include: Introduce a function to detect the DXBC source type.
https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/44
This change only implements case-sensitivity of technique keywords and related checks when corresponding profile is used. My immediate plan is to add some synthetic type for technique variables, for example as {object, void}, then add named techniques as variables. This is useful because these names are participating in global scope, and should not collide with normal variables. After that "pass_list" will be split, at least in two variants because of how much d3d9 syntax differs. Some trivial changes will be need later to have some top level fx compilation helper that considers only fx objects and calls ps/vs/gs compiler to create inner shader blobs on same original source.
--
v2: vkd3d-shader/hlsl: Improve handling of "technique" tokens.
https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/111
StringFormat argument to get_font_hfont is unused and looks largely irrelevant to the font.
Signed-off-by: David Kahurani <k.kahurani(a)gmail.com>
--
v2: gdiplus: Remove unused argument in get_font_hfont
https://gitlab.winehq.org/wine/wine/-/merge_requests/3163
Later patches are on https://gitlab.winehq.org/giomasce/wine/-/commits/chianti, though they still require some cleanup and cosmetic changes.
Currently the D3D12 swapchain accesses the low level Vulkan queue backing a vkd3d `ID3D12CommandQueue` using the `vkd3d_acquire_vk_queue()` call in order to submit frames for presentation. This causes a number of bugs because `vkd3d_acquire_vk_queue()` lets the caller submit to the Vulkan queue even if some operations are enqueued in the vkd3d internal op queue, which can lead to a frame being presented even if drawing work on it isn't finished (and not even queued, from the viewpoint of Vulkan!).
In order to fix this, I propose to introduce to add a few calls to vkd3d (currently [in this branch](https://gitlab.winehq.org/giomasce/vkd3d/-/commits/mongibello)), to allow the caller to enqueue calls to `vkQueueSubmit()` and `vkQueuePresentKHR()` through the vkd3d internal queue. The D3D12 swapchain would then use this new API instead of directly calling `vkQueueSubmit()` and `vkQueuePresentKHR()` as it does now.
Patches in this MR don't implement those changes yet, but prepare the ground with some tests and light refactoring.
--
https://gitlab.winehq.org/wine/wine/-/merge_requests/3165
--
v3: winegstreamer: Lookup stream handler result using a dedicated helper.
winegstreamer: Rename winegstreamer_stream_handler to stream_handler.
winegstreamer: Create and destroy result entries using dedicated helpers.
winegstreamer: Lookup stream descriptors before starting streams.
winegstreamer: Keep a reference on the media source start descriptor.
maintainers: Assume GStreamer media source maintainership.
https://gitlab.winehq.org/wine/wine/-/merge_requests/3100
This MR supercedes !1895 and !3073 as a solution to bug [#50771](https://bugs.winehq.org/show_bug.cgi?id=50771). Rather than fixing the problem of Wine's inability to modify the attributes of read-only files, this patch set instead implements `FileDispositionInformationEx` which the Msys2 and Cygwin runtime libriries can use to avoid needing to modify attributes.
All the flags of `FileDispositionInformationEx` are implemented with the exception of `FILE_DISPOSITION_FORCE_IMAGE_SECTION_CHECK`.
This MR improves upon !3073 by implementing `FILE_DISPOSITION_POSIX_SEMANTICS` and `FILE_DISPOSITION_ON_CLOSE` where the previous MR only implemented `FILE_DISPOSITION_DELETE` and `FILE_DISPOSITION_IGNORE_READONLY_ATTRIBUTE`.
--
v3: ntdll: Implement FILE_DISPOSITION_POSIX_SEMANTICS
server: Replace unlink member of closed_fd with disp_flags
ntdll/tests: Add tests for FILE_DISPOSITION_POSIX_SEMANTICS
ntdll: Implement FILE_DISPOSITION_ON_CLOSE
ntdll/tests: Add tests for FILE_DISPOSITION_ON_CLOSE
ntdll: Implement FILE_DISPOSITION_IGNORE_READONLY_ATTRIBUTE
ntdll/tests: Add tests for FILE_DISPOSITION_IGNORE_READONLY_ATTRIBUTE
ntdll: Initial implementation of FileDispositionInformationEx
include: Define FILE_DISPOSITION_INFORMATION_EX and friends
https://gitlab.winehq.org/wine/wine/-/merge_requests/3122
Required for !1857 to not break when comctl32 version 6 isn't requested by application (in particular, found this in [qapitrace](https://github.com/apitrace/apitrace)).
Manifest resource id and assembly identity name match with Windows.
For isolation purposes, activation context is disabled while emitting events.
--
v9: comdlg32: Enable visual styles when showing IFileDialog.
comdlg32: Return E_UNEXPECTED if IFileDialog is already shown.
https://gitlab.winehq.org/wine/wine/-/merge_requests/2068
If the length of wszApplicationName exceeds 1024, it will cause an error
when writing to the subsequent stack space after exceeding the wcmd space,
Wcmd needs to be modified to dynamic allocation.
Signed-off-by: Jiajin Cui <cuijiajin(a)uniontech.com>
--
https://gitlab.winehq.org/wine/wine/-/merge_requests/3155
Fixes both a memory leak and an alloc/free mismatch, and the module heap
is the most appropriate place to hold the variable long-term.
--
v2: dbghelp: Allocate real_path with the CRT and copy it to the module heap.
https://gitlab.winehq.org/wine/wine/-/merge_requests/3016
There are two parts to this:
- First, a way to retrieve any signature from a DXBC shader. This is, I gather,
generally useful for reflection, and it can be used as one source with which
to implement d3d10 and d3d11 shader reflection APIs.
The rest of those APIs will need much more data to be exposed from d3d
shaders, and while I was originally planning to expose that all in a single
"vkd3d_shader_d3d_shader_info" structure, I think that signatures at least are
a reasonable enough subset to have a dedicated structure. Moreover, I did not
want to block sm1 support on too much API design.
- Second, signatures synthesized from sm1 byte code. This is conceptually a bit
weird, because sm1 does not have signatures, but in terms of how these APIs
are used by Wine (or other translation layers, as evidenced not least by the
Vulkan test shader runner, which I have locally adapted for sm1 but not
submitted yet) it fits rather nicely.
Because this is new API, it of course deserves plenty of discussion, especially
the sm1 part. Several open questions which occurred to me while writing are:
1. Should we fix the mask (and used mask) for sm1 signatures as 0xf rather than
0? SPIR-V cares about this in order to declare I/O variables, which makes
some amount of sense. In fact I have a patch in my local tree to change this,
specifically for that purpose. However, we could also normalize it later.
2. If we do fix the mask as nonzero, should single-component semantics (fog,
depth, etc...) be declared as 0x1 instead of 0xf?
3. Should BLENDINDICES get a UINT type? It's float in shader instructions (well,
kind of, although in practice it's used as an array index of course), but
the vertex attribute type is in practice "supposed" to be integer.
Part 1 of a series to implement sm1 -> spirv translation in vkd3d-shader,
brought to you by late nights spent coding and rereading The Waste Land.
Ganga was sunken, and the limp leaves
Waited for rain, while the black clouds
Gathered far distant, over Himavant.
--
v4: vkd3d-shader: Synthesize signatures for d3dbc shaders.
vkd3d-shader: Introduce an API to retrieve all signatures from DXBC shaders.
https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/200
--
v2: wineoss: Use mmdevapi's AudioClient's Initialize.
winecoreaudio: Use mmdevapi's AudioClient's Initialize.
winealsa: Use mmdevapi's AudioClient's Initialize.
winepulse: Move AudioClient's Initialize into mmdevapi.
wineoss: Use standard allocator in AudioClient's Initialize.
winecoreaudio: Use standard allocator in AudioClient's Initialize.
winealsa: Use standard allocator in AudioClient's Initialize.
https://gitlab.winehq.org/wine/wine/-/merge_requests/3152
'if exists' takes a parameter which can be directory, directory/,
directory/. directory\ or directory\. for example, and should equate
to true if the directory exists. The syntax directory\ is explicitly
rejected by FindFirstFile and hence was not working - look for this
specific case, and if found append a '.'.
Follow-up commit of bc9d68bcbee5c9d4f4582f766a4f552870385361
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=55130
--
v2: cmd: Fix 'if exist' with a directory/ as a parameter.
https://gitlab.winehq.org/wine/wine/-/merge_requests/3154
'if exists' takes a parameter which can be directory, directory/,
directory/. directory\ or directory\. for example, and should equate
to true if the directory exists. The syntax directory\ is explicitly
rejected by FindFirstFile and hence was not working - look for this
specific case, and if found append a '.'.
Follow-up commit of bc9d68bcbee5c9d4f4582f766a4f552870385361
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=55130
--
https://gitlab.winehq.org/wine/wine/-/merge_requests/3154
There are two parts to this:
- First, a way to retrieve any signature from a DXBC shader. This is, I gather,
generally useful for reflection, and it can be used as one source with which
to implement d3d10 and d3d11 shader reflection APIs.
The rest of those APIs will need much more data to be exposed from d3d
shaders, and while I was originally planning to expose that all in a single
"vkd3d_shader_d3d_shader_info" structure, I think that signatures at least are
a reasonable enough subset to have a dedicated structure. Moreover, I did not
want to block sm1 support on too much API design.
- Second, signatures synthesized from sm1 byte code. This is conceptually a bit
weird, because sm1 does not have signatures, but in terms of how these APIs
are used by Wine (or other translation layers, as evidenced not least by the
Vulkan test shader runner, which I have locally adapted for sm1 but not
submitted yet) it fits rather nicely.
Because this is new API, it of course deserves plenty of discussion, especially
the sm1 part. Several open questions which occurred to me while writing are:
1. Should we fix the mask (and used mask) for sm1 signatures as 0xf rather than
0? SPIR-V cares about this in order to declare I/O variables, which makes
some amount of sense. In fact I have a patch in my local tree to change this,
specifically for that purpose. However, we could also normalize it later.
2. If we do fix the mask as nonzero, should single-component semantics (fog,
depth, etc...) be declared as 0x1 instead of 0xf?
3. Should BLENDINDICES get a UINT type? It's float in shader instructions (well,
kind of, although in practice it's used as an array index of course), but
the vertex attribute type is in practice "supposed" to be integer.
Part 1 of a series to implement sm1 -> spirv translation in vkd3d-shader,
brought to you by late nights spent coding and rereading The Waste Land.
Ganga was sunken, and the limp leaves
Waited for rain, while the black clouds
Gathered far distant, over Himavant.
--
v3: vkd3d-shader: Synthesize signatures for d3dbc shaders.
vkd3d-shader: Introduce an API to retrieve all signatures from DXBC shaders.
https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/200