Commit graph

1025 commits

Author SHA1 Message Date
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 f781777931 examples: Use slice::from_ref to not loose lifetime on nested slices
As per the readme `.build()` should only be called as late as possible,
and only if absolutely necessary; such cases include slices that are
passed directly to functions.  More precisely, such build calls and the
creation of temporary slices should happen inside the same expression as
the function call to be sound and completely lifetime-checked.

This pattern of `&[my_builder.build()]` is however not possible when
constructing intermediary Vulkan objects that reference the slice.  In
the first place this slice goes out of scope after the expression that
creates the Vulkan object, which is caught and disallowed by rustc
(unless this expression itself ends in `.build()`, which is completely
 unsound as it makes rustc unable to validate this lifetime dependency).

In the second place - and as is most relevant for this patch that
removes `.build()` calls that were not surrounded by temporary slice
constructors - said expression drops the lifetime checks on anything
held by `my_builder` which _could_ go out of scope before the newly
constructed Vulkan object is used, resulting yet again in Undefined
Behaviour.

Fortunately, for slices of size 1 which are typical in Vulkan,
`std::slice::as_ref` exists which is analogous to taking a pointer to an
object and considering it an array of length 1 in C(++).  This maintains
the lifetime through `Deref` and makes rustc able to fully check all
lifetimes and prevent unsound code.

Albeit improving overall consistency, the `&[my_builder.build()]`
pattern is not substituted in aforementioned Vulkan function-call
expressions as that is considered "extraneous" [1] and demonstrates the
various ways to safely construct Vulkan objects for the observant reader.

[1]: https://github.com/MaikKlein/ash/pull/506#discussion_r762630648
2021-12-19 16:17:56 -08:00
Steve Wooster ea65db4bea
Simplify triangle example's vertex input state (#512)
Co-authored-by: Steve Wooster <s.f.m.wooster@gmail.com>
2021-12-19 12:28:34 +01: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
Philippe Renon 289a57e330
extensions: make naming and layout consistent across all extensions (#494)
* extensions: Make naming and layout consistent across all extensions

breaking change:
- some extensions were exposing `instance()` instead of `device()`

includes:
- renaming function pointer member to `fns`
- moving `name()`, `fp(`), `device()`/`instance()` functions at end of file
- adding missing `device()`/`instance()` functions

see https://github.com/MaikKlein/ash/pull/493

* debug_marker: Remove unneeded `device` from `debug_marker_set_object_name()`

* extensions: Remove unneeded `instance` and `device` struct members and functions

* extensions: renamed all `fns` fields to `fp` to match `pub fn fp()` getter
2021-12-11 13:19:34 +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 af7733900c maintenance4: Fix documented output parameter now named out
This naming was changed at the last resort across the other `_len()`
variant calls to be consistent, but the maintenance4 PR didn't have its
documentation updated (probably some rust-analyzer "rename symbol"
action).

Fixes: 50d58fd ("extensions: Add VK_KHR_maintenance4")
2021-11-19 11:50:31 -08:00
Marijn Suijten f628ef1646 debug_utils: Remove unneeded instance from submit_debug_utils_message 2021-11-19 11:07:54 -08:00
Marijn Suijten 0b343b71a6 Use device in pipeline_executable_properties and timeline_semaphore
Of all the extensions calling get_instance_proc_addr only these two
remain that should use the "optimized" device-specific function
pointers, since all functions take the device as argument (a child of
the device such as a command buffer or queue is also possible, but not
applicable here) and may otherwise have to go through a dispatch
function [1].

Only VK_EXT_debug_utils remains where all but three of the functions are
device (or device-child) specific.  This however requires the
autogenerated loader to be separated out into two stages (and debug
utils are generally initialized before creating a logical device),
making it worth to accept the dispatch function unless this extension
struct is split, too.

