Commit Graph

2772 Commits

Author SHA1 Message Date
David Neto
3fb52548bc
Vulkan 1.4 support (#5899)
* Add a Vulkan 1.4 environment

* Fix test: Vulkan 1.3 accepts SPIR-V 1.6

* Fix comments about Vulkan 1.4

* Add test cases for Vulkan 1.4, optimizer ir_context tests

---------

Co-authored-by: Faith Ekstrand <faith.ekstrand@collabora.com>
2024-12-02 18:25:00 -05:00
David Neto
a9d884e58d
spirv-as: Assume target from spvasm text (#5893)
* spirv-as: Assume target from spvasm text

Assume the desired SPIR-V target version when the command line option is
not provided. This is especially important when the source being
assembled does not match the default (latest version), because it may
create an invalid SPIR-V binary result.

Also, clarify the wording for where a copy of spirv-headers is expected
(to match expected capitalization).

* fix formatting

* Add unit tests, static asserts on supported SPIR-V versions

Rework the algorithm so it accepts earlier termination of the version
string. That made testing easier and more intuitive.

* Fix compilation problems

---------

Co-authored-by: mmoult <30711895+mmoult@users.noreply.github.com>
2024-11-26 17:57:32 -05:00
Spencer Fricke
f3c4a5053f
spirv-val: Add missing NonSemantic.Shader.DebugInfo.100 (#5846)
* spirv-val: Cleanup DebugExtension tests

* spirv-val: Cleanup DebugExtension tests extensions

* spirv-val: Add missing NonSemantic.Shader.DebugInfo.100

* spirv-opt: Fix broken DebugLine in tests
2024-11-25 13:47:25 -05:00
Sven van Haastregt
35e5f1160e
spirv-val: Accept valid OpSizeOf instructions (#5879)
Ensure valid `OpSizeOf` instructions are not rejected by spirv-val.
Until now, validation of a valid `OpSizeOf` instruction would fail
with the message that the operand "cannot be a type".

Signed-off-by: Sven van Haastregt <sven.vanhaastregt@arm.com>
2024-11-13 10:54:31 -05:00
Nathan Gauër
692529b941
[NFC] Apply small clang-tidy fixes (#5709)
* [NFC] Apply small clang-tidy fixes

- const for passed-by-value has no effect on prototypes.
- transitive includes.
- dead stores
- uses after move

Signed-off-by: Nathan Gauër <brioche@google.com>

* pr-feedback

Signed-off-by: Nathan Gauër <brioche@google.com>

---------

Signed-off-by: Nathan Gauër <brioche@google.com>
2024-11-12 14:45:05 -05:00
Qiaojin.Bao
707da36c70
Correct a spelling error 'diagnostic' (#5878) 2024-11-12 13:13:48 -05:00
Steven Perron
df94b2db4a
Avoid maintaining a list of all operating systems by hand. (#5881)
See #5467

Co-authored-by: Patrick Welche <prlw1@cam.ac.uk>
2024-11-12 12:38:56 -05:00
Sven van Haastregt
384d527ebb
spirv-val: Report VUID 08973 only in Vulkan environments (#5873)
The storage class restriction for `OpCooperativeMatrixLoadKHR` and
`OpCooperativeMatrixStoreKHR` comes from the Vulkan specification; as
such VUID 08973 should not be reported outside of Vulkan target
environments.

Signed-off-by: Sven van Haastregt <sven.vanhaastregt@arm.com>
2024-11-11 11:18:45 -05:00
Jeff Bolz
ce92630396
Add validation for SPV_NV_tensor_addressing and SPV_NV_cooperative_matrix2 (#5865) 2024-10-24 13:55:04 -04:00
Nathan Gauër
298055b25c
opt: add StorageImageWriteWithoutFormat to trimm pass (#5860)
* opt: add StorageImageWriteWithoutFormat to trimm pass

---------

Signed-off-by: Nathan Gauër <brioche@google.com>
2024-10-24 06:21:17 -04:00
Nathan Gauër
895bb9ffec
opt: add KHR_fragment_shading_rate to allowlist (#5859)
Allowing this extensions to the few gated optimization passes.

Signed-off-by: Nathan Gauër <brioche@google.com>
2024-10-21 11:25:49 -07:00
Jeremy Gebben
ba37b3b513
opt: Remove InstDebugPrintfPass (#5856)
This code was only used by Vulkan-Validation layers and it has
now been replaced by code in that repository.
2024-10-17 15:05:56 -04:00
alan-baker
a832c13331
Fix switch case construct validation (#5852)
* Fix switch case construct validation

Fixes https://crbug.com/tint/372311599

* Stop using block depth in switch validation and instead use the more
  robust structured exit logic from the switch construct
  * This is valid because the function has already handled the
    additional valid cases for case constructs

* formatting
2024-10-16 11:09:21 -04:00
Cassandra Beckley
2ea729062b
opt: Fix array copy propagation of access chain pointers (#5853)
#5827 is broken for situations where a loaded value is stored to a pointer resulting from an OpAccessChain. Traverse access chains to find the original OpVariable to add to the worklist.
2024-10-16 10:51:05 -04:00
alan-baker
42b315c15b
Fix result type check in ValidateImageTexelPointer (#5848)
Fixes https://crbug.com/oss-fuzz/42537207

* Fix check and messages in ValidateImageTexelPointer
2024-10-10 14:10:07 -04:00
alan-baker
fcf994a619
Handle aliases field in the grammar (#5799)
* Modify static table generation scripts to include alias lists
* Modify spv_opcode_desc_t and spv_operand_desc_t to include aliases
* Modify opcode and operand lookup by name to also search aliases

* update vim syntax generator
2024-10-09 12:50:32 -04:00
Cassandra Beckley
522dfead39
opt: Add support for OpExtInst to capability trim pass (#5836)
The grammar does track required capabilities for extended instruction
set operations, so we just need to look them up.
2024-10-04 00:42:48 -07:00
Cassandra Beckley
48f9f4a99e
opt: Update copy prop arrays to handle InterpolateAt* instructions (#5827)
Adds support for `InterpolateAtCentroid`, `InterpolateAtSample`, and `InterpolateAtOffset` to the copy propagate arrays pass, as well as propagating pointers with the `Input` storage class. Also handles situations where variables should be propagated in an order different than the order that they are declared in the source.
2024-10-02 09:38:32 -04:00
Cassandra Beckley
b1ad37b175
opt: Mark InterpolateAt* argument as live for DCE (#5824)
The GLSL 450 InterpolateAt* instructions should be treated as a load by dead code elimination. This is part of https://github.com/microsoft/DirectXShaderCompiler/issues/3649.
2024-09-26 16:49:36 -04:00
Steven Perron
5b38abc877
Do not distrubute OpSNegate into OpUDiv (#5823)
We cannot apply the negate to an operand of an OpUDiv instead of it
result. This is because the operands of the OpUDiv are interpreted as
unsigned. We stop the optimizer from doing that.

There were no tests for distributing a negate into OpIMul, OpSDiv, and
OpUDiv. Tests are added for all of these.

Fixes #5822
2024-09-26 15:00:56 -04:00
JN Mo
44936c4a9d
Add support for SPV_KHR_compute_shader_derivative (#5817)
* Add support for SPV_KHR_compute_shader_derivative

* Update tests for SPV_KHR_compute_shader_derivatives

---------

Co-authored-by: MagicPoncho <magicponcho@gmail.com>
2024-09-25 09:59:33 -04:00
alan-baker
362ce7c60d
Allow more levels of arrays with component decoration (#5820)
Fixes #5819

* Allow multiple levels of arrays in a variable with component
  decoration
2024-09-24 11:14:28 -04:00
Sven van Haastregt
7ba72f14f2
spirv-val: Disallow stores according to VUID 06924 (#5368)
Ensure that the validator rejects stores to objects of types
`OpTypeImage`, `OpTypeSampler`, `OpTypeSampledImage`,
`OpTypeAccelerationStructureKHR`, and arrays of these types, according
to `VUID-StandaloneSpirv-OpTypeImage-06924`.

Guard the check behind the before_hlsl_legalization option, as
sometimes we may have temporaries or local variables that are expected
to get optimized away.

Fixes #4796


Change-Id: Ie035c01c5f94e7bdfc16b5c6c85705f302b7bda3

Signed-off-by: Sven van Haastregt <sven.vanhaastregt@arm.com>
2024-09-23 08:34:30 -04:00
Viktoria Maximova
01c8438ee4
[SPV_KHR_untyped_pointers] Fix verification for OpenCL.std instructions (#5810)
Allow `p` to be untyped pointer for `fract`, `frexp`, `lgamma_r`,
`modf`, `remquo`, and `sincos`.

```
operand must be a pointer(p1, ...).If it is a typed pointer, it must
point to data types.

```

https://htmlpreview.github.io/?https://github.com/KhronosGroup/SPIRV-Registry/blob/main/extensions/KHR/SPV_KHR_untyped_pointers.html#_modifications_to_the_opencl_std_extended_instruction_set
2024-09-20 11:31:46 -04:00
Ben Ashbaugh
20788a4c5f
add support for SPV_INTEL_global_variable_host_access (#5786) 2024-09-17 12:31:29 -04:00
Steven Perron
d85446fd7e
[OPT] Fix generating debugLocalVariable from debugGlobalVariable (#5803)
The code converting the global to local was generating an extra operand
that was incorrect. Fixed the code, and added a unit test.

Fixes #5776
2024-09-16 10:11:22 -04:00
David Neto
4451f6ab13
Implement to_string(uint32_t) without using the locale (#5805)
Using the locale takes a mutex deep in the C++ library.
Avoid this on hot compilation paths, e.g. in the validator.

Fixed: #5802
2024-09-12 14:30:18 -07:00
cheneym2
37d2fcb485
spirv-opt: fix crash in function declarations (#5796)
* spirv-opt: fix crash in function declarations

Function declarations contain no blocks, so bail before segfaulting
in function optimization passes that operate on blocks.

Fixes #5795

* spirv-opt: add test for optimizing declarations
2024-09-12 07:21:12 -04:00
alan-baker
380275eacd
Do not check structurally unreachable continue target predecessors (#5800)
Fixes #5784

* Rules only apply to structurally reachable blocks
2024-09-11 14:50:30 -04:00
alan-baker
e9915cea8d
Update sampled image validation (#5789)
Fixes #5781

* Requires all image operands to match except for depth between operand
  and result
2024-09-09 13:09:19 -04:00
Nathan Gauër
07f49ce65d
spirv-opt: make traversal deterministic (#5790)
Related to https://github.com/microsoft/DirectXShaderCompiler/issues/6804
2024-09-09 08:59:51 -04:00
Viktoria Maximova
f914d9c8a4
[SPV_KHR_untyped_pointers] Fix verification of vload/vstore OpenCL.std instructions (#5788)
* [SPV_KHR_untyped_pointers] Fix verification of vload/vstore OpenCL.std instructions

Allow `p` to be untyped pointer.

```
operand must be a pointer(p1, ...).If it is a typed pointer, it must point to data types.

```

https://htmlpreview.github.io/?https://github.com/KhronosGroup/SPIRV-Registry/blob/main/extensions/KHR/SPV_KHR_untyped_pointers.html#_modifications_to_the_opencl_std_extended_instruction_set

* relax printf check as well
2024-09-06 10:59:59 -04:00
Laura Hermanns
b31baff4ee
[opt] Add struct-packing pass and unit test. (#5778)
This pass allows to re-assign offset layout decorations
to tightly pack a struct according to its packing rules.
2024-09-05 15:24:29 -04:00
alan-baker
61d6952e2e
Revert "OpSampledImage extra validation (#5695)" (#5785)
This reverts commit 70ad4dae7d.

Contributes to #5781

SPIR WG 2024-09-04: decision to relax validation requirement in the spec.
2024-09-04 14:59:51 -04:00
Kévin Petit
b21dda0ee7
Validate presence of Stride operand to OpCooperativeMatrix{Load,Store}KHR (#5777)
* Validate Stride operand to OpCooperativeMatrix{Load,Store}KHR

The specification requires the Stride operand for the RowMajorKHR and
ColumnMajorKHR layouts.

Signed-off-by: Kevin Petit <kevin.petit@arm.com>
Change-Id: I51084b9b8dedebf9cab7ae25334ee56b75ef0126

* Update source/val/validate_memory.cpp

Co-authored-by: alan-baker <alanbaker@google.com>

* add test to exercise memory layout from spec constant and fix validation

Change-Id: I06d7308c4a2b62d26d69e88e03bfa009a7f8fff3

* format fixes

Change-Id: I9cbabec0ed2172dcd228cc385551cb7a5b79df1a

---------

Signed-off-by: Kevin Petit <kevin.petit@arm.com>
Co-authored-by: alan-baker <alanbaker@google.com>
2024-08-29 08:15:31 -04:00
Steven Perron
0c40b591a3
[OPT] Add SPV_KHR_ray_tracing_position_fetch to allow lists (#5757)
Fixes https://github.com/microsoft/DirectXShaderCompiler/issues/6844
2024-08-21 11:05:43 -04:00
Markus Tavenrath
b64a423b44
Workaround issue in MSVC arm64 compiler returning random upper 32-bits in function spvtools::util::CountSetBits. (#5763)
Fix issue #5762
2024-08-07 14:11:11 -04:00
Steven Perron
72c291332a
Add OpTypeRuntimeArray to composite types (#5765) 2024-08-07 12:33:51 -04:00
Steven Perron
246daf246b
[OPT] Avoid assert in generatecopy (#5756)
We want to be able to recover when fix storage class is not able to fix
everything, and just leave the spir-v in an invalid state. The pass
should not fail because of that.
2024-07-31 14:11:45 -07:00
alan-baker
8731673a5d
Allow ArrayStride on untyped pointers (#5746) 2024-07-24 13:36:11 -04:00
Steven Perron
81a116002b
[opt] Fix uses of type manager in fix storage class (#5740)
This removes some uses of the type manager. One use could not be
removed. Instead I had to update GenCopy to not use the type manager,
and be able to copy pointers.

Part of #5691
2024-07-24 14:42:00 +02:00
Karol Herbst
e99a5c033e
spirv-link: allow linking functions with different pointer arguments (#5534)
* linker: run dedup earlier

Otherwise `linkings_to_do` might end up with stale IDs.

* linker: allow linking functions with different pointer arguments

Since llvm-17 there are no typed pointers and hte SPIRV-LLVM-Translator
doesn't know the function signature of imported functions.

I'm investigating different ways of solving this problem and adding an
option to work around it inside `spirv-link` is one of those.

The code is almost complete, just I'm having troubles constructing the
bitcast to cast the pointer parameters to the final type.

Closes: https://github.com/KhronosGroup/SPIRV-LLVM-Translator/issues/2153

* test/linker: add tests to test the AllowPtrTypeMismatch feature
2024-07-24 08:38:19 -04:00
Steven Perron
ca373497f1
[opt] Fix pointer stores in DCE (#5739)
When a trying to mark store that use the same address as a load live, we
consider any use of the pointer in the store instruction enough to make
the store live. This is not correct. We should only mark the store as
live if it store to the pointer, and not storing the pointer to another
memory location.

This causes DCE to miss some dead code.
2024-07-24 14:36:26 +02:00
Ben Ashbaugh
a0817526b8
properly handle the load and store cache control operand types (#5664)
* properly handle the load and store cache control operand types

Without handling these operand types, disassembling a SPIR-V module that uses the cache control extension produces an invalid operand type error.

* add a round trip test for SPV_INTEL_cache_controls
2024-07-22 11:18:16 -04:00
Nathan Gauër
2ea4003633
opt: split composite from array flattening (#5733)
* opt: split composite from array flattening

DXC has an option to flatten resource arrays. But when this option
is not used, the resource arrays should be kept as-is.
On the other hand, when a struct contains resources, we MUST flatten is
to be compliant with the Vulkan spec.

Because this pass flattens both types of resources, using a struct of
resources automatically implied flattening arrays.
By adding those 2 new settings, we decide if the pass flattens only one type
of resources, or both.
Note: the flatten_arrays flag only impacts resource arrays.
Arrays of composites containing resources are still flattened.

Since the API is considered stable, I added 2 new functions to create
passes with one flag or the other, and kept the original behavior as-is.

Related to https://github.com/microsoft/DirectXShaderCompiler/issues/6745

Signed-off-by: Nathan Gauër <brioche@google.com>

* add commandline options

Signed-off-by: Nathan Gauër <brioche@google.com>

* clang-format

Signed-off-by: Nathan Gauër <brioche@google.com>

---------

Signed-off-by: Nathan Gauër <brioche@google.com>
2024-07-19 11:48:21 -04:00
alan-baker
3ab0d22608
Support SPV_KHR_untyped_pointers (#5736)
* Support SPV_KHR_untyped_pointers

Covers:
- assembler
- disassembler
- validator

fix copyright

Validate OpTypeUntypedPointerKHR

* Disallow an untyped pointer in a typed pointer
* Validate capability requirements for untyped pointer
* Allow duplicate untyped pointer declarations

Add round trip tests

Validate OpUntypedVariableKHR

Validate untyped access chains

* Add a test for opcodes that generate untyped pointers
* simplify some checks for operands needing types
* validate OpUnypedAccessChainKHR, OpUntypedInBoundsAccessChainKHR,
  OpUntypedPtrAccessChainKHR, OpUntypedInBoundsPtrAccessChainKHR

Unify variable validation

Validate OpCopyMemorySized

* Fix some opcode tests to accound for untyped pointers
* Add validation for OpCopyMemorySized for shaders and untyped pointers
* fix up tests

Validate pointer comparisons and bitcast

* Update more helpers
* Fix entry validation to allow OpUntypedVariableKHR
* Validate OpPtrEqual, OpPtrNotEqual and OpPtrDiff
* Validate OpBitcast

Validate atomics and untyped pointers

Make interface variable validation aware of untyped pointers

* Check OpUntypedVariableKHR in interface validation

More untyped pointer validation

* Validate interfaces more thoroughly
* Validate layouts for untyped pointer uses
* Improve capability checks for vulkan with OpTypeUntypedPointerKHR
* workgroup member explicit layout validation updates

More validation

* validate function arguments and parameters
* handle untyped pointer and variable in more places

Add a friendly assembly name for untyped pointers

Update OpCopyMemory validation and tests

Fix test for token update

Fixes for validation

* Allow typed pointers to contain untyped pointers
* Fix decoration validation
* add untyped pointer as a case for size and alignments

Fix interface validation

* Grabbed the wrong storage class operand for untyped variables
* Add ability to specify assembler options in validation tests

Add passthrough validation for OpUntypedArrayLengthKHR

More validation of untyped pointers

* Validate OpUntypedArrayLengthKHR
* Validate layout for OpLoad, OpStore, and OpUntypedArrayLengthKHR

Validation support for cooperative matrix and untyped pointers

* Allow untyped pointers for cooperative matrix KHR load and store

Updates to match spec

* Remove extra capability references
* Swap untyped variable data type and storage class operands
* update validation of variables

* update deps

---------

Co-authored-by: David Neto <dneto@google.com>
2024-07-17 14:51:37 -04:00
Steven Perron
6248fda376
Handle coop matrix in fix storage class (#5729) 2024-07-17 15:22:32 +02:00
LU-JOHN
7c778973e5
Allow fmt arg to printf to be an array of i8 in non-constant space (#5677)
* In spirv-val allow format arg to printf to be an array of i8 in Generic space

Signed-off-by: Lu, John <john.lu@intel.com>

* Allow more addr spaces for printf format string

Signed-off-by: Lu, John <john.lu@intel.com>

* Update printf format arg testcase

Signed-off-by: Lu, John <john.lu@intel.com>

* Apply clang-format

Signed-off-by: Lu, John <john.lu@intel.com>

* Reorder code for clarity

Signed-off-by: Lu, John <john.lu@intel.com>

* Only allow other addr spaces if extension is seen

Signed-off-by: Lu, John <john.lu@intel.com>

* Add test to check printf format with extension

Signed-off-by: Lu, John <john.lu@intel.com>

* Add extension correctly

Signed-off-by: Lu, John <john.lu@intel.com>

---------

Signed-off-by: Lu, John <john.lu@intel.com>
2024-07-16 09:20:04 -04:00
Sven van Haastregt
6a5fa5f70a
Fix SPRIV -> SPIRV typos (#5735)
Fix all occurrences of "spriv" typos (irrespective of case).

Signed-off-by: Sven van Haastregt <sven.vanhaastregt@arm.com>
2024-07-15 20:10:06 -04:00
Victor Lomuller
3bc9744d0a
Add FPEncoding operand type. (#5726)
This patch adds the optional FPEncoding operand that can be added to OpTypeFloat.
At the moment there is no usable operand, so support is limited to adding the entry.

Co-authored-by: Kévin Petit <kevin.petit@arm.com>
Co-authored-by: David Neto <dneto@google.com>
2024-07-03 13:18:40 -04:00