Commit Graph

324 Commits

Author SHA1 Message Date
João Capucho
14719553a6 glsl-in: fix pre/postfix ops on swizzles 2021-12-05 22:16:28 -05:00
Dzmitry Malyshau
6fbd668bd3 Add missing GLSL tests 2021-12-02 13:11:23 -05:00
João Capucho
9fac7c48a6 glsl-in: Allow vector/matrix in vector constructor
The glsl spec defines that vector constructors flatten their arguments
and consume them in order, ignoring the remaining arguments if there are
more than needed
2021-11-29 11:06:18 -05:00
Igor Shaposhnik
dba6beb941 [wgsl-in] Don't allow redefinition of module scope identifiers 2021-11-28 21:23:22 -05:00
Igor Shaposhnik
20b96ef47b Avoid function name redefinition in tests 2021-11-28 21:23:22 -05:00
Dzmitry Malyshau
74132ba947 Actually disable explicit types on most WGSL outputs 2021-11-26 11:36:46 -05:00
Dzmitry Malyshau
ddbc1c4b1f WGSL: use underscore prefix like the other backends 2021-11-25 16:23:24 -05:00
Igor Shaposhnik
2107b20561 [wgsl-in] Don't allow keywords to be used as identifiers 2021-11-24 16:34:17 -05:00
Jim Blandy
cc930180d9 Tighten checks on pointers to unsized values, and pointer arguments.
Pointers should not be `DATA`: they can never be stored in anything. (Function
arguments are not storage; they're like `let` bindings.)

Un-`SIZED` values may only live in the `Storage` storage class, so creating
pointers to them in other storage classes is meaningless.

The `ARGUMENT` flag should be set only on pointers in those storage classes that
are permitted to be passed to functions.

See comments in code for details.

Fixes #1513.
2021-11-18 17:39:56 -05:00
Jim Blandy
633f1b3377 [wgsl-in] Don't be confused by pointers to globals.
The WGSL front end knows that globals in the `Handle` storage class do not
produce references, but it attempts to manage this in two places which trip over
each other. As a consequence, referring to a `let` binding holding a pointer to
a global flips the variable's type from WGSL `ptr` to WGSL reference, with
bewildering consequences.
2021-11-18 17:39:56 -05:00
Jim Blandy
ce18eba695 Check that stores are permitted by the pointer's storage access.
Fixes #1533.
2021-11-16 23:40:56 -05:00
Boris-Chengbiao Zhou
1dcde48d09 [valid] Check that switches have a default case (#1529)
From the WGSL spec: "Each switch statement must have exactly one default clause."
2021-11-15 00:07:55 +00:00
Jay Oster
66c3499df8 [spv-out] Fix scalar-times-matrix operations (#1524) 2021-11-14 19:07:38 -05:00
Jim Blandy
e69a70bfb7 [spv-in] Permit pointers to runtime arrays only in StorageBuffer. (#1522)
* [spv-in] Change shadow.spv test input to use StorageBuffer.

The ecosystem around Naga will generally not be able to use Vulkan adapters that
don't support the SPV_KHR_storage_buffer_storage_class (which was incorporated
into SPIR-V 1.3), so we can assume it is present.

Changing the test not to use runtime-sized arrays in the Uniform storage class
will allow Naga to tighten up some validation checks.

* [spv-in] Permit pointers to runtime arrays only in StorageBuffer.

Fixes #1519.
2021-11-10 16:58:57 -05:00
João Capucho
d168f15d81 [glsl-in] Allow constructors from non-scalar to scalar (#1520) 2021-11-10 12:15:43 -05:00
João Capucho
c3c4ab7548 [glsl-in] Add test for matrix from matrix constructor 2021-11-09 15:15:11 +00:00
João Capucho
7234d19d00 [glsl-in] Implement matrix to matrix constructor 2021-11-09 15:15:11 +00:00
Dzmitry Malyshau
8bc3aa824b Refactor namer scheme, fix trailing digits (#1510) 2021-11-09 09:24:41 -05:00
Dzmitry Malyshau
28c45321e5 hlsl: respect array stride in storage buffers (#1507) 2021-11-03 22:44:46 -04:00
Jim Blandy
c1b378842e Make tests properly exercise Some("") global names. (#1503)
The GLSL empty-global-name.frag test doesn't suffice because the GLSL front end
doesn't produce the same IR as the SPIR-V included in the bug report. As far as
I know, only a genuine SPIR-V input test can produce a global whose name is
`Some("")`.

Include the SPIR-V assembly source.
2021-11-01 14:07:11 -04:00
Igor Shaposhnik
00bbbed90a Handle empty variable names in namer (#1484)
* Handle empty variable names in namer

* Add glsl-in test with empty global name
2021-10-26 17:46:27 -04:00
João Capucho
63dbd38edc Make default a switch case (#1477)
* Make default a switch case

Previously the default case of a switch statement was encoded as a block
in the statement but the wgsl spec defines it in such a way that the
default case ordering matters.

* [spv-out] Support for the new switch IR

* [dot-out] Use different labels for default cases
2021-10-26 13:31:54 -04:00
Dzmitry Malyshau
fd5085277a Switch the constant in bevy-pbr to avoid display incosistencies 2021-10-23 23:39:49 -04:00
João Capucho
c3a0d71f8b [spv-out] Write function arguments names (#1472) 2021-10-23 23:20:12 -04:00
João Capucho
70ad084ad4 [spv-in]: Cull unused builtins inside structs (#1469)
Some compilers like shaderc introduce a full gl_PerVertex struct, this
includes gl_ClipDistance. Normally this isn't a problem since most
drivers optimize it away, but naga zero inits globals if they weren't
previously initialized. This causes gl_ClipDistance to be initialized to
zero which can be really bad for performance.
2021-10-19 22:55:20 -04:00
Jim Blandy
ed4cc8e4d8 Use Cow to reduce allocation in proc::Namer. (#1465)
Minimize allocation in the namer. Heap-allocate string only when needed to
provide an owned key for a hash table, or to hold synthesized text. Try to reuse
allocations.

Many unnecessary trailing `_` characters are removed from test output. These
were all superfluous; separators are still inserted where necessary.
2021-10-16 17:56:59 +00:00
Dzmitry Malyshau
ee450c1ee4 Fix float-bool casts in MSL, SPV, and HLSL backends (#1459) 2021-10-12 11:42:20 -04:00
Igor Shaposhnik
943235cd5e [glsl-out] Convert modulo operator on float to SPIR-V OpFRem equivalent function (#1452) 2021-10-07 16:59:39 -04:00
Jim Blandy
0e3fbc8166 Replace pointer-access.spv snapshot test with WGSL source. (#1450)
The original pointer access test used SPIR-V for its input because WGSL didn't
have a working pointer indirection operator at the time. Now that it does, we
can just write this test in WGSL directly.

Fixes #1432.
2021-10-06 16:30:36 -04:00
Connor Fitzgerald
2f5a41cce9 Add insert/extractBits and pack/unpack functions (#1449) 2021-10-05 20:32:57 -04:00
João Capucho
da00bf2be6 [glsl-in] Always use uint for array size (#1448) 2021-10-05 13:05:47 -04:00
João Capucho
71a75d727d [glsl-out] Es: convert 1D images to 2D (#1436) 2021-10-03 23:01:44 -04:00
João Capucho
b34fa5f2cc [glsl-in] Fix array index parsing for 1D images (#1445) 2021-10-03 16:22:14 +00:00
Jim Blandy
4ef1cc403b Remove Namer::call_unique. (#1439)
Replace uses of `call_unique` with uses of `call` and `call_or`, which becomes
public. It's not clear when `call_unique` is correct to use, and avoiding a few
numeric suffixes here and there isn't worth it.
2021-09-29 19:33:38 -04:00
Igor Shaposhnik
a4bf25a0d5 Emit std430 layout qualifiers for storage buffers (#1435)
* Remove unused petgraph dependency from glsl-out

* Emit std430 layout qualifiers for storage buffers
2021-09-29 12:24:34 -04:00
Dzmitry Malyshau
004a12e21d [spv-out] option to clamp frag_depth (#1431) 2021-09-27 23:00:10 +00:00
Dzmitry Malyshau
21324b8fea Update WGSL grammar for pointer access. (#1312)
* Update WGSL grammar for pointer access.

Comes with a small test, which revealed a number of issues in the backends.

* Validate pointer arguments to functions to only have function/private/workgroup classes.

Comes with a small test. Also, "pointer-access.spv" test is temporarily disabled.
2021-09-27 18:49:28 -04:00
João Capucho
38d74a7f0a [glsl-in] Use intermediate local if storage class isn't function
Automatically spills to a local variable function call arguments to
parameters expecting a pointer where the argument storage class isn't
function since the storage classes wouldn't match.
2021-09-27 21:09:08 +01:00
Jim Blandy
8122598fe7 [wgsl-out] Correct handling of named pointer expressions.
Treat expressions in `Function::named_expressions` like WGSL `let` declarations,
assuming that the Load Rule was applied to the rhs of the declaration, meaning
that their values are always `Indirection::Ordinary`.

Split `write_expr_plain_form` out from `write_expr_with_indirection`, to clean
up the parenthesis generation: no more `opened_paren` variable, just function
calls. This makes the early return for named expressions neater.

Fixes #1382.
2021-09-27 16:01:43 -04:00
Jim Blandy
944a693ae5 Use UniqueArena for types.
Ensure that each distinct type occurs only once in `Module::types`, so that we
can use `Eq` on `Type` or `TypeInner` for type equivalence, without being
confused by differing `Handle<Type>` values that point to identical types.

This removes a number of duplicate types from the ir snapshots.

Fixes #1385.
2021-09-27 15:17:41 -04:00
Jim Blandy
d44e2ad207 Simplify interpolation defaulting.
Replace `Module::apply_common_default_interpolation` with a simpler function
that handles a single `Binding` at a time. In exchange for the simplicity, the
function must be called at each point function arguments, function results, and
struct members are prepared. (Any missed spots will be caught by the verifier.)

This approach no longer requires mutating types in the arena, a prerequisite for
properly handling type identity.

Applying defaults to struct members when the struct declaration is parsed does
have a disadvantage, compared to the old whole-module pass: at struct parse
time, we don't yet know which pipeline stages the struct will be used in. The
best we can do is apply defaults to anything with a `Location` binding. This
causes needless qualifiers to appear in some output. However, it seems that our
back end languages all tolerate such qualifiers.
2021-09-27 15:17:41 -04:00
João Capucho
160ab82fee [glsl-in] Allow array constructors 2021-09-21 18:25:43 -04:00
João Capucho
70db5f681d [glsl-in] Allow use of constructors for user types 2021-09-21 18:25:43 -04:00
João Capucho
d5fc05e8a4 Allow unsigned integers in switch 2021-09-21 17:16:51 -04:00
João Capucho
6a57559070 [glsl-out] Improve handling of samplerCubeArrayShadow
Adds checks that it isn't used in an unsupported function and emits the
depth_ref as a separate argument.
2021-09-21 16:54:05 -04:00
Dzmitry Malyshau
115d170584 wgsl-out: update reserved words 2021-09-21 13:51:12 -04:00
Aleksi Sapon
42db64628e wgsl-out: vector bitcast 2021-09-21 15:50:10 +01:00
João Capucho
7895e7f036 Don't output identifiers starting with _ 2021-09-19 15:18:17 -04:00
João Capucho
d7ca7d43b9 [glsl-in] Improve infix handling
Add support for float, vector and matrices targets.

Fix prefix and postfix being inverted (one was returning the value
of the other).

Remove an unneeded local indirection for prefix handling.

Add tests.
2021-09-17 13:56:42 -04:00
João Capucho
1cb4447ec3 [glsl-in] Add test array constant dynamic indexing 2021-09-17 13:47:38 -04:00