Commit Graph

1825 Commits

Author SHA1 Message Date
João Capucho
7d0e9847b0 Remove the glsl-validate feature
When it was introduced it was supposed to allow for fast compiles by
skipping glsl specific validation, but as it turns the subset of glsl that's
compilable code is already pretty close to the subset of valid glsl code.

So the current code gated behind glsl-validate amounts to a single branch that
isn't even performance sensitive, and most of the validation is not specific to
glsl and is made by naga's validator which can be turned off, so the original
goal of fast compile times by disabling validation can still be accomplished.
2022-09-05 19:37:39 -07:00
João Capucho
d9c9fe6218 glsl-in: Migrate to SymbolTable 2022-09-05 13:30:55 +01:00
João Capucho
544f14ad2f Add some methods to SymbolTable and implement Debug 2022-09-05 13:30:55 +01:00
Jim Blandy
13a0d28ddc wgsl-in: Rename Scope to Rule, since we now have lexical scope.
Rename related functions and variables appropriately.

Also, make `Rule` private to the WGSL front end, and remove the unused
`ImportDecl` variant.
2022-09-03 08:56:52 -07:00
Jim Blandy
7505187476 [spv-out] Don't emit no-op OpBitCast instructions.
As reported in #2015, some drivers trip over these.
2022-09-03 16:39:07 +01:00
João Capucho
d64d78ff0b wgsl-in: Implement lexical scopes
Previously the wgsl frontend wasn't aware of lexical scopes causing all
variables and named expressions to share a single function scope, this
meant that if a variable was defined in a block with the same name as a
variable in the function body, the variable in the function body would
be lost and exiting the block all references to the variable in the
function body would be replaced with the variable of the block.

