Skip to content

Commit 7d27a5a

Browse files
hatal175relrelb
authored andcommitted
webgl: vertex array, buffer and texture cleanup
1 parent 4b2907e commit 7d27a5a

File tree

1 file changed

+73
-12
lines changed

1 file changed

+73
-12
lines changed

render/webgl/src/lib.rs

Lines changed: 73 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -145,10 +145,17 @@ pub struct WebGlRenderBackend {
145145
}
146146

147147
struct RegistryData {
148+
gl: Gl,
148149
bitmap: Bitmap,
149150
texture: WebGlTexture,
150151
}
151152

153+
impl Drop for RegistryData {
154+
fn drop(&mut self) {
155+
self.gl.delete_texture(Some(&self.texture));
156+
}
157+
}
158+
152159
const MAX_GRADIENT_COLORS: usize = 15;
153160

154161
impl WebGlRenderBackend {
@@ -402,8 +409,14 @@ impl WebGlRenderBackend {
402409
DrawType::Color
403410
},
404411
vao,
405-
vertex_buffer,
406-
index_buffer,
412+
vertex_buffer: Buffer {
413+
gl: self.gl.clone(),
414+
buffer: vertex_buffer,
415+
},
416+
index_buffer: Buffer {
417+
gl: self.gl.clone(),
418+
buffer: index_buffer,
419+
},
407420
num_indices: 6,
408421
num_mask_indices: 6,
409422
}],
@@ -621,16 +634,28 @@ impl WebGlRenderBackend {
621634
TessDrawType::Color => Draw {
622635
draw_type: DrawType::Color,
623636
vao,
624-
vertex_buffer,
625-
index_buffer,
637+
vertex_buffer: Buffer {
638+
gl: self.gl.clone(),
639+
buffer: vertex_buffer,
640+
},
641+
index_buffer: Buffer {
642+
gl: self.gl.clone(),
643+
buffer: index_buffer,
644+
},
626645
num_indices,
627646
num_mask_indices,
628647
},
629648
TessDrawType::Gradient(gradient) => Draw {
630649
draw_type: DrawType::Gradient(Box::new(Gradient::from(gradient))),
631650
vao,
632-
vertex_buffer,
633-
index_buffer,
651+
vertex_buffer: Buffer {
652+
gl: self.gl.clone(),
653+
buffer: vertex_buffer,
654+
},
655+
index_buffer: Buffer {
656+
gl: self.gl.clone(),
657+
buffer: index_buffer,
658+
},
634659
num_indices,
635660
num_mask_indices,
636661
},
@@ -642,8 +667,14 @@ impl WebGlRenderBackend {
642667
is_repeating: bitmap.is_repeating,
643668
}),
644669
vao,
645-
vertex_buffer,
646-
index_buffer,
670+
vertex_buffer: Buffer {
671+
gl: self.gl.clone(),
672+
buffer: vertex_buffer,
673+
},
674+
index_buffer: Buffer {
675+
gl: self.gl.clone(),
676+
buffer: index_buffer,
677+
},
647678
num_indices,
648679
num_mask_indices,
649680
},
@@ -685,6 +716,18 @@ impl WebGlRenderBackend {
685716
};
686717
}
687718

719+
fn delete_mesh(&self, mesh: &Mesh) {
720+
if let Some(gl2) = &self.gl2 {
721+
for draw in &mesh.draws {
722+
gl2.delete_vertex_array(Some(&draw.vao));
723+
}
724+
} else {
725+
for draw in &mesh.draws {
726+
self.vao_ext.delete_vertex_array_oes(Some(&draw.vao));
727+
}
728+
}
729+
}
730+
688731
fn set_stencil_state(&mut self) {
689732
// Set stencil state for masking, if necessary.
690733
if self.mask_state_dirty {
@@ -924,6 +967,7 @@ impl RenderBackend for WebGlRenderBackend {
924967
bitmap_source: &dyn BitmapSource,
925968
handle: ShapeHandle,
926969
) {
970+
self.delete_mesh(&self.meshes[handle.0]);
927971
let mesh = self.register_shape_internal(shape, bitmap_source);
928972
self.meshes[handle.0] = mesh;
929973
}
@@ -981,8 +1025,14 @@ impl RenderBackend for WebGlRenderBackend {
9811025

9821026
let handle = self.next_bitmap_handle;
9831027
self.next_bitmap_handle = BitmapHandle(self.next_bitmap_handle.0 + 1);
984-
self.bitmap_registry
985-
.insert(handle, RegistryData { bitmap, texture });
1028+
self.bitmap_registry.insert(
1029+
handle,
1030+
RegistryData {
1031+
gl: self.gl.clone(),
1032+
bitmap,
1033+
texture,
1034+
},
1035+
);
9861036

9871037
Ok(handle)
9881038
}
@@ -1431,11 +1481,22 @@ struct Mesh {
14311481
draws: Vec<Draw>,
14321482
}
14331483

1484+
struct Buffer {
1485+
gl: Gl,
1486+
buffer: WebGlBuffer,
1487+
}
1488+
1489+
impl Drop for Buffer {
1490+
fn drop(&mut self) {
1491+
self.gl.delete_buffer(Some(&self.buffer));
1492+
}
1493+
}
1494+
14341495
#[allow(dead_code)]
14351496
struct Draw {
14361497
draw_type: DrawType,
1437-
vertex_buffer: WebGlBuffer,
1438-
index_buffer: WebGlBuffer,
1498+
vertex_buffer: Buffer,
1499+
index_buffer: Buffer,
14391500
vao: WebGlVertexArrayObject,
14401501
num_indices: i32,
14411502
num_mask_indices: i32,

0 commit comments

Comments
 (0)