From 719a1a33178a5c9989c08f8220bb227a67e14111 Mon Sep 17 00:00:00 2001 From: Joonas Javanainen Date: Sat, 17 Jun 2017 12:58:58 +0300 Subject: [PATCH] Wrap gfx renderer errors --- imgui-examples/examples/hello_gfx.rs | 3 +- imgui-gfx-renderer/src/lib.rs | 42 +++++++++++++++++----------- 2 files changed, 28 insertions(+), 17 deletions(-) diff --git a/imgui-examples/examples/hello_gfx.rs b/imgui-examples/examples/hello_gfx.rs index b38535d..09d768a 100644 --- a/imgui-examples/examples/hello_gfx.rs +++ b/imgui-examples/examples/hello_gfx.rs @@ -28,7 +28,8 @@ pub fn main() { let (window, mut device, mut factory, mut main_color, mut main_depth) = gfx_window_glutin::init::(builder); let mut encoder: gfx::Encoder<_, _> = factory.create_command_buffer().into(); - let mut renderer = Renderer::init(&mut support.imgui, &mut factory, main_color.clone()); + let mut renderer = Renderer::init(&mut support.imgui, &mut factory, main_color.clone()) + .expect("Failed to initialize renderer"); 'main: loop { for event in window.poll_events() { diff --git a/imgui-gfx-renderer/src/lib.rs b/imgui-gfx-renderer/src/lib.rs index b8d750e..f97d490 100644 --- a/imgui-gfx-renderer/src/lib.rs +++ b/imgui-gfx-renderer/src/lib.rs @@ -12,12 +12,27 @@ pub type RendererResult = Result; #[derive(Clone, Debug)] pub enum RendererError { Update(gfx::UpdateError), + Buffer(gfx::buffer::CreationError), + Pipeline(gfx::PipelineStateError), + Combined(gfx::CombinedError) } impl From> for RendererError { fn from(e: gfx::UpdateError) -> RendererError { RendererError::Update(e) } } +impl From for RendererError { + fn from(e: gfx::buffer::CreationError) -> RendererError { RendererError::Buffer(e) } +} + +impl From> for RendererError { + fn from(e: gfx::PipelineStateError) -> RendererError { RendererError::Pipeline(e) } +} + +impl From for RendererError { + fn from(e: gfx::CombinedError) -> RendererError { RendererError::Combined(e) } +} + gfx_defines!{ pipeline pipe { vertex_buffer: gfx::VertexBuffer = (), @@ -37,24 +52,21 @@ impl Renderer { pub fn init>(imgui: &mut ImGui, factory: &mut F, out: RenderTargetView) - -> Renderer { + -> RendererResult> { let pso = factory.create_pipeline_simple(include_bytes!("shader/vert_110.glsl"), include_bytes!("shader/frag_110.glsl"), - pipe::new()) - .expect("Failed to setup PSO"); + pipe::new())?; let vertex_buffer = factory.create_buffer::(256, gfx::buffer::Role::Vertex, gfx::memory::Usage::Dynamic, - Bind::empty()) - .expect("Failed to create vertex buffer"); + Bind::empty())?; let index_buffer = factory.create_buffer::(256, gfx::buffer::Role::Index, gfx::memory::Usage::Dynamic, - Bind::empty()) - .expect("Failed to create index buffer"); + Bind::empty())?; let (_, texture) = imgui.prepare_texture(|handle| { factory.create_texture_immutable_u8::(gfx::texture::Kind::D2(handle.width as u16, handle.height as u16, gfx::texture::AaMode::Single), &[handle.pixels]) - }).expect("Failed to create texture"); + })?; // TODO: set texture id in imgui let sampler = factory.create_sampler_linear(); let data = pipe::Data { @@ -79,10 +91,10 @@ impl Renderer { instances: None, buffer: index_buffer.clone().into_index_buffer(factory), }; - Renderer { + Ok(Renderer { bundle: Bundle::new(slice, pso, data), index_buffer: index_buffer, - } + }) } pub fn render<'a, F: Factory, C: CommandBuffer>(&mut self, ui: Ui<'a>, @@ -137,10 +149,9 @@ impl Renderer { self.bundle.data.vertex_buffer = factory.create_buffer::(vtx_buffer.len(), gfx::buffer::Role::Vertex, gfx::memory::Usage::Dynamic, - Bind::empty()) - .expect("Failed to create vertex buffer"); + Bind::empty())?; } - Ok(try!(encoder.update_buffer(&self.bundle.data.vertex_buffer, vtx_buffer, 0))) + Ok(encoder.update_buffer(&self.bundle.data.vertex_buffer, vtx_buffer, 0)?) } fn upload_index_buffer, C: CommandBuffer>(&mut self, factory: &mut F, @@ -151,10 +162,9 @@ impl Renderer { self.index_buffer = factory.create_buffer::(idx_buffer.len(), gfx::buffer::Role::Index, gfx::memory::Usage::Dynamic, - Bind::empty()) - .expect("Failed to create index buffer"); + Bind::empty())?; self.bundle.slice.buffer = self.index_buffer.clone().into_index_buffer(factory); } - Ok(try!(encoder.update_buffer(&self.index_buffer, idx_buffer, 0))) + Ok(encoder.update_buffer(&self.index_buffer, idx_buffer, 0)?) } }