maplibre/vector/
resource_system.rs

1//! Prepares GPU-owned resources by initializing them if they are uninitialized or out-of-date.
2use crate::{
3    context::MapContext,
4    render::{
5        eventually::Eventually,
6        resource::{RenderPipeline, TilePipeline},
7        shaders,
8        shaders::Shader,
9        RenderResources, Renderer,
10    },
11    tcs::system::{SystemError, SystemResult},
12    vector::{resource::BufferPool, LinePipeline, VectorBufferPool, VectorPipeline},
13};
14
15pub fn resource_system(
16    MapContext {
17        world,
18        renderer:
19            Renderer {
20                device,
21                resources: RenderResources { surface, .. },
22                settings,
23                ..
24            },
25        ..
26    }: &mut MapContext,
27) -> SystemResult {
28    let Some((buffer_pool, vector_pipeline, line_pipeline)) = world.resources.query_mut::<(
29        &mut Eventually<VectorBufferPool>,
30        &mut Eventually<VectorPipeline>,
31        &mut Eventually<LinePipeline>,
32    )>() else {
33        return Err(SystemError::Dependencies);
34    };
35
36    buffer_pool.initialize(|| BufferPool::from_device(device));
37
38    vector_pipeline.initialize(|| {
39        let tile_shader = shaders::FillShader {
40            format: surface.surface_format(),
41        };
42
43        let pipeline = TilePipeline::new(
44            "vector_pipeline".into(),
45            *settings,
46            tile_shader.describe_vertex(),
47            tile_shader.describe_fragment(),
48            true,
49            false,
50            false,
51            false,
52            surface.is_multisampling_supported(settings.msaa),
53            false,
54            false,
55        )
56        .describe_render_pipeline()
57        .initialize(device);
58
59        VectorPipeline(pipeline)
60    });
61
62    line_pipeline.initialize(|| {
63        let line_shader = shaders::LineShader {
64            format: surface.surface_format(),
65        };
66
67        let pipeline = TilePipeline::new(
68            "line_pipeline".into(),
69            *settings,
70            line_shader.describe_vertex(),
71            line_shader.describe_fragment(),
72            true,
73            false,
74            false,
75            false,
76            surface.is_multisampling_supported(settings.msaa),
77            false,
78            false,
79        )
80        .describe_render_pipeline()
81        .initialize(device);
82
83        LinePipeline(pipeline)
84    });
85
86    Ok(())
87}