mirror of
https://github.com/eliasstepanik/imgui-rs.git
synced 2026-01-23 19:38:27 +00:00
imgui-glium-renderer: stop reusing vertex/index buffers
For some reason, index buffer recycling leads in some cases to 100% CPU usage due to some OpenGL synchronization stuff I don't fully understand.
This commit is contained in:
parent
411a7c7514
commit
cddef5ee34
@ -129,10 +129,12 @@ impl Renderer {
|
|||||||
|
|
||||||
let (fb_width, fb_height) = fb_size;
|
let (fb_width, fb_height) = fb_size;
|
||||||
|
|
||||||
self.device_objects
|
let vtx_buffer = VertexBuffer::immutable(&self.ctx, draw_list.vtx_buffer)?;
|
||||||
.upload_vertex_buffer(&self.ctx, draw_list.vtx_buffer)?;
|
let idx_buffer = IndexBuffer::immutable(
|
||||||
self.device_objects
|
&self.ctx,
|
||||||
.upload_index_buffer(&self.ctx, draw_list.idx_buffer)?;
|
PrimitiveType::TrianglesList,
|
||||||
|
draw_list.idx_buffer,
|
||||||
|
)?;
|
||||||
|
|
||||||
let mut idx_start = 0;
|
let mut idx_start = 0;
|
||||||
for cmd in draw_list.cmd_buffer {
|
for cmd in draw_list.cmd_buffer {
|
||||||
@ -146,10 +148,8 @@ impl Renderer {
|
|||||||
let idx_end = idx_start + cmd.elem_count as usize;
|
let idx_end = idx_start + cmd.elem_count as usize;
|
||||||
|
|
||||||
surface.draw(
|
surface.draw(
|
||||||
&self.device_objects.vertex_buffer,
|
&vtx_buffer,
|
||||||
&self
|
&idx_buffer
|
||||||
.device_objects
|
|
||||||
.index_buffer
|
|
||||||
.slice(idx_start..idx_end)
|
.slice(idx_start..idx_end)
|
||||||
.expect("Invalid index buffer range"),
|
.expect("Invalid index buffer range"),
|
||||||
&self.device_objects.program,
|
&self.device_objects.program,
|
||||||
@ -183,8 +183,6 @@ impl Renderer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub struct DeviceObjects {
|
pub struct DeviceObjects {
|
||||||
vertex_buffer: VertexBuffer<ImDrawVert>,
|
|
||||||
index_buffer: IndexBuffer<ImDrawIdx>,
|
|
||||||
program: Program,
|
program: Program,
|
||||||
textures: Textures<Texture2d>,
|
textures: Textures<Texture2d>,
|
||||||
}
|
}
|
||||||
@ -226,9 +224,6 @@ impl DeviceObjects {
|
|||||||
pub fn init<F: Facade>(im_gui: &mut ImGui, ctx: &F) -> RendererResult<DeviceObjects> {
|
pub fn init<F: Facade>(im_gui: &mut ImGui, ctx: &F) -> RendererResult<DeviceObjects> {
|
||||||
use glium::texture::{ClientFormat, RawImage2d};
|
use glium::texture::{ClientFormat, RawImage2d};
|
||||||
|
|
||||||
let vertex_buffer = VertexBuffer::empty_dynamic(ctx, 0)?;
|
|
||||||
let index_buffer = IndexBuffer::empty_dynamic(ctx, PrimitiveType::TrianglesList, 0)?;
|
|
||||||
|
|
||||||
let program = compile_default_program(ctx)?;
|
let program = compile_default_program(ctx)?;
|
||||||
let texture = im_gui.prepare_texture(|handle| {
|
let texture = im_gui.prepare_texture(|handle| {
|
||||||
let data = RawImage2d {
|
let data = RawImage2d {
|
||||||
@ -243,44 +238,8 @@ impl DeviceObjects {
|
|||||||
im_gui.set_font_texture_id(textures.insert(texture));
|
im_gui.set_font_texture_id(textures.insert(texture));
|
||||||
|
|
||||||
Ok(DeviceObjects {
|
Ok(DeviceObjects {
|
||||||
vertex_buffer: vertex_buffer,
|
|
||||||
index_buffer: index_buffer,
|
|
||||||
program: program,
|
program: program,
|
||||||
textures: textures,
|
textures: textures,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
pub fn upload_vertex_buffer<F: Facade>(
|
|
||||||
&mut self,
|
|
||||||
ctx: &F,
|
|
||||||
vtx_buffer: &[ImDrawVert],
|
|
||||||
) -> RendererResult<()> {
|
|
||||||
self.vertex_buffer.invalidate();
|
|
||||||
if let Some(slice) = self.vertex_buffer.slice_mut(0..vtx_buffer.len()) {
|
|
||||||
slice.write(vtx_buffer);
|
|
||||||
return Ok(());
|
|
||||||
}
|
|
||||||
self.vertex_buffer = VertexBuffer::dynamic(ctx, vtx_buffer)?;
|
|
||||||
let _ = ctx.get_context().insert_debug_marker(&format!(
|
|
||||||
"imgui-rs: resized vertex buffer to {} bytes",
|
|
||||||
self.vertex_buffer.get_size()
|
|
||||||
));
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
pub fn upload_index_buffer<F: Facade>(
|
|
||||||
&mut self,
|
|
||||||
ctx: &F,
|
|
||||||
idx_buffer: &[ImDrawIdx],
|
|
||||||
) -> RendererResult<()> {
|
|
||||||
self.index_buffer.invalidate();
|
|
||||||
if let Some(slice) = self.index_buffer.slice_mut(0..idx_buffer.len()) {
|
|
||||||
slice.write(idx_buffer);
|
|
||||||
return Ok(());
|
|
||||||
}
|
|
||||||
self.index_buffer = IndexBuffer::dynamic(ctx, PrimitiveType::TrianglesList, idx_buffer)?;
|
|
||||||
let _ = ctx.get_context().insert_debug_marker(&format!(
|
|
||||||
"imgui-rs: resized index buffer to {} bytes",
|
|
||||||
self.index_buffer.get_size()
|
|
||||||
));
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user