Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

WGPU PaintCallback Fixes #1704

Merged
merged 3 commits into from
Jun 2, 2022
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
48 changes: 30 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();
emilk marked this conversation as resolved.
Show resolved Hide resolved

rpass.set_bind_group(1, bind_group, &[]);
rpass.set_index_buffer(
index_buffer.buffer.slice(..),
Expand Down Expand Up @@ -568,6 +565,18 @@ impl RenderPass {
self.textures.remove(id);
}

/// Get the WGPU texture and bind group associated to a texture that has been allocated by egui.
///
/// This could be used by custom paint hooks to render images that have been added through with
/// [`egui_extras::RetainedImage`](https://docs.rs/egui_extras/latest/egui_extras/image/struct.RetainedImage.html)
/// or [`egui::Context::load_texture`].
pub fn get_texture(
&self,
id: &egui::TextureId,
) -> Option<&(Option<wgpu::Texture>, wgpu::BindGroup)> {
self.textures.get(id)
}

/// Registers a `wgpu::Texture` with a `egui::TextureId`.
///
/// This enables the application to reference the texture inside an image ui element.
Expand Down Expand Up @@ -669,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 @@ -688,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 @@ -702,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