Skip to content

Commit

Permalink
Fix WGPU Rendering Bug When Using Paint Callbacks
Browse files Browse the repository at this point in the history
Depending on the order custom paint callbacks were rendered, some of the
egui meshes would previously not be rendered at all in a seemingly random
fashion.
  • Loading branch information
zicklag committed Jun 2, 2022
1 parent 2d009c5 commit 6927448
Showing 1 changed file with 18 additions and 18 deletions.
36 changes: 18 additions & 18 deletions egui-wgpu/src/renderer.rs
Original file line number Diff line number Diff line change
Expand Up @@ -339,19 +339,13 @@ impl RenderPass {
// run.
let mut needs_reset = true;

for (
(
egui::ClippedPrimitive {
clip_rect,
primitive,
},
vertex_buffer,
),
index_buffer,
) in paint_jobs
.iter()
.zip(&self.vertex_buffers)
.zip(&self.index_buffers)
let mut index_buffers = self.index_buffers.iter();
let mut vertex_buffers = self.vertex_buffers.iter();

for egui::ClippedPrimitive {
clip_rect,
primitive,
} in paint_jobs
{
if needs_reset {
rpass.set_viewport(
Expand Down Expand Up @@ -384,6 +378,9 @@ impl RenderPass {
match primitive {
Primitive::Mesh(mesh) => {
if let Some((_texture, bind_group)) = self.textures.get(&mesh.texture_id) {
let index_buffer = index_buffers.next().unwrap();
let vertex_buffer = vertex_buffers.next().unwrap();

rpass.set_bind_group(1, bind_group, &[]);
rpass.set_index_buffer(
index_buffer.buffer.slice(..),
Expand Down Expand Up @@ -681,12 +678,13 @@ impl RenderPass {
}]),
);

for (i, egui::ClippedPrimitive { primitive, .. }) in paint_jobs.iter().enumerate() {
let mut mesh_idx = 0;
for egui::ClippedPrimitive { primitive, .. } in paint_jobs.iter() {
match primitive {
Primitive::Mesh(mesh) => {
let data: &[u8] = bytemuck::cast_slice(&mesh.indices);
if i < self.index_buffers.len() {
self.update_buffer(device, queue, &BufferType::Index, i, data);
if mesh_idx < self.index_buffers.len() {
self.update_buffer(device, queue, &BufferType::Index, mesh_idx, data);
} else {
let buffer = device.create_buffer_init(&wgpu::util::BufferInitDescriptor {
label: Some("egui_index_buffer"),
Expand All @@ -700,8 +698,8 @@ impl RenderPass {
}

let data: &[u8] = bytemuck::cast_slice(&mesh.vertices);
if i < self.vertex_buffers.len() {
self.update_buffer(device, queue, &BufferType::Vertex, i, data);
if mesh_idx < self.vertex_buffers.len() {
self.update_buffer(device, queue, &BufferType::Vertex, mesh_idx, data);
} else {
let buffer = device.create_buffer_init(&wgpu::util::BufferInitDescriptor {
label: Some("egui_vertex_buffer"),
Expand All @@ -714,6 +712,8 @@ impl RenderPass {
size: data.len(),
});
}

mesh_idx += 1;
}
Primitive::Callback(callback) => {
let cbfn = if let Some(c) = callback.callback.downcast_ref::<CallbackFn>() {
Expand Down

0 comments on commit 6927448

Please sign in to comment.