diff options
Diffstat (limited to 'stockton-render/src/draw/texture/repo.rs')
-rw-r--r-- | stockton-render/src/draw/texture/repo.rs | 35 |
1 files changed, 25 insertions, 10 deletions
diff --git a/stockton-render/src/draw/texture/repo.rs b/stockton-render/src/draw/texture/repo.rs index bb68479..2316dc4 100644 --- a/stockton-render/src/draw/texture/repo.rs +++ b/stockton-render/src/draw/texture/repo.rs @@ -20,12 +20,14 @@ use std::{ thread::JoinHandle, }; +use anyhow::{Context, Result}; use hal::{ prelude::*, pso::{DescriptorSetLayoutBinding, DescriptorType, ShaderStageFlags}, Features, }; use log::debug; +use thiserror::Error; /// The number of textures in one 'block' /// The textures of the loaded file are divided into blocks of this size. @@ -33,7 +35,7 @@ use log::debug; pub const BLOCK_SIZE: usize = 8; pub struct TextureRepo<'a> { - joiner: ManuallyDrop<JoinHandle<Result<TextureLoaderRemains, &'static str>>>, + joiner: ManuallyDrop<JoinHandle<Result<TextureLoaderRemains>>>, ds_layout: Arc<RwLock<DescriptorSetLayout>>, req_send: Sender<LoaderRequest>, resp_recv: Receiver<TexturesBlock<DynamicBlock>>, @@ -42,6 +44,15 @@ pub struct TextureRepo<'a> { _a: PhantomData<&'a ()>, } +#[derive(Error, Debug)] +pub enum TextureRepoError { + #[error("No suitable queue family")] + NoQueueFamilies, + + #[error("Lock poisoned")] + LockPoisoned, +} + impl<'a> TextureRepo<'a> { pub fn new< T: 'static + HasTextures + Send + Sync, @@ -52,7 +63,7 @@ impl<'a> TextureRepo<'a> { adapter: &Adapter, texs_lock: Arc<RwLock<T>>, resolver: R, - ) -> Result<Self, &'static str> { + ) -> Result<Self> { let (req_send, req_recv) = channel(); let (resp_send, resp_recv) = channel(); let family = adapter @@ -62,15 +73,18 @@ impl<'a> TextureRepo<'a> { family.queue_type().supports_transfer() && family.max_queues() >= NUM_SIMULTANEOUS_CMDS }) - .unwrap(); + .ok_or(TextureRepoError::NoQueueFamilies)?; + let gpu = unsafe { adapter .physical_device - .open(&[(family, &[1.0])], Features::empty()) - .unwrap() + .open(&[(family, &[1.0])], Features::empty())? }; - let device = device_lock.write().unwrap(); + let device = device_lock + .write() + .map_err(|_| TextureRepoError::LockPoisoned) + .context("Error getting device lock")?; let ds_lock = Arc::new(RwLock::new( unsafe { @@ -94,7 +108,8 @@ impl<'a> TextureRepo<'a> { &[], ) } - .map_err(|_| "Couldn't create descriptor set layout")?, + .map_err::<HalErrorWrapper, _>(|e| e.into()) + .context("Error creating descriptor set layout")?, )); drop(device); @@ -129,7 +144,7 @@ impl<'a> TextureRepo<'a> { self.ds_layout.read().unwrap() } - pub fn queue_load(&mut self, block_id: BlockRef) -> Result<(), &'static str> { + pub fn queue_load(&mut self, block_id: BlockRef) -> Result<()> { if self.blocks.contains_key(&block_id) { return Ok(()); } @@ -137,10 +152,10 @@ impl<'a> TextureRepo<'a> { self.force_queue_load(block_id) } - pub fn force_queue_load(&mut self, block_id: BlockRef) -> Result<(), &'static str> { + pub fn force_queue_load(&mut self, block_id: BlockRef) -> Result<()> { self.req_send .send(LoaderRequest::Load(block_id)) - .map_err(|_| "Couldn't send load request")?; + .context("Error queuing texture block load")?; self.blocks.insert(block_id, None); |