[1]: https://www.khronos.org/registry/vulkan/specs/1.2-extensions/man/html/vkGetDeviceProcAddr.html
2021-11-19 11:07:54 -08:00
Philippe Renon 9e14786b83
extensions: Add VK_KHR_present_wait (#493) 2021-11-19 10:39:06 +01:00
Philippe Renon 2f51478d54 remove From<vk::Result> for VkResult
this is a breaking change

see https://github.com/MaikKlein/ash/pull/493
2021-11-16 10:19:59 -08:00
Umbreon 675f91e9cd
Fix broken vulkan-tutorial link in README.md (#492) 2021-11-11 22:41:52 +01:00
Marijn Suijten 50d58fd04e extensions: Add VK_KHR_maintenance4 2021-11-11 13:26:46 -08:00
Marijn Suijten e120dd7838
Link _len() functions to their array-getter using intradoc-links (#490)
Point the user in the right direction telling them where to get the
length of the mutable slice that has to passed in, and document that
these have to be default-initialized (so that `s_type` is set
appropriately) and `p_next` can optionally be set too.
2021-11-11 19:51:12 +01:00
Marijn Suijten 6640ecb200 instance: Make enumerate_physical_device_groups unsafe
All Vulkan functions are marked `unsafe` and
`enumerate_physical_device_groups` should not be an exception to that.
2021-11-11 10:35:09 -08: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 6857f7b4d3
extensions/khr: Add VK_KHR_dynamic_rendering wrapper (#488) 2021-11-09 22:49:41 +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 527b542c69
ash: Regenerate negative constants with syn 1.0.81 (#486)
`syn` has been updated to not remove the `_` again from negative
numbers, which previously disappeared in the 1.0 upgrade in 43b5058
("Upgrade proc_macro2/syn/quote to v1.0 (#351)").

See also https://github.com/dtolnay/syn/releases/tag/1.0.81:

    Support arbitrary precision negative literal tokens on rustc 1.56+
2021-10-30 11:52:23 +02: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
Benjamin Saunders aa7b429f4f
Support linking Vulkan directly (#457)
* Mark EntryCustom::new_custom as unsafe

Passing a badly-behaved `load` function can invoke undefined behavior.

* Document required feature for Entry

* Support linking Vulkan directly

This is the preferred pattern in most environments when an application
cannot function without Vulkan, as it saves the libloading dependency,
eliminates an error case, and makes the Vulkan dependency visible to
the OS.

* Rename libloading feature to "loaded"

* Link by default

* Guide users towards linking the loader directly

* Remove unnecessary error type

InstanceError::LoadError was never constructed.

* Unify entry types

Simplifies the interface and allows a bunch of code to become
monomorphic.
2021-09-09 22:50:34 +02:00
Marijn Suijten 1b4c82e1d6 Release ash 0.33.3 with Vulkan-Headers 1.2.191 2021-09-08 11:31:45 +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
Kane Rogers 56bbf839a4
Bump version in README.md (#473) 2021-09-03 10:15:16 +02:00
Marijn Suijten 7ad19290d8 Release ash 0.33.2 with repeated reads if Vulkan returns VK_INCOMPLETE 2021-08-26 21:54:56 +02:00
Marijn Suijten 00abdfc17d tooling_info: Initialize sType/pNext in get_physical_device_tool_properties
The type and next-pointer of output structures must always be
initialized.

Fixes: ac4d046 ("Added `VK_EXT_tooling_info` extension support (#310)")
2021-08-24 17:16:19 -07:00
Marijn Suijten 6fa57a4269 ash: Repeatedly call enumeration functions when INCOMPLETE is returned 2021-08-24 17:16:19 -07:00
Marijn Suijten c6842949de Release ash 0.33.1 with read_spv UB fix 2021-08-23 12:46:38 +02:00
Marijn Suijten 2c98b6f384
util: Zero-initialize result to prevent possible uninit memory read (#470)
Fixes https://github.com/MaikKlein/ash/issues/354

`io::Read::read_exact` does not receive `MaybeUninit` memory and a trait
implementation can possibly read from our uninitialized vector without
`unsafe`, which is UB.  As there is no proper solution to this problem
yet (see linked issue), our safest bet is to just take the perf-hit and
zero-initialize this vector.
2021-08-23 12:44:17 +02:00
Marijn Suijten 17149bd791
Update changelog and prepare for ash-0.33 and ash-window-0.7 release (#460)
* changelog: Add all entries for 0.33

* Prepare for ash-0.33 and ash-window-0.7 release
2021-07-30 15:22:29 +02:00
Marijn Suijten de8ff6b5dc
Unify readme between Ash and Ash-window (#455) 2021-07-30 12:32:52 +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 8a1e4a3eba
ash/extensions: Fix missing and broken autolinks to Vulkan docs (#459) 2021-07-30 12:01:18 +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
Jason Macnak ed351996e5
Adds LICENSE-* files to crate subdirectories (#452)
... so that the license files appear in downloaded crates.
2021-07-09 12:21:15 +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 d6e049f340 Use intradoc-links and explain the various loading methods 2021-06-07 09:54:11 -07: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