Commit graph

201 commits

Author SHA1 Message Date
Marijn Suijten 955cb28d12
Update Vulkan-Headers to 1.3.206 (#563)
* Update Vulkan-Headers to 1.3.205

* Update Vulkan-Headers to 1.3.206
2022-02-19 10:18:21 +01:00
Marijn Suijten e18e0243ef
ash: Remove unnecessary trivial_casts and trivial_numeric_casts (#564)
While making the code only marginally harder to read such casts can also
introduce subtle bugs when used incorrectly, and are best omitted
whenever unnecessary: Rust already coerces borrows into raw pointers
when the types on both ends are clear, and even then there remain many
casts that are identical to the source type.

In addition these errors show up when using a local crate reference to
`ash` in a workspace that uses "the `.cargo/config.toml` setup" from
[EmbarkStudios/rust-ecosystem#68] to configure linter warnings
project-wide instead of for all crates in that workspace individually.
In our case aforementioned linter warnings are enabled on top of
Embark's configuration, leading to a lot of these warnings in our build
process.

[EmbarkStudios/rust-ecosystem#68]: https://github.com/EmbarkStudios/rust-ecosystem/pull/68
2022-02-18 16:01:46 -08:00
Marijn Suijten bb02b20339
Replace 1.2-extensions documentation links with 1.3-extensions (#569)
All these 1.2 links redirect to the 1.3 pages: spare the redirects by
specifying the right - latest - version directly.
2022-01-28 17:10:52 -08:00
Marijn Suijten 405449901c
generator: Exclude static macro code (macros.rs) from the generator (#552)
Much like `platform_types.rs` and `vk.rs` before, there is no need to
generate this file as its contents are completely static.  This allows
direct editing of the file without realizing that a copy lives in the
generator - and will overwrite `macros.rs` when the generator is being
run.
2022-01-10 12:07:54 -08:00
Benjamin Saunders 45301fffa4 Optional flag/bitfield Debug impls 2021-12-21 17:01:35 -08:00
Benjamin Saunders 1700dcdf05 Make Debug impls optional
When disabled, this buys us a 12% reduction in buildtime.
2021-12-21 17:01:35 -08:00
Benjamin Saunders e34f755ece Move debug_flags definition out of the generator 2021-12-21 17:01:35 -08:00
Marijn Suijten 0ae56a0961
extensions: Don't check extension names for interior nuls at runtime (#522)
This name is emitted by the generator and already known to not contain
any null-characters: replace the runtime iteration+comparison (hidden
behind `from_bytes_with_nul`) and `.expect()` panic with an `unsafe`
"cast" through `from_bytes_with_nul_unchecked`, just like the
function-pointer loaders.
2021-12-22 01:38:48 +01:00
Marijn Suijten a7d5c49029 Update Vulkan-Headers to 1.2.203 2021-12-20 15:51:08 -08:00
Marijn Suijten 87b00568a6 extensions: Group enum extension variants together per impl T block
Instead of generating an impl block - together with "Generated from XXX"
doc - for every single item that extends an enum type, group all these
extensions together in a single `impl` block per extension per type.

This cuts down a couple thousand lines of repeated `impl T` and `#[doc]`
annotations, and makes the code more readable at the same time: it is
now possible to immediately see exactly all the constants that a certain
extension extends a type with.
2021-12-20 15:16:44 -08:00
Marijn Suijten 8f4709e70d generator: Remove now-unnecessary alias-identical check
Back when we were still trying to come up with sensible names for
"deprecated" aliases (initially introduced as self-supporting constants)
that don't adhere to the naming standard but only remain to exist for
backwards compatibility, some of these aliases would get the same name
as the enum constant they were aliasing, resulting in (compile-time)
conflicts.

Now that all those aliases are simply not generated anymore (end-users
should just pick the properly named variant) it is not necessary to
check for and prevent these conflicts on the generator side anymore.
2021-12-20 15:13:23 -08:00
Marijn Suijten fe55ad73bd generator: Don't zip the same iterator with and without filter
`constants` is iterated twice here: once with a filter, the other time
without, and the results are zipped together.  Besides being able to
simplify the entire execution to just one `iter()` without intermediary
iterators, removing `.zip()` makes it impossible for the results in both
iterators to get mismatched when the `filter` inevitably skips elements.
Fortunately no such cases seem to exist, or at least not that effect the
resulting generated code.
2021-12-20 15:07:27 -08:00
Marijn Suijten ac94739e11 generator: Remove unnecessary impl BuildHasher from HashMap types
Some clippy lint long ago apparently suggested to explicitly specify a
type for all random generators in 8550683 ("Address all the clippy lints
(#233)"), so the `impl BuildHasher` trait was apparently passed as a
placeholder for the `RandomState` default that's selected.

This does not serve any purpose and that (likely bogus) clippy warning
no longer shows up, making it safe to remove the trait.
2021-12-20 15:05:57 -08:00
Marijn Suijten 428830ad4f Update Vulkan-Headers to 1.2.202 2021-12-11 11:03:45 -08:00
Marijn Suijten f0c743a636
Fix new clippy warnings since Rust 1.57 (#507) 2021-12-11 13:25:19 +01:00
Marijn Suijten 0cddbad618
Update Vulkan-Headers to 1.2.201 (#504) 2021-12-01 20:17:19 +01:00
Marijn Suijten 4424efeef1 generator: Use "Backwards-compatible" comment to omit deprecated aliases
vk.xml now contains the comment text "Backwards-compatible alias
containing a typo" which we can use to detect intentional renames,
without needing to specify explicit overrides/exceptions in the
generator anymore.

These deprecated constants exist for the sole reason of backwards
compatibility which Vulkan cannot permit itself to remove in the C
headers, but are unreasonable for crate authors to use anyway due to
their `#[deprecated]` annotation whose cargo-check warnings are easy to
fix by just using the non-deprecated variant instead.  Furthermore, Ash
is still allowing itself to perform breaking changes in its releases
making this the perfect time to get rid of all these useless variants
and the generator support code that comes with it.  No need to come up
with a "more proper" variant name if we don't generate those that
"intentionally" fail to adhere to the "enum variant name" specification
in the first place.
2021-11-26 11:13:22 -08:00
Marijn Suijten 64f3de38ab
generator: Add missing documentation to bitflag extension variants (#501) 2021-11-23 20:11:42 +01:00
Marijn Suijten 9a35cff373
Update Vulkan-Headers to 1.2.200 (#497)
* Update Vulkan-Headers to 1.2.199

* Update Vulkan-Headers to 1.2.200
2021-11-23 20:00:46 +01:00
Marijn Suijten c4dd1d6040
vk: Remove misleading all()/-/-= function/ops from bitflags (#478)
The `all()` function only represents bitflags known in the core of
Vulkan; it omits all bits added by extensions making this function
unrepresentative and has hence been scheduled for removal for quite some
time to get rid of the confusion it causes.

Alternatively the generator could be taught to collect bitflags added by
extensions, but new extensions get added over time skewing available
values in ash versus the current driver/environment.  This makes the
value from `all()` unreliable and fragile at best.

`-` and `-=` (`sub()` and `sub_assign()`) are also controversial by
nature since the underlying value represents an integer but the
implemented math uses bitwise operators.  This is a confusing design
pattern and the caller better replaces their uses - if any at all - with
`foo &= !BAR`.
2021-11-10 00:35:35 +01:00
Marijn Suijten 3947675aaa
Update Vulkan-Headers to 1.2.198 (#477)
* Update Vulkan-Headers to 1.2.192

* Update Vulkan-Headers to 1.2.193

* Update Vulkan-Headers to 1.2.194

* Update Vulkan-Headers to 1.2.195

Includes the new VK_EXT_rgba10x6_formats, VK_KHR_format_feature_flags2
and VK_KHR_maintenance4 extensions.

* Update Vulkan-Headers to 1.2.196

Includes Vulkan-Headers fixup commit with the missing h265 encode
header.

* Update Vulkan-Headers to 1.2.197

* Update Vulkan-Headers to 1.2.198
2021-11-09 22:42:14 +01:00
Marijn Suijten e78a52a258
generator: Use Self instead of $name in macros (#479)
* generator: Use `Self` instead of `$name` in macros

Saves a bit of unnecessary expansion inside the macro.

* Fix remaining violations of clippy::use_self in generated code

* generator: Remove unnecessary match on reference type
2021-10-30 11:26:30 +02:00
Marijn Suijten e10bbf3063
Add Packed24_8 helper-type for constructing AS Instance bitfields (#476)
* ash: Exclude static `vk.rs` from the generator

Much like `platform_types.rs` `vk.rs` does not contain any generated
code that depends on `Vulkan-Headers`' `vk.xml`, making it easier to
just keep this file manually editable.

* Add Packed24_8 helper-type for constructing AS Instance bitfields
2021-10-02 12:37:52 +02:00
Marijn Suijten 19c5d453a9
Update Vulkan-Headers to 1.2.191; drop Video enum-variant edgecases (#463)
* Update Vulkan-Headers to 1.2.187; drop Video enum-variant edgecases

* Update Vulkan-Headers to 1.2.188

* generator: Improve support for pointers to static-sized arrays

Vulkan 1.2.188 removed the only occurence of `ename:`, which was our
heuristic to find a type that's a pointer to a static-sized array.  It
is now replaced with a "normal" `latexmath:` expression, but should
still be dealt with appropriately.

Note that all `latexmath:` conditions have been removed, as these fields
should not be silently omitted.  As of this Vulkan version only 3 exist,
and all have their own edge-case.

* Revert "Remove upstream-fixed vk_platform.h header path fallback"

This reverts commit 43dee26ec04dfd3871da8a11b624eaf9fbd16f3a.

Upstream is reverting back to inconsistent paths in [this commit] to
counter unintentional header `#include` changes on the C-side:
https://github.com/KhronosGroup/Vulkan-Docs/issues/1573

[this commit]: 8bde11cbd7

* generator: Remove unnecessary `-Iinclude/vulkan` directory

Every `#include` path (except `"vk_platform.h"`, see previous commit) is
relative to the `include/` directory or the current file, and does not
look for a path relative to `include/vulkan/`.

* Update Vulkan-Headers to 1.2.189

* Update Vulkan-Headers to 1.2.190

* Update Vulkan-Headers to 1.2.191
2021-09-08 11:26:58 +02:00
Marijn Suijten 9c1abcd9ca
Fix clippy lints on Rust 1.54 and beyond (#458)
Using `cargo +nightly clippy --fix --all` on `clippy 0.1.56 (4927238
2021-07-29)`.
2021-07-30 12:01:55 +02:00
Marijn Suijten c091482389
Update Vulkan-Headers to 1.2.185 (#456)
* Update Vulkan-Headers to 1.2.185

* Update Vulkan-Headers to 1.2.186
2021-07-28 13:07:53 +02:00
Marijn Suijten 2045e38e84
Update Vulkan-Headers to 1.2.184 (#454)
* generator: Fix Rust 1.53 clippy lints

* temporary: Allow bindgen nullptr dereference in layout tests

* Update Vulkan-Headers to 1.2.182

* extensions/ext: Add properties-getter for PhysicalDeviceDrmPropertiesEXT

* Update Vulkan-Headers to 1.2.183

* Remove upstream-fixed vk_platform.h header path fallback

Fixed in https://github.com/KhronosGroup/Vulkan-Docs/pull/1538

* Update Vulkan-Headers to 1.2.184
2021-07-09 11:55:20 +02:00
Marijn Suijten a75d8e7e88
Update Vulkan-Headers to 1.2.181 (#446)
* Update Vulkan-Headers to 1.2.176

* Update Vulkan-Headers to 1.2.177

* Update Vulkan-Headers to 1.2.178

This requires `len="null-terminated"` to be added to
`VkCuFunctionCreateInfoNVX::pName` in `vk.xml`.

* Update Vulkan-Headers to 1.2.179

* Update Vulkan-Headers to 1.2.181

Skipping 1.2.180 due to missing VkPipelineLayoutCreateFlagBits, which is
defined now.
2021-06-17 10:48:32 +02:00
Philippe Renon a0b9eddd0d
generator: Generate push_next function for all extended structs (#305)
* push_next and Extends traits are generated for all root structs.
root structs are now all structs that are extended by other structs!
root structs used to be all structs that don't extend any other structs.

* the root_structs local variable that is passed around is now a set of Ident (and no String).

fixes https://github.com/MaikKlein/ash/issues/229
2021-06-16 23:44:51 +02:00
Marijn Suijten 06b4f8ef35
Vulkan 1.2.175: Provisional Video Extensions (#417)
* generator: Add edegecases for broken Video extension enum variants

* Replace deprecated `make_version()` with `make_api_version()`

* generator: Use the same predicate for push_next and its traits

Some structs turn out to be root structs when their name is not in the
`root_structs` set, even when they themselves extend another struct.
This was already taken care of for `push_next` which is emitted in this
situation, but the trait referenced by `push_next`'s `T` bound is still
relying on the `extends` field to not exist in `vk.xml` at all, leading
to it not being generated despite `push_next` needing it.

Fixes: 215511f ("Implement ExtendXXX for multiple root create infos if
there are more than 1")

* Update Vulkan-Headers to 12.175

* generator: Generate low-level structs with bindgen (for vk_video)
2021-06-06 11:00:29 +02:00
Marijn Suijten b81b19a735
generator: Parse and autogenerate version-related defines (#431)
* generator: Emit deprecation warnings and documentation link for defines

* generator: Parse and autogenerate version-related defines

With more and more version-related defines showing up this saves us a
bunch of time.
2021-05-30 13:59:18 +02:00
Marijn Suijten 9d6bf63b4e
generator: Use PFN_ types for struct members instead of repeating sig (#438)
Following the fixes in #437 this actually puts those function pointer
typedefs to use, slimming down the code by a large margin at the same
time.
2021-05-24 00:39:07 +02:00
Marijn Suijten 82ca24663f
generator: Untangle mismatched parameter/return fn signatures in types (#437)
* generator: Untangle mismatched parameter/return fn signatures in types

With function typedefs for commands having some elements filtered out
(by name) if they were previously defined already, combined with
unfiltered arrays containing the parameter sets and return type for
_all_ commands expanded together in `quote!` macros the wrong array
elements get combined resulting in incorrect signatures.  No-one seems
to use function pointer types (but we should!) which is why this has
gone unnoticed for some time.

* generator: Derive clone for function pointers instead of generating it

* generator: Regroup token generation per command instead of across arrays

This complements the previous commit by avoiding mismatches in array
content altogether, instead of expanding multiple arrays within a single
`#()*` quote expression and assuming they all contain the same data in
the same order, reducing cognitive overhead while reading this code.
2021-05-24 00:13:29 +02:00
Marijn Suijten 0ae6e49195
Mark all function pointer types as unsafe (#436)
Rusty wrappers are already marked `unsafe`, and by definition the raw
Vulkan function pointers used under the hood are `unsafe` too.  Not
needing `unsafe` when going directly through `self.fp_v1_x()` is odd at
best.
2021-05-18 23:50:30 +02:00
Marijn Suijten c50c47983c
generator: Small code cleanups (#439)
* generator: Simplify contains+insert pairs to just insert()

Insert returns true when the value was inserted, false when it was
already present in the set.

* generator: Strictify "Vk"/"vk" prefix stripping with strip_prefix+unwrap

This way we are sure only the expected prefix ("Vk" or "vk") is
stripped, anything else panics the generator.

* generator: `format_ident` can format strings directly
2021-05-18 23:30:28 +02:00
Marijn Suijten 4ba8637d01
generator: pSampleMask setter should write NULL if slice is empty (#432)
As per [1] no explicit length field is available for `pSampleMask`, this
is based on `ceil(rasterizationSamples/32)` instead.  It is valid to not
set an array for `pSampleMask` (under normal circumestances this is
signaled by setting the length to zero, and the array pointer is
ignored) but this has to happen by setting the pointer to `NULL`.

[1]: https://github.com/MaikKlein/ash/issues/256
2021-05-11 21:38:09 +02:00
Marijn Suijten 95f748fc3d
generator: Use stable vk-parse 0.6 release (#434)
Following [1] a stable release including the fixed commit has been made;
we can now depend on the released crate version again.  This also
includes support for all new fields up to Vulkan 1.2.176.

[1]: https://github.com/krolli/vk-parse/issues/18#issuecomment-837815599
2021-05-11 21:36:44 +02:00
Marijn Suijten 498b8d81a2
Update Vulkan-Headers to 1.2.174 (#429)
* 1.2.171 new types

* generator: Keep platform_types checked in to git only

This static content is better kept in the platform_types.rs file only,
where it can be edited directly.

(Perhaps we should be more clear about generated versus manual files
 within the ash crate, by storing generated outputs in an auto/
 module/subdirectory that is reexported, like glib and friends?)

* Update Vulkan-Headers to 12.171

* Update Vulkan-Headers to 12.172

* Update Vulkan-Headers to 12.173

* Update Vulkan-Headers to 12.174

* generator: Generalize C number parsing

Co-authored-by: caradhras11@gmail.com <caradhras11@gmail.com>
2021-05-11 00:00:55 +02:00
Marijn Suijten bc510f017d
generator: Add support for vkFlags64 and update to 1.2.170 (#411)
* Update Vulkan-Headers to 1.2.169

* generator: Add support for vkFlags64

Since Vulkan-Headers v1.2.170 with VK_KHR_synchronization2 there are now
bitmasks/enums using 64-bits instead of the default 32. vk-parse has
been updated to convey this info though the typedefs for these
enumerations could be parsed as well.

* generator: Insert underscores before trailing type number

Enum types like `VkAccessFlags2KHR` are turned into `VK_ACCESS2` after
demangling and `SHOUTY_SNAKE_CASE` conversion by Heck, but the enum
variants for the type start with `VK_ACCESS_2` (or similar) which fails
the `strip_suffix` and leads to long names to show up.

Inserting an underscore here makes sure the match succeeds.

* Update Vulkan-Headers to 12.170
2021-05-08 12:25:10 +02:00
Marijn Suijten f27b8e069b
generator: Fortify enum-variant type prefix stripping (#426)
* generator: Add Intel to the list of vendors for enum-postfix-stripping

* generator: Fortify enum-variant type prefix stripping

As brought up in [1] a new enum variant "pattern" not dealth with by our
type-prefix stripper went silently unnoticed.  Explicitly listing the
few misnamed enum variants and panicking otherwise makes sure this won't
happen again.

[1]: https://github.com/MaikKlein/ash/pull/411#issuecomment-826013950
2021-05-01 11:04:09 +02:00
Marijn Suijten 3fe13fafa6
generator: Remove deprecated description() impl for Error (#425)
The docs clearly state:

    #[rustc_deprecated(since = "1.42.0", reason = "use the Display impl or to_string()")]
    fn description(&self) -> &str {
        "description() is deprecated; use Display"
    }

We already have a `Display` implementation containing an identical
`match` block and has further improvements on the way in [1].

[1]: https://github.com/MaikKlein/ash/pull/424
2021-04-27 18:54:29 +02:00
Theo Bogusta d4f50bd350
Improve Result's Display impl for extension values (#424)
Previously, the `Display` impl for `vk::Result` did not include handling
for extension values. For example, `VK_ERROR_OUT_OF_DATE_KHR` would
display simply as `"-1000001004"`. Now, we fall back to the `Debug` impl
of the `Result` if the value is unknown (i.e. from an extension). This
preserves the current nice messages for non-extension values, and the
numeric output for truly unknown values, but displays the enum variant
name (e.g. `"ERROR_OUT_OF_DATE"`) for extension values.
2021-04-27 16:48:15 +02:00
Marijn Suijten 6a522c878a
generator: Use lifetime borrows instead of raw pointers in pp_geometries (#420)
Fixes #301
2021-04-25 09:58:12 +02:00
Marijn Suijten 46ed5158ab
generator: Generate enums from vk_parse representation (#410)
* generator: Generate enums from vk_parse representation

This change prepares for future additions in vk_parse fields ([1]) by
converting over the enum generation path from vkxml.  Most of the
conversion is easy by repurposing the existing `EnumSpec` parsing logic
from extension constants for all enumeration variants, with slight
modifications to not bail when `extends` is not set which is specific to
extension constants.

As an (unintended) added bonus this unification of the `EnumSpec`
codepath allows aliases (for backwards-compatible names) to be generated
as discussed earlier in [2].

[1]: https://github.com/krolli/vk-parse/pull/17
[2]: https://github.com/MaikKlein/ash/pull/384#discussion_r588693967

* generator: Turn "backwards"-mentioning docs into deprecation notices

All constant aliases for misspelled items (missing `_BIT` andsoforth)
contain the text "backwards compatibility" or "Backwards-compatible
alias".

* generator: Drop aliases whose name becomes identical after de-mangling

* generator: Remove aliases from const_debugs

These already have a match against the name they're aliasing, and some
of the aliases are "deprecated" (since they're just typo fixups for
backwards compatibility).
2021-04-18 21:58:40 +02:00
Marijn Suijten 9dcfbd2bf1
generator: Use Self as return type in builder functions (#418)
Do not Repeat Yourself in `impl` blocks, especially with the extra
lifetime these are unnecessarily verbose.
2021-04-17 22:25:06 +02:00
Marijn Suijten 5bc52dcd0a
generator: Improve alias readability by using Self:: as type (#409)
All enumeration aliases already extend the base type by being placed in
its `impl` block. Use `Self::` instead of repeating the type name. DRY.
2021-03-26 20:13:16 +01:00
Marijn Suijten 8605a34273
generator: Only replace "VK_" at the start of enum variant names (#384)
* generator: Only replace "VK_" at the start of enum variant names

Replacing the occurence of "VK" is dangerous as shown by this diff; MVK
shorthands for MoltenVK are accidentally mangled. Using
strip_prefix/suffix is not only more correct and performs more runtime
checks, it is also more performant by returning a slice into the string.

* generator: Correct duplicate suffix stripping

The original `.replace(vendor, "")` operation and `.trim_end_matches`
replace every (trailing) occurence of the vendor, causing
DEBUG_REPORT_CALLBACK_EXT_EXT to end up without `_EXT` at all. This name
is also provided by vk.xml as fallback alias because it is used but
technically incorrect; the current generator can however not generate it
(limitation in vkxml representation).
2021-03-07 16:21:05 +01:00
Marijn Suijten 057fd76be1
generator: Only expect vendor name at the end of constants (#383)
Constants (enumeration bitflags) containing the word `external` were not
stripped of their common typename, and quick debugging showed the word
`VKTERNAL_...` in `struct_name`. `_EXT` would be the first extension to
match in `VK_EXTERNAL_...` messing up `struct_name` with a global
`.replace`, in turn not removing it from the variant name.
2021-03-05 20:51:11 +01:00
Marijn Suijten a053c6aecc
Remove unnecessary CString allocation when loading functions (#379)
CString::new needs to perform an allocation to own the `&'static str`
and append a NULL byte to it. We can instead perform this "allocation"
in the generator and emit a byte-string literal with trailing NULL byte
that can immediately be used by the function loader.
2021-03-01 10:05:13 +01:00
Marijn Suijten 6b4e6c8166
Update Vulkan-Headers to 1.2.168 (#363) 2021-02-28 18:54:49 +01:00