maplibre/raster/
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    raster::resource::RasterResources,
5    render::{
6        eventually::Eventually,
7        resource::{RenderPipeline, TilePipeline},
8        settings::Msaa,
9        shaders,
10        shaders::Shader,
11        RenderResources, Renderer,
12    },
13    tcs::system::{SystemError, SystemResult},
14};
15
16pub fn resource_system(
17    MapContext {
18        world,
19        renderer:
20            Renderer {
21                device,
22                resources: RenderResources { surface, .. },
23                settings,
24                ..
25            },
26        ..
27    }: &mut MapContext,
28) -> SystemResult {
29    let Some(raster_resources) = world
30        .resources
31        .query_mut::<&mut Eventually<RasterResources>>()
32    else {
33        return Err(SystemError::Dependencies);
34    };
35
36    raster_resources.initialize(|| {
37        let shader = shaders::RasterShader {
38            format: surface.surface_format(),
39        };
40
41        RasterResources::new(
42            Msaa { samples: 1 },
43            device,
44            TilePipeline::new(
45                "raster_pipeline".into(),
46                *settings,
47                shader.describe_vertex(),
48                shader.describe_fragment(),
49                true,
50                false,
51                false,
52                false,
53                surface.is_multisampling_supported(settings.msaa),
54                true,
55                false,
56            )
57            .describe_render_pipeline()
58            .initialize(device),
59        )
60    });
61    Ok(())
62}