mirror of
https://github.com/eliasstepanik/imgui-rs.git
synced 2026-01-27 21:38:34 +00:00
Wrap gfx renderer errors
This commit is contained in:
parent
7cdac30bba
commit
719a1a3317
@ -28,7 +28,8 @@ pub fn main() {
|
|||||||
let (window, mut device, mut factory, mut main_color, mut main_depth) =
|
let (window, mut device, mut factory, mut main_color, mut main_depth) =
|
||||||
gfx_window_glutin::init::<ColorFormat, DepthFormat>(builder);
|
gfx_window_glutin::init::<ColorFormat, DepthFormat>(builder);
|
||||||
let mut encoder: gfx::Encoder<_, _> = factory.create_command_buffer().into();
|
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 {
|
'main: loop {
|
||||||
for event in window.poll_events() {
|
for event in window.poll_events() {
|
||||||
|
|||||||
@ -12,12 +12,27 @@ pub type RendererResult<T> = Result<T, RendererError>;
|
|||||||
#[derive(Clone, Debug)]
|
#[derive(Clone, Debug)]
|
||||||
pub enum RendererError {
|
pub enum RendererError {
|
||||||
Update(gfx::UpdateError<usize>),
|
Update(gfx::UpdateError<usize>),
|
||||||
|
Buffer(gfx::buffer::CreationError),
|
||||||
|
Pipeline(gfx::PipelineStateError<String>),
|
||||||
|
Combined(gfx::CombinedError)
|
||||||
}
|
}
|
||||||
|
|
||||||
impl From<gfx::UpdateError<usize>> for RendererError {
|
impl From<gfx::UpdateError<usize>> for RendererError {
|
||||||
fn from(e: gfx::UpdateError<usize>) -> RendererError { RendererError::Update(e) }
|
fn from(e: gfx::UpdateError<usize>) -> RendererError { RendererError::Update(e) }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl From<gfx::buffer::CreationError> for RendererError {
|
||||||
|
fn from(e: gfx::buffer::CreationError) -> RendererError { RendererError::Buffer(e) }
|
||||||
|
}
|
||||||
|
|
||||||
|
impl From<gfx::PipelineStateError<String>> for RendererError {
|
||||||
|
fn from(e: gfx::PipelineStateError<String>) -> RendererError { RendererError::Pipeline(e) }
|
||||||
|
}
|
||||||
|
|
||||||
|
impl From<gfx::CombinedError> for RendererError {
|
||||||
|
fn from(e: gfx::CombinedError) -> RendererError { RendererError::Combined(e) }
|
||||||
|
}
|
||||||
|
|
||||||
gfx_defines!{
|
gfx_defines!{
|
||||||
pipeline pipe {
|
pipeline pipe {
|
||||||
vertex_buffer: gfx::VertexBuffer<ImDrawVert> = (),
|
vertex_buffer: gfx::VertexBuffer<ImDrawVert> = (),
|
||||||
@ -37,24 +52,21 @@ impl<R: Resources> Renderer<R> {
|
|||||||
pub fn init<F: Factory<R>>(imgui: &mut ImGui,
|
pub fn init<F: Factory<R>>(imgui: &mut ImGui,
|
||||||
factory: &mut F,
|
factory: &mut F,
|
||||||
out: RenderTargetView<R, gfx::format::Rgba8>)
|
out: RenderTargetView<R, gfx::format::Rgba8>)
|
||||||
-> Renderer<R> {
|
-> RendererResult<Renderer<R>> {
|
||||||
let pso = factory.create_pipeline_simple(include_bytes!("shader/vert_110.glsl"),
|
let pso = factory.create_pipeline_simple(include_bytes!("shader/vert_110.glsl"),
|
||||||
include_bytes!("shader/frag_110.glsl"),
|
include_bytes!("shader/frag_110.glsl"),
|
||||||
pipe::new())
|
pipe::new())?;
|
||||||
.expect("Failed to setup PSO");
|
|
||||||
let vertex_buffer = factory.create_buffer::<ImDrawVert>(256,
|
let vertex_buffer = factory.create_buffer::<ImDrawVert>(256,
|
||||||
gfx::buffer::Role::Vertex,
|
gfx::buffer::Role::Vertex,
|
||||||
gfx::memory::Usage::Dynamic,
|
gfx::memory::Usage::Dynamic,
|
||||||
Bind::empty())
|
Bind::empty())?;
|
||||||
.expect("Failed to create vertex buffer");
|
|
||||||
let index_buffer = factory.create_buffer::<ImDrawIdx>(256,
|
let index_buffer = factory.create_buffer::<ImDrawIdx>(256,
|
||||||
gfx::buffer::Role::Index,
|
gfx::buffer::Role::Index,
|
||||||
gfx::memory::Usage::Dynamic,
|
gfx::memory::Usage::Dynamic,
|
||||||
Bind::empty())
|
Bind::empty())?;
|
||||||
.expect("Failed to create index buffer");
|
|
||||||
let (_, texture) = imgui.prepare_texture(|handle| {
|
let (_, texture) = imgui.prepare_texture(|handle| {
|
||||||
factory.create_texture_immutable_u8::<gfx::format::Rgba8>(gfx::texture::Kind::D2(handle.width as u16, handle.height as u16, gfx::texture::AaMode::Single), &[handle.pixels])
|
factory.create_texture_immutable_u8::<gfx::format::Rgba8>(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
|
// TODO: set texture id in imgui
|
||||||
let sampler = factory.create_sampler_linear();
|
let sampler = factory.create_sampler_linear();
|
||||||
let data = pipe::Data {
|
let data = pipe::Data {
|
||||||
@ -79,10 +91,10 @@ impl<R: Resources> Renderer<R> {
|
|||||||
instances: None,
|
instances: None,
|
||||||
buffer: index_buffer.clone().into_index_buffer(factory),
|
buffer: index_buffer.clone().into_index_buffer(factory),
|
||||||
};
|
};
|
||||||
Renderer {
|
Ok(Renderer {
|
||||||
bundle: Bundle::new(slice, pso, data),
|
bundle: Bundle::new(slice, pso, data),
|
||||||
index_buffer: index_buffer,
|
index_buffer: index_buffer,
|
||||||
}
|
})
|
||||||
}
|
}
|
||||||
pub fn render<'a, F: Factory<R>, C: CommandBuffer<R>>(&mut self,
|
pub fn render<'a, F: Factory<R>, C: CommandBuffer<R>>(&mut self,
|
||||||
ui: Ui<'a>,
|
ui: Ui<'a>,
|
||||||
@ -137,10 +149,9 @@ impl<R: Resources> Renderer<R> {
|
|||||||
self.bundle.data.vertex_buffer = factory.create_buffer::<ImDrawVert>(vtx_buffer.len(),
|
self.bundle.data.vertex_buffer = factory.create_buffer::<ImDrawVert>(vtx_buffer.len(),
|
||||||
gfx::buffer::Role::Vertex,
|
gfx::buffer::Role::Vertex,
|
||||||
gfx::memory::Usage::Dynamic,
|
gfx::memory::Usage::Dynamic,
|
||||||
Bind::empty())
|
Bind::empty())?;
|
||||||
.expect("Failed to create vertex buffer");
|
|
||||||
}
|
}
|
||||||
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<F: Factory<R>, C: CommandBuffer<R>>(&mut self,
|
fn upload_index_buffer<F: Factory<R>, C: CommandBuffer<R>>(&mut self,
|
||||||
factory: &mut F,
|
factory: &mut F,
|
||||||
@ -151,10 +162,9 @@ impl<R: Resources> Renderer<R> {
|
|||||||
self.index_buffer = factory.create_buffer::<ImDrawIdx>(idx_buffer.len(),
|
self.index_buffer = factory.create_buffer::<ImDrawIdx>(idx_buffer.len(),
|
||||||
gfx::buffer::Role::Index,
|
gfx::buffer::Role::Index,
|
||||||
gfx::memory::Usage::Dynamic,
|
gfx::memory::Usage::Dynamic,
|
||||||
Bind::empty())
|
Bind::empty())?;
|
||||||
.expect("Failed to create index buffer");
|
|
||||||
self.bundle.slice.buffer = self.index_buffer.clone().into_index_buffer(factory);
|
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)?)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user