mirror of
https://github.com/gfx-rs/wgpu.git
synced 2026-04-22 03:02:01 -04:00
Merge #148
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:
@@ -36,6 +36,7 @@ rev = "b51053dc2dc3bbe9b2ba050fde42eeb6405fe092"
|
||||
|
||||
[dependencies]
|
||||
arrayvec = "0.5"
|
||||
smallvec = "1"
|
||||
raw-window-handle = "0.3"
|
||||
|
||||
[dev-dependencies]
|
||||
|
||||
@@ -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,
|
||||
},
|
||||
|
||||
@@ -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,
|
||||
},
|
||||
|
||||
@@ -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,
|
||||
},
|
||||
|
||||
@@ -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,
|
||||
},
|
||||
|
||||
13
src/lib.rs
13
src/lib.rs
@@ -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(),
|
||||
);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user