148: Change Queue::submit to take &self r=kvark a=LaylConway

This small change allows multiple threads to submit buffers slightly more efficiently, by being able to do it concurrently without a lock on Queue.

In practice currently `Queue::submit` does a lot of locking internally for most of the function's duration, so it's only a small performance win right now, but it opens up the road for more improvements.

Co-authored-by: Layl <2385329-layl@users.noreply.gitlab.com>
This commit is contained in:
bors[bot]
2019-12-31 16:32:52 +00:00
committed by GitHub
6 changed files with 11 additions and 11 deletions

View File

@@ -36,6 +36,7 @@ rev = "b51053dc2dc3bbe9b2ba050fde42eeb6405fe092"
[dependencies]
arrayvec = "0.5"
smallvec = "1"
raw-window-handle = "0.3"
[dev-dependencies]

View File

@@ -15,7 +15,7 @@ async fn run() {
)
.unwrap();
let (device, mut queue) = adapter.request_device(&wgpu::DeviceDescriptor {
let (device, queue) = adapter.request_device(&wgpu::DeviceDescriptor {
extensions: wgpu::Extensions {
anisotropic_filtering: false,
},

View File

@@ -102,7 +102,7 @@ pub fn run<E: Example>(title: &str) {
)
.unwrap();
let (device, mut queue) = adapter.request_device(&wgpu::DeviceDescriptor {
let (device, queue) = adapter.request_device(&wgpu::DeviceDescriptor {
extensions: wgpu::Extensions {
anisotropic_filtering: false,
},

View File

@@ -24,7 +24,7 @@ async fn run() {
)
.unwrap();
let (device, mut queue) = adapter.request_device(&wgpu::DeviceDescriptor {
let (device, queue) = adapter.request_device(&wgpu::DeviceDescriptor {
extensions: wgpu::Extensions {
anisotropic_filtering: false,
},

View File

@@ -44,7 +44,7 @@ fn main() {
)
.unwrap();
let (device, mut queue) = adapter.request_device(&wgpu::DeviceDescriptor {
let (device, queue) = adapter.request_device(&wgpu::DeviceDescriptor {
extensions: wgpu::Extensions {
anisotropic_filtering: false,
},

View File

@@ -5,6 +5,7 @@ use future::GpuFutureCompletion;
pub use future::GpuFuture;
use arrayvec::ArrayVec;
use smallvec::SmallVec;
use std::ffi::CString;
use std::ops::Range;
@@ -261,7 +262,6 @@ pub struct ComputePass<'a> {
#[derive(Debug)]
pub struct Queue {
id: wgc::id::QueueId,
temp_command_buffers: Vec<wgc::id::CommandBufferId>,
}
/// A resource that can be bound to a pipeline.
@@ -569,7 +569,6 @@ impl Adapter {
};
let queue = Queue {
id: wgn::wgpu_device_get_queue(device.id),
temp_command_buffers: Vec::new(),
};
(device, queue)
}
@@ -1382,14 +1381,14 @@ impl<'a> Drop for ComputePass<'a> {
impl Queue {
/// Submits a series of finished command buffers for execution.
pub fn submit(&mut self, command_buffers: &[CommandBuffer]) {
self.temp_command_buffers.clear();
self.temp_command_buffers
.extend(command_buffers.iter().map(|cb| cb.id));
pub fn submit(&self, command_buffers: &[CommandBuffer]) {
let temp_command_buffers = command_buffers.iter()
.map(|cb| cb.id)
.collect::<SmallVec<[_; 4]>>();
wgn::wgpu_queue_submit(
self.id,
self.temp_command_buffers.as_ptr(),
temp_command_buffers.as_ptr(),
command_buffers.len(),
);
}