* 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)
* 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.
* 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.
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.
* 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
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
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
* 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>
* 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
* 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
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
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.
* 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).
* 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).
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.
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.
`c_void` is not the same as Rust's void type, `()`, making function
pointers like `PFN_vkFreeFunction` pretty much impossible to implement
without casting. Instead of just turning this into `-> ()`, remove the
return type altogether, and add some asserts to prevent types of this
kind from being accidentally generated.
In rust references to DSTs (Dynamically Sized Types) like slices and
trait objects are 16-bytes instead of 8 (leaking into the next parameter
of a function call). The static-sized array generated here has its size
known beforehand and will not suffer from this issue [1], but might be
confusing for future readers/authors: convert it to a raw pointer just
to be safe.
[1]: https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=88acb9736455f7262ecf4af2077f3a59
* Update Vulkan-Headers subproject to 1.2.162 (ray tracing)
* Generate against vk.xml 1.2.162
* generator: Shim IDirectFB and IDirectFBSurface to c_void
* generator: Edgecase for name-clash in p_geometries and pp_geometries
* extensions: Migrate acceleration structure to separate extension
* extensions: Migrate RT safe wrapper functions to ray_tracing_pipeline
* Add high level wrapper for currently-empty RayQuery extension
* vk: definition: Turn host/device AS handle into type safe union
Co-authored-by: Marijn Suijten <marijn@traverseresearch.nl>
Co-authored-by: Darius Bouma <darius1@live.nl>
* Fix clippy::manual_strip
* Fix clippy::comparison_to_empty
* Fix clippy::needless_lifetimes
* generator: Drop unnecessary edgecase for charptr array in builder
* generator: Make array type handling more linear
* prelude: Provide Result -> VkResult<()> conversion
* Add #[must_use] to Result type
* Fix all unchecked vk::Result cases
* generator: Fix typos
* generator: Assert char ptrs have `"null-terminated"` len attribute
* prelude: Provide result_with_success helper for Result -> VKresult
* Cleanup match{success} blocks with SSR
{let $p = $f; match $q { vk::Result::SUCCESS => Ok($r), _ => Err($z), }} ==>> {$f.result_with_success($r)}
* Simplify matching on Result::SUCCESS
Using the following regex replacement:
let err_code =\s*(.*\((\n|[^;])*?\));\s*match err_code \{\s*vk::Result::SUCCESS => Ok\((.*)\),\s*_ => Err\(err_code\),\s*\}
$1.result_with_success($3)
* Simplify intermediate error return
let err_code =\s*(.*\((\n|[^;])*?\));\s*if err_code != vk::Result::SUCCESS \{\s*return Err\(err_code\);\s*\}
$1.result()?;
* Simplify error checking with .result()? and .result_with_success()
* generator: Ignore empty basetype in typedef (forward declaration)
ANativeWindow and AHardwareBuffer were [recently changed] to the
basetype category, but without an actual basetype, consequently failing
the Ident constructor with an empty name.
Since these types are already dealt with in platform_types, and there
doesn't seem to be anything sensical to define them to right now, just
ignore these cases.
[recently changed]: 0c5351f5e9 (diff-0ff049f722e55de41ee15b2c91ef380fL179-R180)
* Suggestion: Allocate data in get_ray_tracing_shader_group_handles
* generator: Update nom to 6.0
* generator: Generalize C expression conversion to TokenStream
* generator: Simplify ReferenceType::to_tokens with quote!
* generator: Refactor to not parse our own stringified token stream
* generator: Deal with pointers to static-sized arrays
* generator: Apply static-sized array pointer to size containing `*`
* generator: setter: Interpret all references as ptr, not just p_/pp_
* generator: quote::* is already imported
* generator: Replace manual fn to_tokens with quote::ToTokens trait impl
* generator: Return str reference from constant_name
* generator: Replace unused to_type_tokens with name_to_tokens
The reference argument was always None; replace it with a direct call to
name_to_tokens.
* generator: setters: Use safe mutable references instead of raw ptrs
This avoids an obnoxious error when attemting to use `dbg!()` while
debugging the generator.
Unfortunately there seems to be no way to import * except `dbg`, or
shadow `dbg` (using eg. `use nom::{dbg as _nom_dbg, *};`).
* Allow the generator to be run from project root dir
* Split vk.rs into multiple files
* Breakup and remove generated vk/prelude.rs
Generator changes:
- No longer convert current dir to a string when checking if the
path ends with 'generator'
- Pass the 'ash/src' dir instead of the 'vk.rs' path
Generated and generated output changes:
- The majority of prelude.rs has been moved to macros.rs
- The pointer chain and Handle are now included in vk.rs
- Platform types has been moved to its own file.
* Fix incorrect generation of commands with aliases
* Use alias name instead of the actual cmd name
* Generate vulkan ray-tracing bindings
* Add ray-tracing khr
* High level ray tracing support
* Re-enable nv ray tracing extension (this will break the build)
* Generate aliases for extension enums
* Add missing alias because the parser doesn't provide alias information here
* Fix 'unreachable pattern' warnings
* Fix clippy warning
Co-authored-by: Maik Klein <maikklein@googlemail.com>
* Updated vk-parse and Vulkan-Headers to Vulkan 1.2
* First pass at generating vk.rs
* Support double
* Generate from EnumSpec::Value
* Remove println
* Fix mutable pointer bug
* cargo fmt
* Update document link
* Remove mention of Vulkan 1.2 support for now
* Add clippy::wrong_self_convention
Adds equality-related traits to VkClearRect, VkOffset2D, VkOffset3D,
VkRect2D and VkSurfaceFormatKHR. Fixes a typo preventing said traits
from being applied to VkExtent2D.
* Fix literals in vk.rs
* Address all the other clippy lints in ash
* Module level clippy lint
* More lints
* Make hashmaps generic for clippy
* Remove unused macro import