Skip to content

Commit 342b4f9

Browse files
committed
Merge #1618
1618: hal: Custom queue priorities r=kvark a=msiglreith Small feature to allow setting queue priorities on device creation. Only used for vulkan and mainly for portability. cc #1610
2 parents 0421228 + 85cdd49 commit 342b4f9

File tree

7 files changed

+22
-21
lines changed

7 files changed

+22
-21
lines changed

src/backend/dx12/src/lib.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ pub struct PhysicalDevice {
120120
}
121121

122122
impl hal::PhysicalDevice<Backend> for PhysicalDevice {
123-
fn open(self, families: Vec<(QueueFamily, usize)>) -> hal::Gpu<Backend> {
123+
fn open(self, families: Vec<(QueueFamily, Vec<hal::QueuePriority>)>) -> hal::Gpu<Backend> {
124124
use self::memory::Properties;
125125
// Create D3D12 device
126126
let mut device_raw = ptr::null_mut();
@@ -155,7 +155,7 @@ impl hal::PhysicalDevice<Backend> for PhysicalDevice {
155155

156156
let queue_groups = families
157157
.into_iter()
158-
.map(|(family, count)| {
158+
.map(|(family, priorities)| {
159159
let queue_desc = winapi::D3D12_COMMAND_QUEUE_DESC {
160160
Type: family.native_type(),
161161
Priority: 0,
@@ -164,7 +164,7 @@ impl hal::PhysicalDevice<Backend> for PhysicalDevice {
164164
};
165165
let mut group = hal::queue::RawQueueGroup::new(family);
166166

167-
for _ in 0 .. count {
167+
for _ in 0 .. priorities.len() {
168168
let mut queue = ptr::null_mut();
169169
let hr = unsafe {
170170
device.raw.CreateCommandQueue(

src/backend/empty/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ impl hal::Backend for Backend {
5151
/// Dummy physical device.
5252
pub struct PhysicalDevice;
5353
impl hal::PhysicalDevice<Backend> for PhysicalDevice {
54-
fn open(self, _: Vec<(QueueFamily, usize)>) -> hal::Gpu<Backend> {
54+
fn open(self, _: Vec<(QueueFamily, Vec<hal::QueuePriority>)>) -> hal::Gpu<Backend> {
5555
unimplemented!()
5656
}
5757
}

src/backend/gl/src/lib.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,7 @@ impl PhysicalDevice {
173173
}
174174

175175
impl hal::PhysicalDevice<Backend> for PhysicalDevice {
176-
fn open(self, families: Vec<(QueueFamily, usize)>) -> hal::Gpu<Backend> {
176+
fn open(self, families: Vec<(QueueFamily, Vec<hal::QueuePriority>)>) -> hal::Gpu<Backend> {
177177
// initialize permanent states
178178
let gl = &self.0.context;
179179
if self.0.features.srgb_color {
@@ -238,8 +238,8 @@ impl hal::PhysicalDevice<Backend> for PhysicalDevice {
238238
device: Device::new(self.0.clone()),
239239
queue_groups: families
240240
.into_iter()
241-
.map(|(proto_family, count)| {
242-
assert_eq!(count, 1);
241+
.map(|(proto_family, priorities)| {
242+
assert_eq!(priorities.len(), 1);
243243
let mut family = hal::queue::RawQueueGroup::new(proto_family);
244244
let queue = queue::CommandQueue::new(&self.0, vao);
245245
family.add_queue(queue);

src/backend/metal/src/device.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ impl PhysicalDevice {
7575

7676

7777
impl hal::PhysicalDevice<Backend> for PhysicalDevice {
78-
fn open(self, mut families: Vec<(QueueFamily, usize)>) -> hal::Gpu<Backend> {
78+
fn open(self, mut families: Vec<(QueueFamily, Vec<hal::QueuePriority>)>) -> hal::Gpu<Backend> {
7979
use self::memory::Properties;
8080

8181
assert_eq!(families.len(), 1);

src/backend/vulkan/src/lib.rs

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -305,18 +305,16 @@ pub struct PhysicalDevice {
305305
}
306306

307307
impl hal::PhysicalDevice<Backend> for PhysicalDevice {
308-
fn open(self, families: Vec<(QueueFamily, usize)>) -> hal::Gpu<Backend> {
309-
let max_queue_count = families.iter().map(|&(_, count)| count).max().unwrap_or(0);
310-
let queue_priorities = vec![0.0f32; max_queue_count];
308+
fn open(self, families: Vec<(QueueFamily, Vec<hal::QueuePriority>)>) -> hal::Gpu<Backend> {
311309
let family_infos = families
312310
.iter()
313-
.map(|&(ref family, count)| vk::DeviceQueueCreateInfo {
311+
.map(|&(ref family, ref priorities)| vk::DeviceQueueCreateInfo {
314312
s_type: vk::StructureType::DeviceQueueCreateInfo,
315313
p_next: ptr::null(),
316314
flags: vk::DeviceQueueCreateFlags::empty(),
317315
queue_family_index: family.index,
318-
queue_count: count as _,
319-
p_queue_priorities: queue_priorities.as_ptr(),
316+
queue_count: priorities.len() as _,
317+
p_queue_priorities: priorities.as_ptr(),
320318
})
321319
.collect::<Vec<_>>();
322320

@@ -393,10 +391,10 @@ impl hal::PhysicalDevice<Backend> for PhysicalDevice {
393391
let device_arc = device.raw.clone();
394392
let queue_groups = families
395393
.into_iter()
396-
.map(|(family, count)| {
394+
.map(|(family, priorities)| {
397395
let family_index = family.index;
398396
let mut family_raw = hal::queue::RawQueueGroup::new(family);
399-
for id in 0 .. count {
397+
for id in 0 .. priorities.len() {
400398
let queue_raw = unsafe {
401399
device_arc.0.get_device_queue(family_index, id as _)
402400
};

src/hal/src/adapter.rs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,10 @@
44
55
use {Backend, Gpu};
66

7+
/// Scheduling hint for devices about the priority of a queue.
8+
/// Values ranging from `0.0` (low) to `1.0` (high).
9+
pub type QueuePriority = f32;
10+
711
/// Represents a physical or virtual device, which is capable of running the backend.
812
pub trait PhysicalDevice<B: Backend>: Sized {
913
/// Create a new logical GPU.
@@ -18,10 +22,10 @@ pub trait PhysicalDevice<B: Backend>: Sized {
1822
///
1923
/// # let physical_device: empty::PhysicalDevice = return;
2024
/// # let family: empty::QueueFamily = return;
21-
/// let gpu = physical_device.open(vec![(family, 1)]);
25+
/// let gpu = physical_device.open(vec![(family, vec![1.0; 1])]);
2226
/// # }
2327
/// ```
24-
fn open(self, Vec<(B::QueueFamily, usize)>) -> Gpu<B>;
28+
fn open(self, Vec<(B::QueueFamily, Vec<QueuePriority>)>) -> Gpu<B>;
2529
}
2630

2731
/// Information about a backend adapter.
@@ -38,7 +42,6 @@ pub struct AdapterInfo {
3842
pub software_rendering: bool,
3943
}
4044

41-
///
4245
/// The list of `Adapter` instances is obtained by calling `Instance::enumerate_adapters()`.
4346
pub struct Adapter<B: Backend> {
4447
/// General information about this adapter.
@@ -78,7 +81,7 @@ impl<B: Backend> Adapter<B> {
7881
selector(&family)
7982
.map(|count| {
8083
assert!(count != 0 && count <= family.max_queues());
81-
(family, count)
84+
(family, vec![1.0; count])
8285
})
8386
})
8487
.collect();

src/hal/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ use std::error::Error;
2121
use std::fmt::{self, Debug};
2222
use std::hash::Hash;
2323

24-
pub use self::adapter::{Adapter, AdapterInfo, PhysicalDevice};
24+
pub use self::adapter::{Adapter, AdapterInfo, PhysicalDevice, QueuePriority};
2525
pub use self::device::Device;
2626
pub use self::pool::CommandPool;
2727
pub use self::pso::{DescriptorPool};

0 commit comments

Comments
 (0)