56 lines
1.6 KiB
Rust
56 lines
1.6 KiB
Rust
// Copyright 2020 Sergiusz 'q3k' Bazanski <q3k@q3k.org>
|
|
//
|
|
// This file is part of Abrasion.
|
|
//
|
|
// Abrasion is free software: you can redistribute it and/or modify it under
|
|
// the terms of the GNU General Public License as published by the Free
|
|
// Software Foundation, version 3.
|
|
//
|
|
// Abrasion is distributed in the hope that it will be useful, but WITHOUT ANY
|
|
// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
|
// FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
|
|
// details.
|
|
//
|
|
// You should have received a copy of the GNU General Public License along with
|
|
// Abrasion. If not, see <https://www.gnu.org/licenses/>.
|
|
|
|
use std::sync::Arc;
|
|
|
|
use vulkano::instance as vi;
|
|
use vulkano::swapchain as vs;
|
|
|
|
pub struct QueueFamilyIndices {
|
|
pub graphics_family: i32,
|
|
pub present_family: i32,
|
|
}
|
|
|
|
impl QueueFamilyIndices {
|
|
fn new() -> Self {
|
|
Self {
|
|
graphics_family: -1,
|
|
present_family: -1,
|
|
}
|
|
}
|
|
|
|
fn is_complete(&self) -> bool {
|
|
self.graphics_family >= 0 && self.present_family >= 0
|
|
}
|
|
|
|
|
|
pub fn find<WT>(surface: &Arc<vs::Surface<WT>>, device: &vi::PhysicalDevice) -> Option<Self> {
|
|
let mut indices = QueueFamilyIndices::new();
|
|
for (i, queue_family) in device.queue_families().enumerate() {
|
|
if queue_family.supports_graphics() {
|
|
indices.graphics_family = i as i32
|
|
}
|
|
if surface.is_supported(queue_family).unwrap() {
|
|
indices.present_family = i as i32
|
|
}
|
|
if indices.is_complete() {
|
|
return Some(indices);
|
|
}
|
|
}
|
|
None
|
|
}
|
|
}
|