@@ -145,10 +145,17 @@ pub struct WebGlRenderBackend {
145145}
146146
147147struct 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+
152159const MAX_GRADIENT_COLORS : usize = 15 ;
153160
154161impl 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) ]
14351496struct 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