This commit fixes that by using the previously introduced `SymbolTable`
to track the lexical and perform the variable lookups, scopes are pushed
and popped as defined in the wgsl specification.
2022-09-01 17:31:50 -07:00
João Capucho
66f5506e10 Add a frontend agnostic symbol table
Adds a new type `SymbolTable` to allow sharing code between the
frontends related to variable name lookup and lexical scope management,
this way improvements in variable lookup can be shared among all
frontends.
2022-09-01 17:31:50 -07:00
Jim Blandy
b209d91168 [spv-out] Properly combine the fixes for #2035 and #2038.
The Vulkan decoration rules require us to distinguish vertex shader
inputs, fragment shader inputs, and everything else, so just pass the
stage to `Writer::write_varying`. Together with the SPIRV storage
class, this is sufficient to distinguish all the cases in a way that
closely follows the spec language.
2022-09-01 15:55:42 -07:00
Jim Blandy
5be898e7e7 Use Option::as_deref as appropriate. 2022-09-01 10:46:28 -07:00
Nicolas Silva
b63436af36 Decorate most builtins as Flat in the spirv writer.
Fixes #2032
2022-09-01 10:27:19 -07:00
Nicolas Silva
6b3c111f3f Don't decorate varyings with interpolation modes at the beginning and end of the pipeline.
Fixes #2036.
2022-09-01 10:17:55 -07:00
João Capucho
9df243c42c hlsl-out: Add support for push constants (#2005)
Push constants need to be configured by the consumer which must pass the
bind target of the constant buffer used for the push constants.
2022-08-29 11:58:02 +01:00
Adeline
e7ddd3564c glsl-in: Fix missing stores for local declarations (#2029)
Previously, if a local variable was declared with a constant value, we
would elide the store and instead give the variable an initial value (as
if it was a global variable). This caused variables to not be
re-initialized each time through a loop.
2022-08-24 22:05:11 +01:00
daxpedda
48e79388b5 Implement Clone for Module (#2013)
This is hidden behind the `clone` feature flag
2022-08-16 11:45:19 +01:00
Evan Mark Hopkins
a80967f860 Add support for the saturate function (#2025)
uses clamp in place of saturate in spv and glsl
2022-08-16 10:43:41 +00:00
João Capucho
6f4003ca9b Fix clippy lints for 1.63 (#2026) 2022-08-15 21:53:14 -04:00
SpaceCat~Chan
f2624ea378 [glsl-in] add support for .length() (#2017)
Adds parsing support for methods on the glsl frontend, while `.length` is the only method in the base extensions, there might be more in extensions.

Adds support for the `.length` method and tests for it.
2022-08-08 18:09:22 +01:00
Christofer Nolander
cfbc91d6cf add emit_to_{stderr,string} helpers for validation errors (#2012)
Mirrors those already found for parse errors.

Also removes the `StringErrorBuffer` writer in favor of the existing `NoColor` writer (from `codespan`) and added the emit_to_string_with_path method to complete the set.
2022-08-06 22:48:07 +01:00
João Capucho
c6f34fa4d8 dot-out: Improvements
Improves the dot backend output by:
- Linking new nodes to the end of other blocks, instead of the beginning
- Generating merge nodes for conditional statements
- Generating connections from break/continue nodes to their target
- Introducing a "cfg only" mode that only generates statements
2022-08-03 15:01:26 -07:00
Jeron Aldaron Lau
a0058217d6 Make termcolor dependency optional (#2014) 2022-07-23 00:46:28 -04:00
Ashley
cc985396da Handle Unpack2x16float in hlsl (#2002) 2022-07-17 03:18:48 -04:00
ani
8f302a89ef Update reserved WGSL keywords (#2009) 2022-07-17 00:40:05 -04:00
Ashley
17dcf39a1b Rename hlsl input/output structs (#2001) 2022-07-06 14:27:54 -04:00
Connor Fitzgerald
350171ed2f Prepare naga-cli 0.9 for release (#1999) naga-cli-v0.9.0 2022-07-02 04:00:51 +00:00
Connor Fitzgerald
06ae90527d Release 0.9 (#1998)
* Release 0.9

* Further update changelog

* Apply suggestions from code review

Co-authored-by: Teodor Tanasoaia <28601907+teoxoy@users.noreply.github.com>

Co-authored-by: Teodor Tanasoaia <28601907+teoxoy@users.noreply.github.com>
naga-v0.9.0
2022-06-30 19:51:46 +00:00
Ashley
e2d688088a Support for the OVR_multiview2 WebGL extension (#1933)
* Make some (currently hacky) changes to enable multiview in webgl

* Fix ViewIndex built in for this extension

* Run cargo fmt, fix tests

* Allow specifying if we're targetting webgl in the glsl version

* Document multiview2 extension

* fn embedded -> const fn embedded

* Fix tests

* Fix benches

* Add snapshot tests

* Revamp so that the glsl options have some multiview options. Also add tests

* Make clippy happier

* Go back to having is_webgl be part of Version

* Use wgsl as input for tests

* Rename Version::new_embedded to Version::new_gles, fix glsl validation

* Run cargo fmt

* Fix brand new clippy warnings
2022-06-30 17:58:47 +01:00
João Capucho
b746e0a420 spv-in: Fix incorrect translation of SMod (#1995)
Since spirv's SMod doesn't map to naga's IR modulo operator the
instruction is mapped into it's direct formula, this formula requires
some casts from int to float and back.

These casts were present but their `convert` field was left to `None`
which implied that they were bitcasts, causing some wildly incorrect
results.

This commit fixes it by setting the `convert` field to the same size as
the result type.
2022-06-30 11:34:42 -04:00
Teodor Tanasoaia
27d38aae33 [hlsl-out] More matCx2 fixes (#1989)
* [hlsl-out] fix matCx2 as global uniform

* [hlsl-out] update comments

* [hlsl-out] fix `row_major` not being written on global arrays of matrices and also write it on nested arrays of matrices

* [hlsl-out] fix matCx2's nested inside global arrays

* [hlsl-out] fix struct members of type array<matCx2>

* [hlsl-out] test mat2x4 to make sure our matCx2 code behaves properly
2022-06-27 15:56:10 -07:00
João Capucho
67ef37ae99 Add support for 'break if' to IR, wgsl-in, and all backends. 2022-06-24 17:47:07 -07:00
Ashley
ea832a9eec [glsl-out] Handle vector bitcasts (#1966)
* [spv-in] Fix bitcasts on non-scalars

* Fix ::As handling in glsl

* Cargo fmt

* Make cargo clippy happy

* Add snapshot tests

* Use write_type_value

* target_vector_kind -> target_vector_type
2022-06-20 22:25:13 -07:00
João Capucho
6d78f1c06d hlsl-out: Fix indentation for continuing block
The continuing block in hlsl was being generated with the same indentation as the loop body
2022-06-17 16:34:23 +02:00
João Capucho
cafdb160ae glsl-out: Fix indentation for continuing block 2022-06-17 16:17:22 +02:00
teoxoy
89f24b6cfe [msl-out] insert padding initialization for global constants 2022-06-17 10:55:28 +02:00
Jim Blandy
0b60f410ab [wgsl-in] Restore error in the case of bad scalar widths. 2022-06-17 01:31:59 +02:00
teoxoy
ad536ce0df [wgsl-in] remove unused code 2022-06-16 12:13:08 -07:00
teoxoy
531d563f0e [wgsl-in] implement complete validation for size and align attributes 2022-06-16 12:13:08 -07:00
teoxoy
46387e90ce unify alignment related functionality 2022-06-16 12:13:08 -07:00
João Capucho
357da63076 Patch ron version (#1986)
Require at least version 0.7.1 of ron, this version changed how floating points are
serialized by forcing them to always have the decimal part, this makes it backwards
incompatible with our tests because we do a syntatic diff and not a semantic one.
2022-06-15 15:17:59 -04:00
João Capucho
98bc8fedf9 Apply comments 2022-06-14 16:04:08 -07:00
João Capucho
ae58fbf4d0 Add tests 2022-06-14 16:04:08 -07:00
João Capucho
70743ee7dc glsl-in: Perform casts in int only math functions
Some functions like abs only accept signed integers while naga's IR
accepts both signed and unsigned integers, this wasn't accounted for in
the glsl backend causing it to produce code that wouldn't type check.

This commit addresses it by performing casts from uint to int of the
function argument and then back from int to uint for the function
return.
2022-06-14 16:04:08 -07:00
João Capucho
ae50f31d4f glsl-in: Don't allow empty last case in switch
The GLSL spec forbids switch statements with an empty last case, so we
check that now and throw an error if necessary
2022-06-14 22:31:27 +01:00
João Capucho
dab932e8ce glsl-in: Fix last case falltrough and empty switch
GLSL allows the last case of a switch statement to not have a `break`
statement causing it to be marked as fall-trough, naga's IR on the other
hand doesn't allow the last case to be fall-trough, this is fixed by
force marking it in the glsl frontend as not fall-trough.

GLSL also allows empty switch statements and without default cases,
naga's IR requires there be a default case, this is fixed by adding an
empty default case in the glsl frontend if no default case was present
in the switch statement.
2022-06-14 22:31:27 +01:00
João Capucho
52bb25179b glsl-in: Splat inputs for smoothstep if needed
Glsl defines two overloads for smoothstep that accept `min` and `max` as
scalars and the value as a vector, naga's IR is stricter and only allows
operators with the same dimensions, so this inputs must be splatted.
2022-06-14 13:15:08 -07:00
João Capucho
c7e6769001 Add tests 2022-06-14 13:14:43 -07:00
João Capucho
46bc882d19 msl: don't rely on cached expressions
Expressions marked for caching might not be cached, this can happen for
example when these expressions are pre emitted (for example Contants).
2022-06-14 13:14:43 -07:00
João Capucho
b5a046982f glsl-out: don't rely on cached expressions
Expressions marked for caching might not be cached, this can happen for
example when these expressions are pre emitted (for example Contants).
2022-06-14 13:14:43 -07:00
João Capucho
81e2b006e1 glsl-in: Add test for nested depth texture calls
Co-authored-by: Jasper St. Pierre <jstpierre@mecheye.net>
2022-06-14 13:11:30 -07:00
João Capucho
3d3e5ae00d glsl-in: Fix parameter not changing to depth
The conversion from sampled images to depth changed the `argument` type
but didn't change the `parameter` type (`argument` without pointer
indirection) causing 2+ deep propagation of depth images with function
arguments to fail.
2022-06-14 13:11:30 -07:00
teoxoy
0a6b0e5b71 update changelog for v0.9 2022-06-14 11:47:39 -07:00