Skip to content

Commit 2f7e7af

Browse files
authored
Allow choosing the Vulkan max API version when creating Instance (#1585)
* Allow choosing the Vulkan max API version when creating Instance * Rewrite feature handling, include all Vulkan 1.1 and 1.2 features * Fixes * Move features.rs to device module * More small fixes * Changelog
1 parent d36e5a2 commit 2f7e7af

39 files changed

+1192
-816
lines changed

Diff for: CHANGELOG_VK_SYS.md

+2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
# Unreleased
22

3+
- Added structs for Vulkan 1.1 and 1.2 features, with `Default` implementations.
4+
35
# Version 0.6.1 (2021-04-10)
46

57
- Add `MEMORY_HEAP_MULTI_INSTANCE_BIT` for `MemoryHeap`.

Diff for: CHANGELOG_VULKANO.md

+4-1
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,16 @@
1717
- Now that `PipelineLayout` has no more type parameter, the trait `PipelineLayoutAbstract` is removed. The layout type parameter is also removed from `ComputePipeline` and `GraphicsPipeline`.
1818
- `ComputeEntryPoint` and `GraphicsEntryPoint` now take a value specifying the push constants descriptor, instead of having a type parameter. The corresponding associated type on `EntryPointAbstract` has been removed.
1919
- The `GraphicsEntryPointAbstract` trait has been removed. `GraphicsPipelineBuilder` now takes a `GraphicsEntryPoint` object directly, and has lifetime parameters for the 5 shader types instead. `EntryPointDummy` is no longer needed and has been removed.
20+
- **Breaking** The constructors of `Instance` now take an additional argument to specify the maximum API version.
2021
- Added `DeviceExtensions::khr_spirv_1_4`, which allows SPIR-V 1.4 shaders in Vulkan 1.1.
2122
- Added `FunctionPointers::api_version` to query the highest supported instance version.
22-
- Added `Instance::api_version` and `Device::api_version` to return the actual supported Vulkan version. These may differ between instance and device, and be lower than what `FunctionPointers::api_version` and `PhysicalDevice::api_version` return (currently never higher than 1.1, but this may change in the future).
23+
- Added `Instance::api_version` and `Device::api_version` to return the actual supported Vulkan version. These may differ between instance and device, and be lower than what `FunctionPointers::api_version` and `PhysicalDevice::api_version` return.
24+
- Added `Instance::max_api_version`, which returns the maximum version that was specified when creating the instance.
2325
- Fixed the issue when creating a buffer with exportable fd on Linux(see to #1545).
2426
- The `draw_indirect` and `draw_indexed_indirect` commands on `AutoCommandBufferBuilder` now check the draw count against the `max_draw_indirect_count` limit.
2527
- Fixed a few documentation errors.
2628
- It is now possible to construct a graphics pipeline without a fragment shader.
29+
- Added support for all core Vulkan 1.1 and 1.2 device features.
2730

2831
# Version 0.23.0 (2021-04-10)
2932

Diff for: examples/src/bin/basic-compute-shader.rs

+8-1
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ use vulkano::pipeline::ComputePipeline;
2323
use vulkano::pipeline::ComputePipelineAbstract;
2424
use vulkano::sync;
2525
use vulkano::sync::GpuFuture;
26+
use vulkano::Version;
2627

2728
const DEVICE_EXTENSIONS: DeviceExtensions = DeviceExtensions {
2829
khr_storage_buffer_storage_class: true,
@@ -36,7 +37,13 @@ const BUFFER_USAGE: BufferUsage = BufferUsage {
3637

3738
fn main() {
3839
// As with other examples, the first step is to create an instance.
39-
let instance = Instance::new(None, &InstanceExtensions::none(), None).unwrap();
40+
let instance = Instance::new(
41+
None,
42+
Version::major_minor(1, 1),
43+
&InstanceExtensions::none(),
44+
None,
45+
)
46+
.unwrap();
4047

4148
// Choose which physical device to use.
4249
let physical = PhysicalDevice::enumerate(&instance).next().unwrap();

Diff for: examples/src/bin/buffer-pool.rs

+3-1
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ use vulkano::swapchain;
3636
use vulkano::swapchain::{AcquireError, Swapchain, SwapchainCreationError};
3737
use vulkano::sync;
3838
use vulkano::sync::{FlushError, GpuFuture};
39+
use vulkano::Version;
3940
use vulkano_win::VkSurfaceBuild;
4041
use winit::event::{Event, WindowEvent};
4142
use winit::event_loop::{ControlFlow, EventLoop};
@@ -49,7 +50,8 @@ vulkano::impl_vertex!(Vertex, position);
4950

5051
fn main() {
5152
let required_extensions = vulkano_win::required_extensions();
52-
let instance = Instance::new(None, &required_extensions, None).unwrap();
53+
let instance =
54+
Instance::new(None, Version::major_minor(1, 1), &required_extensions, None).unwrap();
5355
let physical = PhysicalDevice::enumerate(&instance).next().unwrap();
5456

5557
println!(

Diff for: examples/src/bin/debug.rs

+3-2
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ use vulkano::image::MipmapsCount;
1515
use vulkano::instance;
1616
use vulkano::instance::debug::{DebugCallback, MessageSeverity, MessageType};
1717
use vulkano::instance::{Instance, InstanceExtensions, PhysicalDevice};
18+
use vulkano::Version;
1819

1920
fn main() {
2021
// Vulkano Debugging Example Code
@@ -55,8 +56,8 @@ fn main() {
5556
let layers = vec!["VK_LAYER_KHRONOS_validation"];
5657

5758
// Important: pass the extension(s) and layer(s) when creating the vulkano instance
58-
let instance =
59-
Instance::new(None, &extensions, layers).expect("failed to create Vulkan instance");
59+
let instance = Instance::new(None, Version::major_minor(1, 1), &extensions, layers)
60+
.expect("failed to create Vulkan instance");
6061

6162
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
6263
// After creating the instance we must register the debugging callback. //

Diff for: examples/src/bin/deferred/main.rs

+8-9
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,11 @@
2525
// expensive otherwise. It has some drawbacks, which are the fact that transparent objects must be
2626
// drawn after the lighting, and that the whole process consumes more memory.
2727

28+
use crate::frame::*;
29+
use crate::triangle_draw_system::*;
30+
use cgmath::Matrix4;
31+
use cgmath::SquareMatrix;
32+
use cgmath::Vector3;
2833
use vulkano::device::{Device, DeviceExtensions};
2934
use vulkano::image::view::ImageView;
3035
use vulkano::image::ImageUsage;
@@ -33,27 +38,21 @@ use vulkano::swapchain;
3338
use vulkano::swapchain::{AcquireError, Swapchain, SwapchainCreationError};
3439
use vulkano::sync;
3540
use vulkano::sync::{FlushError, GpuFuture};
36-
41+
use vulkano::Version;
3742
use vulkano_win::VkSurfaceBuild;
3843
use winit::event::{Event, WindowEvent};
3944
use winit::event_loop::{ControlFlow, EventLoop};
4045
use winit::window::WindowBuilder;
4146

42-
use cgmath::Matrix4;
43-
use cgmath::SquareMatrix;
44-
use cgmath::Vector3;
45-
4647
mod frame;
4748
mod triangle_draw_system;
4849

49-
use crate::frame::*;
50-
use crate::triangle_draw_system::*;
51-
5250
fn main() {
5351
// Basic initialization. See the triangle example if you want more details about this.
5452

5553
let required_extensions = vulkano_win::required_extensions();
56-
let instance = Instance::new(None, &required_extensions, None).unwrap();
54+
let instance =
55+
Instance::new(None, Version::major_minor(1, 1), &required_extensions, None).unwrap();
5756
let physical = PhysicalDevice::enumerate(&instance).next().unwrap();
5857

5958
let event_loop = EventLoop::new();

Diff for: examples/src/bin/dynamic-buffers.rs

+8-1
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,16 @@ use vulkano::pipeline::ComputePipeline;
2727
use vulkano::pipeline::ComputePipelineAbstract;
2828
use vulkano::sync;
2929
use vulkano::sync::GpuFuture;
30+
use vulkano::Version;
3031

3132
fn main() {
32-
let instance = Instance::new(None, &InstanceExtensions::none(), None).unwrap();
33+
let instance = Instance::new(
34+
None,
35+
Version::major_minor(1, 1),
36+
&InstanceExtensions::none(),
37+
None,
38+
)
39+
.unwrap();
3340

3441
let physical = PhysicalDevice::enumerate(&instance).next().unwrap();
3542
let queue_family = physical

Diff for: examples/src/bin/dynamic-local-size.rs

+2
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,12 @@ use vulkano::pipeline::ComputePipeline;
2929
use vulkano::pipeline::ComputePipelineAbstract;
3030
use vulkano::sync;
3131
use vulkano::sync::GpuFuture;
32+
use vulkano::Version;
3233

3334
fn main() {
3435
let instance = Instance::new(
3536
None,
37+
Version::major_minor(1, 1),
3638
&InstanceExtensions {
3739
// This extension is required to obtain physical device metadata
3840
// about the device workgroup size limits

Diff for: examples/src/bin/image/main.rs

+6-5
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@
77
// notice may not be copied, modified, or distributed except
88
// according to those terms.
99

10+
use png;
11+
use std::io::Cursor;
12+
use std::sync::Arc;
1013
use vulkano::buffer::{BufferUsage, CpuAccessibleBuffer};
1114
use vulkano::command_buffer::{
1215
AutoCommandBufferBuilder, CommandBufferUsage, DynamicState, SubpassContents,
@@ -27,10 +30,7 @@ use vulkano::swapchain;
2730
use vulkano::swapchain::{AcquireError, Swapchain, SwapchainCreationError};
2831
use vulkano::sync;
2932
use vulkano::sync::{FlushError, GpuFuture};
30-
31-
use png;
32-
use std::io::Cursor;
33-
use std::sync::Arc;
33+
use vulkano::Version;
3434
use vulkano_win::VkSurfaceBuild;
3535
use winit::event::{Event, WindowEvent};
3636
use winit::event_loop::{ControlFlow, EventLoop};
@@ -41,7 +41,8 @@ fn main() {
4141
// `triangle` example if you haven't done so yet.
4242

4343
let required_extensions = vulkano_win::required_extensions();
44-
let instance = Instance::new(None, &required_extensions, None).unwrap();
44+
let instance =
45+
Instance::new(None, Version::major_minor(1, 1), &required_extensions, None).unwrap();
4546
let physical = PhysicalDevice::enumerate(&instance).next().unwrap();
4647
println!(
4748
"Using device: {} (type: {:?})",

Diff for: examples/src/bin/immutable-buffer-initialization.rs

+8-1
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,19 @@ use vulkano::pipeline::ComputePipeline;
1919
use vulkano::pipeline::ComputePipelineAbstract;
2020
use vulkano::sync;
2121
use vulkano::sync::GpuFuture;
22+
use vulkano::Version;
2223

2324
fn main() {
2425
// The most part of this example is exactly the same as `basic-compute-shader`. You should read the
2526
// `basic-compute-shader` example if you haven't done so yet.
2627

27-
let instance = Instance::new(None, &InstanceExtensions::none(), None).unwrap();
28+
let instance = Instance::new(
29+
None,
30+
Version::major_minor(1, 1),
31+
&InstanceExtensions::none(),
32+
None,
33+
)
34+
.unwrap();
2835
let physical = PhysicalDevice::enumerate(&instance).next().unwrap();
2936

3037
let queue_family = physical

Diff for: examples/src/bin/indirect.rs

+3-1
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ use vulkano::swapchain;
4949
use vulkano::swapchain::{AcquireError, Swapchain, SwapchainCreationError};
5050
use vulkano::sync;
5151
use vulkano::sync::{FlushError, GpuFuture};
52+
use vulkano::Version;
5253
use vulkano_win::VkSurfaceBuild;
5354
use winit::event::{Event, WindowEvent};
5455
use winit::event_loop::{ControlFlow, EventLoop};
@@ -64,7 +65,8 @@ impl_vertex!(Vertex, position);
6465

6566
fn main() {
6667
let required_extensions = vulkano_win::required_extensions();
67-
let instance = Instance::new(None, &required_extensions, None).unwrap();
68+
let instance =
69+
Instance::new(None, Version::major_minor(1, 1), &required_extensions, None).unwrap();
6870
let physical = PhysicalDevice::enumerate(&instance).next().unwrap();
6971
println!(
7072
"Using device: {} (type: {:?})",

Diff for: examples/src/bin/instancing.rs

+4-3
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ extern crate vulkano_shaders;
1818
extern crate vulkano_win;
1919
extern crate winit;
2020

21+
use std::sync::Arc;
2122
use vulkano::buffer::{BufferUsage, CpuAccessibleBuffer};
2223
use vulkano::command_buffer::{
2324
AutoCommandBufferBuilder, CommandBufferUsage, DynamicState, SubpassContents,
@@ -34,13 +35,12 @@ use vulkano::swapchain;
3435
use vulkano::swapchain::{AcquireError, Swapchain, SwapchainCreationError};
3536
use vulkano::sync;
3637
use vulkano::sync::{FlushError, GpuFuture};
38+
use vulkano::Version;
3739
use vulkano_win::VkSurfaceBuild;
3840
use winit::event::{Event, WindowEvent};
3941
use winit::event_loop::{ControlFlow, EventLoop};
4042
use winit::window::{Window, WindowBuilder};
4143

42-
use std::sync::Arc;
43-
4444
// # Vertex Types
4545
//
4646
// Seeing as we are going to use the `OneVertexOneInstanceDefinition` vertex definition for our
@@ -63,7 +63,8 @@ impl_vertex!(InstanceData, position_offset, scale);
6363

6464
fn main() {
6565
let required_extensions = vulkano_win::required_extensions();
66-
let instance = Instance::new(None, &required_extensions, None).unwrap();
66+
let instance =
67+
Instance::new(None, Version::major_minor(1, 1), &required_extensions, None).unwrap();
6768

6869
let physical = PhysicalDevice::enumerate(&instance).next().unwrap();
6970
println!(

Diff for: examples/src/bin/msaa-renderpass.rs

+3-1
Original file line numberDiff line numberDiff line change
@@ -83,11 +83,13 @@ use vulkano::pipeline::viewport::Viewport;
8383
use vulkano::pipeline::GraphicsPipeline;
8484
use vulkano::render_pass::{Framebuffer, Subpass};
8585
use vulkano::sync::GpuFuture;
86+
use vulkano::Version;
8687

8788
fn main() {
8889
// The usual Vulkan initialization.
8990
let required_extensions = vulkano_win::required_extensions();
90-
let instance = Instance::new(None, &required_extensions, None).unwrap();
91+
let instance =
92+
Instance::new(None, Version::major_minor(1, 1), &required_extensions, None).unwrap();
9193
let physical = PhysicalDevice::enumerate(&instance).next().unwrap();
9294
let queue_family = physical
9395
.queue_families()

Diff for: examples/src/bin/multi-window.rs

+3-1
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ use vulkano::swapchain::Surface;
3434
use vulkano::swapchain::{AcquireError, Swapchain, SwapchainCreationError};
3535
use vulkano::sync;
3636
use vulkano::sync::{FlushError, GpuFuture};
37+
use vulkano::Version;
3738
use vulkano_win::VkSurfaceBuild;
3839
use winit::event::ElementState;
3940
use winit::event::KeyboardInput;
@@ -52,7 +53,8 @@ struct WindowSurface {
5253

5354
fn main() {
5455
let required_extensions = vulkano_win::required_extensions();
55-
let instance = Instance::new(None, &required_extensions, None).unwrap();
56+
let instance =
57+
Instance::new(None, Version::major_minor(1, 1), &required_extensions, None).unwrap();
5658
let event_loop = EventLoop::new();
5759

5860
// A hashmap that contains all of our created windows and their resources

Diff for: examples/src/bin/occlusion-query.rs

+3-1
Original file line numberDiff line numberDiff line change
@@ -28,14 +28,16 @@ use vulkano::swapchain;
2828
use vulkano::swapchain::{AcquireError, Swapchain, SwapchainCreationError};
2929
use vulkano::sync;
3030
use vulkano::sync::{FlushError, GpuFuture};
31+
use vulkano::Version;
3132
use vulkano_win::VkSurfaceBuild;
3233
use winit::event::{Event, WindowEvent};
3334
use winit::event_loop::{ControlFlow, EventLoop};
3435
use winit::window::{Window, WindowBuilder};
3536

3637
fn main() {
3738
let required_extensions = vulkano_win::required_extensions();
38-
let instance = Instance::new(None, &required_extensions, None).unwrap();
39+
let instance =
40+
Instance::new(None, Version::major_minor(1, 1), &required_extensions, None).unwrap();
3941
let physical = PhysicalDevice::enumerate(&instance).next().unwrap();
4042

4143
println!(

Diff for: examples/src/bin/pipeline-caching.rs

+8-2
Original file line numberDiff line numberDiff line change
@@ -32,15 +32,21 @@ use std::fs::File;
3232
use std::io::Read;
3333
use std::io::Write;
3434
use std::sync::Arc;
35-
3635
use vulkano::device::{Device, DeviceExtensions};
3736
use vulkano::instance::{Instance, InstanceExtensions, PhysicalDevice};
3837
use vulkano::pipeline::cache::PipelineCache;
3938
use vulkano::pipeline::ComputePipeline;
39+
use vulkano::Version;
4040

4141
fn main() {
4242
// As with other examples, the first step is to create an instance.
43-
let instance = Instance::new(None, &InstanceExtensions::none(), None).unwrap();
43+
let instance = Instance::new(
44+
None,
45+
Version::major_minor(1, 1),
46+
&InstanceExtensions::none(),
47+
None,
48+
)
49+
.unwrap();
4450

4551
// Choose which physical device to use.
4652
let physical = PhysicalDevice::enumerate(&instance).next().unwrap();

Diff for: examples/src/bin/push-constants.rs

+8-1
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,16 @@ use vulkano::instance::{Instance, InstanceExtensions, PhysicalDevice};
1818
use vulkano::pipeline::{ComputePipeline, ComputePipelineAbstract};
1919
use vulkano::sync;
2020
use vulkano::sync::GpuFuture;
21+
use vulkano::Version;
2122

2223
fn main() {
23-
let instance = Instance::new(None, &InstanceExtensions::none(), None).unwrap();
24+
let instance = Instance::new(
25+
None,
26+
Version::major_minor(1, 1),
27+
&InstanceExtensions::none(),
28+
None,
29+
)
30+
.unwrap();
2431
let physical = PhysicalDevice::enumerate(&instance).next().unwrap();
2532
let queue_family = physical
2633
.queue_families()

Diff for: examples/src/bin/runtime-shader/main.rs

+3-1
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ use vulkano::swapchain;
4949
use vulkano::swapchain::{AcquireError, Swapchain, SwapchainCreationError};
5050
use vulkano::sync;
5151
use vulkano::sync::{FlushError, GpuFuture};
52+
use vulkano::Version;
5253
use vulkano_win::VkSurfaceBuild;
5354
use winit::event::{Event, WindowEvent};
5455
use winit::event_loop::{ControlFlow, EventLoop};
@@ -64,7 +65,8 @@ vulkano::impl_vertex!(Vertex, position, color);
6465

6566
fn main() {
6667
let required_extensions = vulkano_win::required_extensions();
67-
let instance = Instance::new(None, &required_extensions, None).unwrap();
68+
let instance =
69+
Instance::new(None, Version::major_minor(1, 1), &required_extensions, None).unwrap();
6870
let physical = vk::instance::PhysicalDevice::enumerate(&instance)
6971
.next()
7072
.unwrap();

Diff for: examples/src/bin/shader-include/main.rs

+8-1
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,16 @@ use vulkano::instance::{Instance, InstanceExtensions, PhysicalDevice};
2020
use vulkano::pipeline::{ComputePipeline, ComputePipelineAbstract};
2121
use vulkano::sync;
2222
use vulkano::sync::GpuFuture;
23+
use vulkano::Version;
2324

2425
fn main() {
25-
let instance = Instance::new(None, &InstanceExtensions::none(), None).unwrap();
26+
let instance = Instance::new(
27+
None,
28+
Version::major_minor(1, 1),
29+
&InstanceExtensions::none(),
30+
None,
31+
)
32+
.unwrap();
2633
let physical = PhysicalDevice::enumerate(&instance).next().unwrap();
2734
let queue_family = physical
2835
.queue_families()

0 commit comments

Comments
 (0)