device/queue: query information for all buffers
We will need to offset of each individual buffer in order to expose MMAP
buffers to userspace, so perform a `querybuf` on each buffer.
diff --git a/src/device/queue.rs b/src/device/queue.rs
index a63e24a..06aae24 100644
--- a/src/device/queue.rs
+++ b/src/device/queue.rs
@@ -210,7 +210,10 @@
ioctl::reqbufs(&mut self.inner, type_, M::HandleType::MEMORY_TYPE, count)?;
// The buffers have been allocated, now let's get their features.
- let querybuf: ioctl::QueryBuffer = ioctl::querybuf(&self.inner, self.inner.type_, 0)?;
+ let mut buffer_features = Vec::new();
+ for i in 0..num_buffers {
+ buffer_features.push(ioctl::querybuf(&self.inner, self.inner.type_, i)?);
+ }
Ok(Queue {
inner: self.inner,
@@ -219,7 +222,7 @@
num_buffers,
num_queued_buffers: Default::default(),
buffers_state: Arc::new(Mutex::new(BuffersManager::new(num_buffers))),
- buffer_features: querybuf,
+ buffer_features,
},
})
}
@@ -351,7 +354,13 @@
_ => return Err(Error::AlreadyBorrowed),
};
- let num_planes = self.state.buffer_features.planes.len();
+ let num_planes = self
+ .state
+ .buffer_features
+ .get(index)
+ .expect("Inconsistent queue state")
+ .planes
+ .len();
// The buffer will remain in PreQueue state until it is queued
// or the reference to it is lost.
@@ -381,7 +390,13 @@
_ => panic!("Inconsistent buffer state: buffer not free"),
}
- let num_planes = self.state.buffer_features.planes.len();
+ let num_planes = self
+ .state
+ .buffer_features
+ .get(index)
+ .expect("Inconsistent buffer state")
+ .planes
+ .len();
// The buffer remains will remain in PreQueue state until it is queued
// or the reference to it is lost.
diff --git a/src/device/queue/states.rs b/src/device/queue/states.rs
index c8d50a7..9c43493 100644
--- a/src/device/queue/states.rs
+++ b/src/device/queue/states.rs
@@ -84,6 +84,6 @@
pub(super) num_buffers: usize,
pub(super) num_queued_buffers: Cell<usize>,
pub(super) buffers_state: Arc<Mutex<BuffersManager<M>>>,
- pub(super) buffer_features: ioctl::QueryBuffer,
+ pub(super) buffer_features: Vec<ioctl::QueryBuffer>,
}
impl<M: Memory> QueueState for BuffersAllocated<M> {}