@@ -2,17 +2,18 @@ use crate::{
2
2
ColorMode , FontSystem , GlyphDetails , GlyphToRender , GpuCacheStatus , PrepareError , RenderError ,
3
3
SwashCache , SwashContent , TextArea , TextAtlas , Viewport ,
4
4
} ;
5
- use std:: { slice, sync:: Arc } ;
5
+ use std:: { num :: NonZeroU64 , slice, sync:: Arc } ;
6
6
use wgpu:: {
7
- Buffer , BufferDescriptor , BufferUsages , DepthStencilState , Device , Extent3d , ImageCopyTexture ,
8
- ImageDataLayout , MultisampleState , Origin3d , Queue , RenderPass , RenderPipeline , TextureAspect ,
9
- COPY_BUFFER_ALIGNMENT ,
7
+ util :: StagingBelt , Buffer , BufferDescriptor , BufferUsages , CommandEncoder , DepthStencilState ,
8
+ Device , Extent3d , ImageCopyTexture , ImageDataLayout , MultisampleState , Origin3d , Queue ,
9
+ RenderPass , RenderPipeline , TextureAspect , COPY_BUFFER_ALIGNMENT ,
10
10
} ;
11
11
12
12
/// A text renderer that uses cached glyphs to render text into an existing render pass.
13
13
pub struct TextRenderer {
14
14
vertex_buffer : Buffer ,
15
15
vertex_buffer_size : u64 ,
16
+ staging_belt : StagingBelt ,
16
17
pipeline : Arc < RenderPipeline > ,
17
18
glyph_vertices : Vec < GlyphToRender > ,
18
19
}
@@ -38,6 +39,7 @@ impl TextRenderer {
38
39
Self {
39
40
vertex_buffer,
40
41
vertex_buffer_size,
42
+ staging_belt : StagingBelt :: new ( vertex_buffer_size) ,
41
43
pipeline,
42
44
glyph_vertices : Vec :: new ( ) ,
43
45
}
@@ -48,6 +50,7 @@ impl TextRenderer {
48
50
& mut self ,
49
51
device : & Device ,
50
52
queue : & Queue ,
53
+ encoder : & mut CommandEncoder ,
51
54
font_system : & mut FontSystem ,
52
55
atlas : & mut TextAtlas ,
53
56
viewport : & Viewport ,
@@ -56,6 +59,7 @@ impl TextRenderer {
56
59
mut metadata_to_depth : impl FnMut ( usize ) -> f32 ,
57
60
) -> Result < ( ) , PrepareError > {
58
61
self . glyph_vertices . clear ( ) ;
62
+ self . staging_belt . recall ( ) ;
59
63
60
64
let resolution = viewport. resolution ( ) ;
61
65
@@ -271,7 +275,16 @@ impl TextRenderer {
271
275
} ;
272
276
273
277
if self . vertex_buffer_size >= vertices_raw. len ( ) as u64 {
274
- queue. write_buffer ( & self . vertex_buffer , 0 , vertices_raw) ;
278
+ self . staging_belt
279
+ . write_buffer (
280
+ encoder,
281
+ & self . vertex_buffer ,
282
+ 0 ,
283
+ NonZeroU64 :: new ( vertices_raw. len ( ) as u64 ) . expect ( "Non-empty vertices" ) ,
284
+ device,
285
+ )
286
+ . copy_from_slice ( vertices_raw) ;
287
+ self . staging_belt . finish ( ) ;
275
288
} else {
276
289
self . vertex_buffer . destroy ( ) ;
277
290
@@ -284,6 +297,9 @@ impl TextRenderer {
284
297
285
298
self . vertex_buffer = buffer;
286
299
self . vertex_buffer_size = buffer_size;
300
+
301
+ self . staging_belt . finish ( ) ;
302
+ self . staging_belt = StagingBelt :: new ( buffer_size) ;
287
303
}
288
304
289
305
Ok ( ( ) )
@@ -293,6 +309,7 @@ impl TextRenderer {
293
309
& mut self ,
294
310
device : & Device ,
295
311
queue : & Queue ,
312
+ encoder : & mut CommandEncoder ,
296
313
font_system : & mut FontSystem ,
297
314
atlas : & mut TextAtlas ,
298
315
viewport : & Viewport ,
@@ -302,6 +319,7 @@ impl TextRenderer {
302
319
self . prepare_with_depth (
303
320
device,
304
321
queue,
322
+ encoder,
305
323
font_system,
306
324
atlas,
307
325
viewport,
0 commit comments