1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
use crate::{
glfw_window::GlfwWindow,
graphics::{vulkan, vulkan::Instance},
};
use anyhow::{Context, Result};
use ash::vk;
use std::sync::Arc;
impl vulkan::WindowSurface for GlfwWindow {
fn clone_vulkan_instance(&self) -> Arc<Instance> {
self.instance.clone()
}
fn framebuffer_size(&self) -> (u32, u32) {
let (iwidth, iheight) = self.window.get_framebuffer_size();
(iwidth as u32, iheight as u32)
}
unsafe fn get_surface_handle(&self) -> vk::SurfaceKHR {
self.surface
}
unsafe fn get_physical_device_surface_support(
&self,
physical_device: &vk::PhysicalDevice,
queue_family_index: u32,
) -> Result<bool> {
self.surface_loader
.get_physical_device_surface_support(
*physical_device,
queue_family_index,
self.surface,
)
.context("unable to check for queue family support!")
}
unsafe fn supported_formats(
&self,
physical_device: &vk::PhysicalDevice,
) -> Vec<vk::SurfaceFormatKHR> {
self.surface_loader
.get_physical_device_surface_formats(*physical_device, self.surface)
.unwrap_or_else(|_| vec![])
}
unsafe fn supported_presentation_modes(
&self,
physical_device: &vk::PhysicalDevice,
) -> Vec<vk::PresentModeKHR> {
self.surface_loader
.get_physical_device_surface_present_modes(
*physical_device,
self.surface,
)
.unwrap_or_else(|_| vec![])
}
unsafe fn surface_capabilities(
&self,
physical_device: &vk::PhysicalDevice,
) -> Result<vk::SurfaceCapabilitiesKHR> {
self.surface_loader
.get_physical_device_surface_capabilities(
*physical_device,
self.surface,
)
.context("unable to get surface capabiliities for this device")
}
}