Add a new legalization pass to dedupe invocation interlock instructions
DXC will be adding support for HLSL's rasterizer ordered views by using
the SPV_EXT_fragment_shader_interlock_extension. That extension
stipulates that if an entry point has an interlock ordering execution
mode, it must dynamically execute OpBeginInvocationInterlockEXT and
OpEndInvocationInterlockEXT, in that order, exactly once. This would be
difficult to determine in DXC's SPIR-V backend, so instead we will emit
these instructions potentially multiple times, and use this legalization
pass to ensure that the final SPIR-V follows the specification.
This PR uses data-flow analysis to determine where to place begin and
end instructions; in essence, determining whether a block contains or is
preceded by a begin instruction is similar to a specialized case of a
reaching definitions analysis, where we have only a single definition,
such as `bool has_begun = false`. For this simpler case, we can compute
the set of blocks using BFS to determine the reachability of the begin
instruction.
We need to do this for both begin and end instructions, so I have
generalized portions of the code to run both forward and backward over
the CFG for each respective case.
For some reason the `gh` command to create a pull request with a team as
the reviewer is not working. That command works when I run it locally. I
don't know what the problem is, but I will just stop adding a reviewer.
Then anyone can look at it.
These functions are getting far too complicated to code in SPIRV-Tools
C++. Replace them with import stubs so that the real implementations
can live in Vulkan-ValidationLayers where they belong.
VVL will need to define these functions in spirv and link them to the
instrumented version of the user's shader.
From here on out, VVL can redefine the functions and any data they use
without updating SPIRV-Tools. Changing the function declarations will
still require both VVL and SPIRV-Tools to be updated in lock step.
When we are attempting to fetch the version info from the git
repository, first check if we're actually in one, otherwise
spurious errors messages get printed.
e0077036ca...a807e8a3aa
$ git log e0077036c..a807e8a3a --date=short --no-merges --format='%ad %ae %s'
2023-09-07 junyer Revert "Make the extension work for Python 3.8+."
2023-09-07 junyer Make the extension work for Python 3.8+.
2023-09-07 junyer Try plumbing the platform name a different way.
2023-09-07 junyer Add a "dry run" mode to the Python workflow.
2023-09-04 junyer Switch to `python -m build`.
2023-09-04 junyer Mark three dependencies as `dev_dependency = True`.
Created with:
roll-dep external/re2
Co-authored-by: GitHub Actions[bot] <>
From the Capability's text in the SPIRV spec:
```
An MS operand in OpTypeImage indicates multisampled, used with an
OpTypeImage having Sampled == 2 and Arrayed == 1.
```
Adding this logic to the capability trimming pass.
Adds the RayTracingKHR and RayQueryKHR capabilities to
the supported capabilities list (this includes the linked extension).
(NV and KHR capabilities/extensions shared the same IDs, so it also
works for NV flavors of those).
Currently spirv-link fails if all input files don't use the same
SPIR-V version. Add an option to instead use the highest input
version as the output version. Note that if one of the 'old'
input files uses an opcode that is deprecated in the 'new'
version, the output spirv will be invalid.
Some operands are not simple values, but bitmasks.
The lookup in the table for required decomposing the mask into
single values.
This commit adds support for such operands, like MinLod|Offset.
A token is allowed to parse even when it's from the wrong
version, or is not enabled by a capability or extension.
This allows more modules to parse.
Version/capability/extension checking is fully moved to
validation instead.
Fixes: #5364
* opt: fix StorageInputOutput16 trimming.
While integrating this pass into DXC, I found a lot of missing
cases. This PR fixes a few issues centered around this capability
while laying out fondations for more fixes.
1. The grammar can define extensions in operand & opcode tables.
- opcode can rely on common capabilities, but require a new
extension.
- opcode can also rely on a capability which requires an extension.
Sometimes, the extension is listed twice, in the opcode, and
capability. But this redundancy is not guaranteed.
2. minVersion check. The condition was flipped: we added the extension
when the minVersion was less than current.
Didn't noticed the issue as I only tests on the default env.
3. Capability/Extension instructions were not ignored.
- `OpCapability Foo` will require the `Foo` capability.
- it doesn't mean the module requires the `Foo` capability.
Same for extensions.
This commit adds disabled tests, for fixes which are too large to
be brought into this already large PR.
* Roll external/googletest/ 6f6ab4212..46db91ef6 (9 commits)
6f6ab4212a...46db91ef6f
$ git log 6f6ab4212..46db91ef6 --date=short --no-merges --format='%ad %ae %s'
2023-08-07 dinor Make references to `#include`s consistent across docs
2023-08-02 robert.shade Avoid unreachable code warning
2023-08-02 dmauro Update documentation to refer to v1.14
2023-08-02 dmauro Bump version to v1.14 in preparation for release
2023-08-02 dmauro Remove the GTEST_HAS_DOWNCAST_ customization point.
2023-08-02 dmauro Add googletest-message-test to the Bazel tests It appears to have been unintentionally left out
2023-08-01 phoebeliang Make testing::Message support streamed AbslStringify values
2023-08-01 dmauro Update GoogleTest dependencies
2023-07-27 patryk gtest: Supress warning about set unused variable
Created with:
roll-dep external/googletest
* Roll external/re2/ 960c86176..9dc7ae7b5 (1 commit)
960c861764...9dc7ae7b52
$ git log 960c86176..9dc7ae7b5 --date=short --no-merges --format='%ad %ae %s'
2023-08-04 junyer Minor Bazel cleanups.
Created with:
roll-dep external/re2
---------
Co-authored-by: GitHub Actions[bot] <>
The autoroll workflow is currently failing due to being unable to find
some depot_tools executables. This is due to a limitation in Go os/exec
which effectively rejects all relative paths in PATH, and is exposed by
a recent update to depot_tools
(https://crrev.com/43083529de5802a83f53f1d53d7f5f9615999996).