From a84ad8bb7afc0d7b6a4437b43a97fe26e4e66d4d Mon Sep 17 00:00:00 2001 From: Sebastian K Date: Sat, 23 Mar 2024 14:22:24 +0100 Subject: [PATCH 1/3] add feature gates for d3d9, d3d11, ui and debug --- renderer/Cargo.toml | 8 ++++ renderer/src/builder.rs | 79 +++++++++++++++++++++++++----------- renderer/src/gpu/mod.rs | 3 ++ renderer/src/gpu/renderer.rs | 66 +++++++++++++++++++++++++++--- renderer/src/gpu_data.rs | 14 +++++++ 5 files changed, 141 insertions(+), 29 deletions(-) diff --git a/renderer/Cargo.toml b/renderer/Cargo.toml index df36c77fe..d1fd9892f 100644 --- a/renderer/Cargo.toml +++ b/renderer/Cargo.toml @@ -8,6 +8,13 @@ license = "MIT OR Apache-2.0" repository = "https://github.com/servo/pathfinder" homepage = "https://github.com/servo/pathfinder" +[features] +d3d9 = [] +d3d11 = [] +ui = ["pathfinder_ui", "debug"] +debug = [] +default = ["d3d9", "d3d11", "ui"] + [dependencies] bitflags = "1.0" byte-slice-cast = "0.3" @@ -54,6 +61,7 @@ version = "0.5" [dependencies.pathfinder_ui] path = "../ui" version = "0.5" +optional = true [dev-dependencies] quickcheck = "0.9" diff --git a/renderer/src/builder.rs b/renderer/src/builder.rs index 0a391cc20..4e7114c2d 100644 --- a/renderer/src/builder.rs +++ b/renderer/src/builder.rs @@ -186,29 +186,33 @@ impl<'a, 'b, 'c, 'd> SceneBuilder<'a, 'b, 'c, 'd> { PrepareMode::GPU { .. } => None, }; - // TODO(pcwalton): Do this earlier? - let scene_is_dirty = match (&prepare_mode, &self.sink.last_scene) { - (&PrepareMode::GPU { .. }, &None) => true, - (&PrepareMode::GPU { .. }, &Some(LastSceneInfo { - scene_id: ref last_scene_id, - scene_epoch: ref last_scene_epoch, - .. - })) => *last_scene_id != self.scene.id() || *last_scene_epoch != self.scene.epoch(), - _ => false, - }; - if scene_is_dirty { - let built_segments = BuiltSegments::from_scene(&self.scene); - self.sink.listener.send(RenderCommand::UploadSceneD3D11 { - draw_segments: built_segments.draw_segments, - clip_segments: built_segments.clip_segments, - }); - self.sink.last_scene = Some(LastSceneInfo { - scene_id: self.scene.id(), - scene_epoch: self.scene.epoch(), - draw_segment_ranges: built_segments.draw_segment_ranges, - clip_segment_ranges: built_segments.clip_segment_ranges, - }); + #[cfg(feature="d3d11")] + { + // TODO(pcwalton): Do this earlier? + let scene_is_dirty = match (&prepare_mode, &self.sink.last_scene) { + (&PrepareMode::GPU { .. }, &None) => true, + (&PrepareMode::GPU { .. }, &Some(LastSceneInfo { + scene_id: ref last_scene_id, + scene_epoch: ref last_scene_epoch, + .. + })) => *last_scene_id != self.scene.id() || *last_scene_epoch != self.scene.epoch(), + _ => false, + }; + + if scene_is_dirty { + let built_segments = BuiltSegments::from_scene(&self.scene); + self.sink.listener.send(RenderCommand::UploadSceneD3D11 { + draw_segments: built_segments.draw_segments, + clip_segments: built_segments.clip_segments, + }); + self.sink.last_scene = Some(LastSceneInfo { + scene_id: self.scene.id(), + scene_epoch: self.scene.epoch(), + draw_segment_ranges: built_segments.draw_segment_ranges, + clip_segment_ranges: built_segments.clip_segment_ranges, + }); + } } self.finish_building(&paint_metadata, built_paths, &prepare_mode); @@ -314,6 +318,7 @@ impl<'a, 'b, 'c, 'd> SceneBuilder<'a, 'b, 'c, 'd> { } fn send_fills(&self, fills: Vec) { + #[cfg(feature="d3d9")] if !fills.is_empty() { self.sink.listener.send(RenderCommand::AddFillsD3D9(fills)); } @@ -356,8 +361,9 @@ impl<'a, 'b, 'c, 'd> SceneBuilder<'a, 'b, 'c, 'd> { built_paths: Option, prepare_mode: &PrepareMode) { match self.sink.renderer_level { + #[cfg(feature="d3d9")] RendererLevel::D3D9 => self.sink.listener.send(RenderCommand::FlushFillsD3D9), - RendererLevel::D3D11 => {} + _ => {} } self.build_tile_batches(paint_metadata, prepare_mode, built_paths); @@ -837,13 +843,16 @@ impl SegmentsD3D11 { struct TileBatchBuilder { prepare_commands: Vec, draw_commands: Vec, + #[cfg(feature="d3d11")] clip_batches_d3d11: Option, next_batch_id: TileBatchId, level: TileBatchBuilderLevel, } enum TileBatchBuilderLevel { + #[cfg(feature="d3d9")] D3D9 { built_paths: BuiltPaths }, + #[cfg(feature="d3d11")] D3D11, } @@ -853,6 +862,7 @@ impl TileBatchBuilder { prepare_commands: vec![], draw_commands: vec![], next_batch_id: TileBatchId(MAX_CLIP_BATCHES), + #[cfg(feature="d3d11")] clip_batches_d3d11: match built_paths { None => { Some(ClipBatchesD3D11 { @@ -863,8 +873,12 @@ impl TileBatchBuilder { Some(_) => None, }, level: match built_paths { + #[cfg(feature="d3d11")] None => TileBatchBuilderLevel::D3D11, + #[cfg(feature="d3d9")] Some(built_paths) => TileBatchBuilderLevel::D3D9 { built_paths }, + #[allow(unreachable_patterns)] + _ => unreachable!() }, } } @@ -880,6 +894,7 @@ impl TileBatchBuilder { for draw_path_id in draw_path_id_range.start.0..draw_path_id_range.end.0 { let draw_path_id = DrawPathId(draw_path_id); let draw_path = match self.level { + #[cfg(feature="d3d11")] TileBatchBuilderLevel::D3D11 { .. } => { match self.prepare_draw_path_for_gpu_binning(scene, built_options, @@ -890,6 +905,7 @@ impl TileBatchBuilder { Some(built_draw_path) => Cow::Owned(built_draw_path), } } + #[cfg(feature="d3d9")] TileBatchBuilderLevel::D3D9 { ref built_paths } => { Cow::Borrowed(&built_paths.draw[draw_path_id.0 as usize]) } @@ -897,10 +913,12 @@ impl TileBatchBuilder { // Try to reuse the current batch if we can. let flush_needed = match draw_tile_batch { + #[cfg(feature="d3d11")] Some(DrawTileBatch::D3D11(ref mut existing_batch)) => { !fixup_batch_for_new_path_if_possible(&mut existing_batch.color_texture, &draw_path) } + #[cfg(feature="d3d9")] Some(DrawTileBatch::D3D9(ref mut existing_batch)) => { !fixup_batch_for_new_path_if_possible(&mut existing_batch.color_texture, &draw_path) @@ -911,9 +929,11 @@ impl TileBatchBuilder { // If we couldn't reuse the batch, flush it. if flush_needed { match draw_tile_batch.take() { + #[cfg(feature="d3d11")] Some(DrawTileBatch::D3D11(batch_to_flush)) => { self.draw_commands.push(RenderCommand::DrawTilesD3D11(batch_to_flush)); } + #[cfg(feature="d3d9")] Some(DrawTileBatch::D3D9(batch_to_flush)) => { self.draw_commands.push(RenderCommand::DrawTilesD3D9(batch_to_flush)); } @@ -924,6 +944,7 @@ impl TileBatchBuilder { // Create a new batch if necessary. if draw_tile_batch.is_none() { draw_tile_batch = match self.level { + #[cfg(feature="d3d9")] TileBatchBuilderLevel::D3D9 { .. } => { let tile_bounds = tiles::round_rect_out_to_tile_bounds(scene.view_box()); Some(DrawTileBatch::D3D9(DrawTileBatchD3D9 { @@ -935,6 +956,7 @@ impl TileBatchBuilder { blend_mode: draw_path.blend_mode, })) } + #[cfg(feature="d3d11")] TileBatchBuilderLevel::D3D11 { .. } => { Some(DrawTileBatch::D3D11(DrawTileBatchD3D11 { tile_batch_data: TileBatchDataD3D11::new(self.next_batch_id, @@ -948,6 +970,7 @@ impl TileBatchBuilder { } // Add clip path if necessary. + #[cfg(feature="d3d11")] let clip_path = match self.clip_batches_d3d11 { None => None, Some(ref mut clip_batches_d3d11) => { @@ -963,6 +986,7 @@ impl TileBatchBuilder { let draw_tile_batch = draw_tile_batch.as_mut().unwrap(); match *draw_tile_batch { + #[cfg(feature="d3d11")] DrawTileBatch::D3D11(ref mut draw_tile_batch) => { draw_tile_batch.tile_batch_data.push(&draw_path.path, draw_path_id.to_path_id(), @@ -970,9 +994,12 @@ impl TileBatchBuilder { draw_path.occludes, sink); } + #[cfg(feature="d3d9")] DrawTileBatch::D3D9(ref mut draw_tile_batch) => { let built_paths = match self.level { + #[cfg(feature="d3d9")] TileBatchBuilderLevel::D3D9 { ref built_paths } => built_paths, + #[cfg(feature="d3d11")] TileBatchBuilderLevel::D3D11 { .. } => unreachable!(), }; @@ -1016,9 +1043,11 @@ impl TileBatchBuilder { } match draw_tile_batch { + #[cfg(feature="d3d11")] Some(DrawTileBatch::D3D11(draw_tile_batch)) => { self.draw_commands.push(RenderCommand::DrawTilesD3D11(draw_tile_batch)); } + #[cfg(feature="d3d9")] Some(DrawTileBatch::D3D9(draw_tile_batch)) => { self.draw_commands.push(RenderCommand::DrawTilesD3D9(draw_tile_batch)); } @@ -1066,6 +1095,7 @@ impl TileBatchBuilder { } fn send_to(self, sink: &SceneSink) { + #[cfg(feature="d3d11")] if let Some(clip_batches_d3d11) = self.clip_batches_d3d11 { for prepare_batch in clip_batches_d3d11.prepare_batches.into_iter().rev() { if prepare_batch.path_count > 0 { @@ -1083,12 +1113,14 @@ impl TileBatchBuilder { } } +#[cfg(feature="d3d11")] struct ClipBatchesD3D11 { // Will be submitted in reverse (LIFO) order. prepare_batches: Vec, clip_id_to_path_batch_index: FxHashMap, } +#[cfg(feature="d3d11")] fn add_clip_path_to_batch(scene: &Scene, sink: &SceneSink, built_options: &PreparedBuildOptions, @@ -1145,6 +1177,7 @@ fn add_clip_path_to_batch(scene: &Scene, } } +#[cfg(feature="d3d11")] fn prepare_clip_path_for_gpu_binning(scene: &Scene, sink: &SceneSink, built_options: &PreparedBuildOptions, diff --git a/renderer/src/gpu/mod.rs b/renderer/src/gpu/mod.rs index 322bb99bb..211b0b59f 100644 --- a/renderer/src/gpu/mod.rs +++ b/renderer/src/gpu/mod.rs @@ -10,8 +10,11 @@ //! The GPU renderer for Pathfinder 3. +#[cfg(feature="d3d9")] pub mod d3d9; +#[cfg(feature="d3d11")] pub mod d3d11; +#[cfg(feature="ui")] pub mod debug; pub mod options; pub mod perf; diff --git a/renderer/src/gpu/renderer.rs b/renderer/src/gpu/renderer.rs index 73988f475..5d17057f4 100644 --- a/renderer/src/gpu/renderer.rs +++ b/renderer/src/gpu/renderer.rs @@ -11,8 +11,11 @@ //! The GPU renderer that processes commands necessary to render a scene. use crate::gpu::blend::{ToBlendState, ToCompositeCtrl}; +#[cfg(feature="d3d9")] use crate::gpu::d3d9::renderer::RendererD3D9; +#[cfg(feature="d3d11")] use crate::gpu::d3d11::renderer::RendererD3D11; +#[cfg(feature="ui")] use crate::gpu::debug::DebugUIPresenter; use crate::gpu::options::{DestFramebuffer, RendererLevel, RendererMode, RendererOptions}; use crate::gpu::perf::{PendingTimer, RenderStats, RenderTime, TimeCategory, TimerQueryCache}; @@ -85,15 +88,25 @@ pub struct Renderer where D: Device { frame: Frame, // Debug + #[cfg(feature="debug")] current_cpu_build_time: Option, + #[cfg(feature="debug")] pending_timers: VecDeque>, + + #[cfg(feature="ui")] debug_ui_presenter: Option>, + #[cfg(feature="ui")] last_stats: VecDeque, + + #[cfg(feature="debug")] last_rendering_time: Option, } enum RendererLevelImpl where D: Device { + #[cfg(feature="d3d9")] D3D9(RendererD3D9), + + #[cfg(feature="d3d11")] D3D11(RendererD3D11), } @@ -261,12 +274,19 @@ impl Renderer where D: Device { }; let level_impl = match core.mode.level { + #[cfg(feature="d3d9")] RendererLevel::D3D9 => { RendererLevelImpl::D3D9(RendererD3D9::new(&mut core, resources)) } + #[cfg(feature="d3d11")] RendererLevel::D3D11 => { RendererLevelImpl::D3D11(RendererD3D11::new(&mut core, resources)) } + #[cfg(not(feature="d3d9"))] + RendererLevel::D3D9 => unimplemented!("feature d3d9 not enabled"), + + #[cfg(not(feature="d3d11"))] + RendererLevel::D3D11 => unimplemented!("feature d3d11 not enabled"), }; let blit_program = BlitProgram::new(&core.device, resources); @@ -274,6 +294,7 @@ impl Renderer where D: Device { let stencil_program = StencilProgram::new(&core.device, resources); let reprojection_program = ReprojectionProgram::new(&core.device, resources); + #[cfg(feature="ui")] let debug_ui_presenter = if core.options.show_debug_ui { Some(DebugUIPresenter::new(&core.device, resources, window_size, core.mode.level)) } else { @@ -303,10 +324,17 @@ impl Renderer where D: Device { stencil_program, reprojection_program, + #[cfg(feature="debug")] current_cpu_build_time: None, + #[cfg(feature="debug")] pending_timers: VecDeque::new(), + + #[cfg(feature="ui")] debug_ui_presenter, + #[cfg(feature="ui")] last_stats: VecDeque::new(), + + #[cfg(feature="debug")] last_rendering_time: None, } } @@ -352,12 +380,15 @@ impl Renderer where D: Device { RenderCommand::UploadTextureMetadata(ref metadata) => { self.upload_texture_metadata(metadata) } + #[cfg(feature="d3d9")] RenderCommand::AddFillsD3D9(ref fills) => { self.level_impl.require_d3d9().add_fills(&mut self.core, fills) } + #[cfg(feature="d3d9")] RenderCommand::FlushFillsD3D9 => { self.level_impl.require_d3d9().draw_buffered_fills(&mut self.core); } + #[cfg(feature="d3d11")] RenderCommand::UploadSceneD3D11 { ref draw_segments, ref clip_segments } => { self.level_impl .require_d3d11() @@ -367,12 +398,15 @@ impl Renderer where D: Device { self.push_render_target(render_target_id) } RenderCommand::PopRenderTarget => self.pop_render_target(), + #[cfg(feature="d3d11")] RenderCommand::PrepareClipTilesD3D11(ref batch) => { self.level_impl.require_d3d11().prepare_tiles(&mut self.core, batch) } + #[cfg(feature="d3d9")] RenderCommand::DrawTilesD3D9(ref batch) => { self.level_impl.require_d3d9().upload_and_draw_tiles(&mut self.core, batch) } + #[cfg(feature="d3d11")] RenderCommand::DrawTilesD3D11(ref batch) => { self.level_impl.require_d3d11().prepare_and_draw_tiles(&mut self.core, batch) } @@ -397,20 +431,27 @@ impl Renderer where D: Device { self.core.stats.gpu_bytes_committed = self.core.allocator.bytes_committed(); match self.level_impl { + #[cfg(feature="d3d9")] RendererLevelImpl::D3D9(_) => {} + #[cfg(feature="d3d11")] RendererLevelImpl::D3D11(ref mut d3d11_renderer) => { d3d11_renderer.end_frame(&mut self.core) } } - if let Some(timer) = self.core.current_timer.take() { - self.pending_timers.push_back(timer); + #[cfg(feature="debug")] + { + if let Some(timer) = self.core.current_timer.take() { + self.pending_timers.push_back(timer); + } + self.current_cpu_build_time = None; } - self.current_cpu_build_time = None; - self.update_debug_ui(); - if self.core.options.show_debug_ui { - self.draw_debug_ui(); + #[cfg(feature="ui")] { + self.update_debug_ui(); + if self.core.options.show_debug_ui { + self.draw_debug_ui(); + } } self.core.allocator.purge_if_needed(); @@ -450,6 +491,7 @@ impl Renderer where D: Device { self.core.render_targets.clear(); } + #[cfg(feature="ui")] fn update_debug_ui(&mut self) { self.last_stats.push_back(self.core.stats); self.shift_rendering_time(); @@ -466,6 +508,7 @@ impl Renderer where D: Device { } } + #[cfg(feature="ui")] fn draw_debug_ui(&mut self) { if let Some(ref mut debug_ui_presenter) = self.debug_ui_presenter { let window_size = self.core.options.dest.window_size(&self.core.device); @@ -474,6 +517,7 @@ impl Renderer where D: Device { } } + #[cfg(feature="debug")] fn shift_rendering_time(&mut self) { if let Some(mut pending_timer) = self.pending_timers.pop_front() { for old_query in pending_timer.poll(&self.core.device) { @@ -488,6 +532,7 @@ impl Renderer where D: Device { self.last_rendering_time = None; } + #[cfg(feature="debug")] /// Returns GPU timing information for the last frame, if present. pub fn last_rendering_time(&self) -> Option { self.last_rendering_time @@ -543,11 +588,13 @@ impl Renderer where D: Device { #[inline] pub fn dest_framebuffer_size_changed(&mut self) { let new_framebuffer_size = self.core.main_viewport().size(); + #[cfg(feature="ui")] if let Some(ref mut debug_ui_presenter) = self.debug_ui_presenter { debug_ui_presenter.ui_presenter.set_framebuffer_size(new_framebuffer_size); } } + #[cfg(feature="ui")] /// Returns a mutable reference to the debug UI. /// /// You can use this function to draw custom debug widgets on screen, as the demo does. @@ -1286,20 +1333,26 @@ impl Frame where D: Device { } impl RendererLevelImpl where D: Device { + #[cfg(feature="d3d9")] #[inline] fn require_d3d9(&mut self) -> &mut RendererD3D9 { match *self { + #[cfg(feature="d3d9")] RendererLevelImpl::D3D9(ref mut d3d9_renderer) => d3d9_renderer, + #[cfg(feature="d3d11")] RendererLevelImpl::D3D11(_) => { panic!("Tried to enter the D3D9 path with a D3D11 renderer!") } } } + #[cfg(feature="d3d11")] #[inline] fn require_d3d11(&mut self) -> &mut RendererD3D11 { match *self { + #[cfg(feature="d3d11")] RendererLevelImpl::D3D11(ref mut d3d11_renderer) => d3d11_renderer, + #[cfg(feature="d3d9")] RendererLevelImpl::D3D9(_) => { panic!("Tried to enter the D3D11 path with a D3D9 renderer!") } @@ -1353,6 +1406,7 @@ pub(crate) struct PatternTexturePage { pub(crate) must_preserve_contents: bool, } +#[cfg(feature="ui")] /// A mutable reference to the debug UI presenter. /// /// You can use this structure to draw custom debug widgets on screen, as the demo does. diff --git a/renderer/src/gpu_data.rs b/renderer/src/gpu_data.rs index f098dbe59..a7948e70f 100644 --- a/renderer/src/gpu_data.rs +++ b/renderer/src/gpu_data.rs @@ -64,12 +64,15 @@ pub enum RenderCommand { // Upload texture metadata. UploadTextureMetadata(Vec), + #[cfg(feature="d3d9")] // Adds fills to the queue. AddFillsD3D9(Vec), + #[cfg(feature="d3d9")] // Flushes the queue of fills. FlushFillsD3D9, + #[cfg(feature="d3d11")] /// Upload a scene to GPU. /// /// This will only be sent if dicing and binning is done on GPU. @@ -85,12 +88,15 @@ pub enum RenderCommand { // Pops a render target from the stack. PopRenderTarget, + #[cfg(feature="d3d11")] // Computes backdrops for tiles, prepares any Z-buffers, and performs clipping. PrepareClipTilesD3D11(TileBatchDataD3D11), + #[cfg(feature="d3d9")] // Draws a batch of tiles to the render target on top of the stack. DrawTilesD3D9(DrawTileBatchD3D9), + #[cfg(feature="d3d11")] // Draws a batch of tiles to the render target on top of the stack. DrawTilesD3D11(DrawTileBatchD3D11), @@ -210,7 +216,9 @@ pub struct GlobalPathId { #[derive(Clone, Debug)] pub enum DrawTileBatch { + #[cfg(feature="d3d9")] D3D9(DrawTileBatchD3D9), + #[cfg(feature="d3d11")] D3D11(DrawTileBatchD3D11), } @@ -482,10 +490,13 @@ impl Debug for RenderCommand { RenderCommand::UploadTextureMetadata(ref metadata) => { write!(formatter, "UploadTextureMetadata(x{})", metadata.len()) } + #[cfg(feature="d3d9")] RenderCommand::AddFillsD3D9(ref fills) => { write!(formatter, "AddFillsD3D9(x{})", fills.len()) } + #[cfg(feature="d3d9")] RenderCommand::FlushFillsD3D9 => write!(formatter, "FlushFills"), + #[cfg(feature="d3d11")] RenderCommand::UploadSceneD3D11 { ref draw_segments, ref clip_segments } => { write!(formatter, "UploadSceneD3D11(DP x{}, DI x{}, CP x{}, CI x{})", @@ -494,6 +505,7 @@ impl Debug for RenderCommand { clip_segments.points.len(), clip_segments.indices.len()) } + #[cfg(feature="d3d11")] RenderCommand::PrepareClipTilesD3D11(ref batch) => { let clipped_path_count = match batch.clipped_path_info { None => 0, @@ -508,9 +520,11 @@ impl Debug for RenderCommand { write!(formatter, "PushRenderTarget({:?})", render_target_id) } RenderCommand::PopRenderTarget => write!(formatter, "PopRenderTarget"), + #[cfg(feature="d3d9")] RenderCommand::DrawTilesD3D9(ref batch) => { write!(formatter, "DrawTilesD3D9(x{:?})", batch.tiles.len()) } + #[cfg(feature="d3d11")] RenderCommand::DrawTilesD3D11(ref batch) => { write!(formatter, "DrawTilesD3D11({:?}, C0 {:?})", From 210e285057a725ba7346ba90e1e6052421ee0285 Mon Sep 17 00:00:00 2001 From: Sebastian K Date: Sat, 23 Mar 2024 16:05:44 +0100 Subject: [PATCH 2/3] don't ship resources that are not needed --- renderer/src/gpu/mod.rs | 2 +- resources/Cargo.toml | 7 +++ resources/MANIFEST | 99 ---------------------------------------- resources/MANIFEST.debug | 16 +++++++ resources/MANIFEST.gl3 | 28 ++++++++++++ resources/MANIFEST.gl4 | 35 ++++++++++++++ resources/MANIFEST.metal | 35 ++++++++++++++ resources/build.rs | 43 ++++++++++------- webgl/Cargo.toml | 1 + 9 files changed, 150 insertions(+), 116 deletions(-) create mode 100644 resources/MANIFEST.debug create mode 100644 resources/MANIFEST.gl3 create mode 100644 resources/MANIFEST.gl4 create mode 100644 resources/MANIFEST.metal diff --git a/renderer/src/gpu/mod.rs b/renderer/src/gpu/mod.rs index 211b0b59f..630393cb9 100644 --- a/renderer/src/gpu/mod.rs +++ b/renderer/src/gpu/mod.rs @@ -14,7 +14,7 @@ pub mod d3d9; #[cfg(feature="d3d11")] pub mod d3d11; -#[cfg(feature="ui")] +#[cfg(feature="debug")] pub mod debug; pub mod options; pub mod perf; diff --git a/resources/Cargo.toml b/resources/Cargo.toml index d8f7b9361..efb450296 100644 --- a/resources/Cargo.toml +++ b/resources/Cargo.toml @@ -8,4 +8,11 @@ license = "MIT OR Apache-2.0" repository = "https://github.com/servo/pathfinder" homepage = "https://github.com/servo/pathfinder" +[features] +gl3 = [] +gl4 = [] +metal = [] +debug = [] +default = ["gl3", "gl4", "metal", "debug"] + [dependencies] diff --git a/resources/MANIFEST b/resources/MANIFEST index 40de16163..859d07f94 100644 --- a/resources/MANIFEST +++ b/resources/MANIFEST @@ -2,103 +2,4 @@ # # When you add a new resource, make sure to add it to this file. -debug-fonts/regular.json -shaders/gl3/blit.fs.glsl -shaders/gl3/blit.vs.glsl -shaders/gl3/clear.fs.glsl -shaders/gl3/clear.vs.glsl -shaders/gl3/d3d9/fill.fs.glsl -shaders/gl3/d3d9/fill.vs.glsl -shaders/gl3/d3d9/tile.fs.glsl -shaders/gl3/d3d9/tile.vs.glsl -shaders/gl3/d3d9/tile_clip_combine.fs.glsl -shaders/gl3/d3d9/tile_clip_combine.vs.glsl -shaders/gl3/d3d9/tile_clip_copy.fs.glsl -shaders/gl3/d3d9/tile_clip_copy.vs.glsl -shaders/gl3/d3d9/tile_copy.fs.glsl -shaders/gl3/d3d9/tile_copy.vs.glsl -shaders/gl3/debug/solid.fs.glsl -shaders/gl3/debug/solid.vs.glsl -shaders/gl3/debug/texture.fs.glsl -shaders/gl3/debug/texture.vs.glsl -shaders/gl3/demo_ground.fs.glsl -shaders/gl3/demo_ground.vs.glsl -shaders/gl3/reproject.fs.glsl -shaders/gl3/reproject.vs.glsl -shaders/gl3/stencil.fs.glsl -shaders/gl3/stencil.vs.glsl -shaders/gl4/blit.fs.glsl -shaders/gl4/blit.vs.glsl -shaders/gl4/clear.fs.glsl -shaders/gl4/clear.vs.glsl -shaders/gl4/d3d11/bin.cs.glsl -shaders/gl4/d3d11/bound.cs.glsl -shaders/gl4/d3d11/dice.cs.glsl -shaders/gl4/d3d11/fill.cs.glsl -shaders/gl4/d3d11/propagate.cs.glsl -shaders/gl4/d3d11/sort.cs.glsl -shaders/gl4/d3d11/tile.cs.glsl -shaders/gl4/d3d9/fill.fs.glsl -shaders/gl4/d3d9/fill.vs.glsl -shaders/gl4/d3d9/tile.fs.glsl -shaders/gl4/d3d9/tile.vs.glsl -shaders/gl4/d3d9/tile_clip_combine.fs.glsl -shaders/gl4/d3d9/tile_clip_combine.vs.glsl -shaders/gl4/d3d9/tile_clip_copy.fs.glsl -shaders/gl4/d3d9/tile_clip_copy.vs.glsl -shaders/gl4/d3d9/tile_copy.fs.glsl -shaders/gl4/d3d9/tile_copy.vs.glsl -shaders/gl4/debug/solid.fs.glsl -shaders/gl4/debug/solid.vs.glsl -shaders/gl4/debug/texture.fs.glsl -shaders/gl4/debug/texture.vs.glsl -shaders/gl4/demo_ground.fs.glsl -shaders/gl4/demo_ground.vs.glsl -shaders/gl4/reproject.fs.glsl -shaders/gl4/reproject.vs.glsl -shaders/gl4/stencil.fs.glsl -shaders/gl4/stencil.vs.glsl -shaders/metal/blit.fs.metal -shaders/metal/blit.vs.metal -shaders/metal/clear.fs.metal -shaders/metal/clear.vs.metal -shaders/metal/d3d11/bin.cs.metal -shaders/metal/d3d11/bound.cs.metal -shaders/metal/d3d11/dice.cs.metal -shaders/metal/d3d11/fill.cs.metal -shaders/metal/d3d11/propagate.cs.metal -shaders/metal/d3d11/sort.cs.metal -shaders/metal/d3d11/tile.cs.metal -shaders/metal/d3d9/fill.fs.metal -shaders/metal/d3d9/fill.vs.metal -shaders/metal/d3d9/tile.fs.metal -shaders/metal/d3d9/tile.vs.metal -shaders/metal/d3d9/tile_clip_combine.fs.metal -shaders/metal/d3d9/tile_clip_combine.vs.metal -shaders/metal/d3d9/tile_clip_copy.fs.metal -shaders/metal/d3d9/tile_clip_copy.vs.metal -shaders/metal/d3d9/tile_copy.fs.metal -shaders/metal/d3d9/tile_copy.vs.metal -shaders/metal/debug/solid.fs.metal -shaders/metal/debug/solid.vs.metal -shaders/metal/debug/texture.fs.metal -shaders/metal/debug/texture.vs.metal -shaders/metal/demo_ground.fs.metal -shaders/metal/demo_ground.vs.metal -shaders/metal/reproject.fs.metal -shaders/metal/reproject.vs.metal -shaders/metal/stencil.fs.metal -shaders/metal/stencil.vs.metal -textures/area-lut.png -textures/debug-corner-fill.png -textures/debug-corner-outline.png -textures/debug-font.png -textures/demo-background.png -textures/demo-effects.png -textures/demo-open.png -textures/demo-rotate.png -textures/demo-screenshot.png -textures/demo-zoom-actual-size.png -textures/demo-zoom-in.png -textures/demo-zoom-out.png textures/gamma-lut.png diff --git a/resources/MANIFEST.debug b/resources/MANIFEST.debug new file mode 100644 index 000000000..d1f70e9ea --- /dev/null +++ b/resources/MANIFEST.debug @@ -0,0 +1,16 @@ +# This file must contain the paths of all resources that are used by the Pathfinder library. +# +# When you add a new resource, make sure to add it to this file. + +debug-fonts/regular.json +textures/debug-corner-fill.png +textures/debug-corner-outline.png +textures/debug-font.png +textures/demo-background.png +textures/demo-effects.png +textures/demo-open.png +textures/demo-rotate.png +textures/demo-screenshot.png +textures/demo-zoom-actual-size.png +textures/demo-zoom-in.png +textures/demo-zoom-out.png \ No newline at end of file diff --git a/resources/MANIFEST.gl3 b/resources/MANIFEST.gl3 new file mode 100644 index 000000000..b78b0e5fe --- /dev/null +++ b/resources/MANIFEST.gl3 @@ -0,0 +1,28 @@ +# This file must contain the paths of all resources that are used by the Pathfinder library. +# +# When you add a new resource, make sure to add it to this file. + +shaders/gl3/blit.fs.glsl +shaders/gl3/blit.vs.glsl +shaders/gl3/clear.fs.glsl +shaders/gl3/clear.vs.glsl +shaders/gl3/d3d9/fill.fs.glsl +shaders/gl3/d3d9/fill.vs.glsl +shaders/gl3/d3d9/tile.fs.glsl +shaders/gl3/d3d9/tile.vs.glsl +shaders/gl3/d3d9/tile_clip_combine.fs.glsl +shaders/gl3/d3d9/tile_clip_combine.vs.glsl +shaders/gl3/d3d9/tile_clip_copy.fs.glsl +shaders/gl3/d3d9/tile_clip_copy.vs.glsl +shaders/gl3/d3d9/tile_copy.fs.glsl +shaders/gl3/d3d9/tile_copy.vs.glsl +shaders/gl3/debug/solid.fs.glsl +shaders/gl3/debug/solid.vs.glsl +shaders/gl3/debug/texture.fs.glsl +shaders/gl3/debug/texture.vs.glsl +shaders/gl3/demo_ground.fs.glsl +shaders/gl3/demo_ground.vs.glsl +shaders/gl3/reproject.fs.glsl +shaders/gl3/reproject.vs.glsl +shaders/gl3/stencil.fs.glsl +shaders/gl3/stencil.vs.glsl diff --git a/resources/MANIFEST.gl4 b/resources/MANIFEST.gl4 new file mode 100644 index 000000000..ea07974ee --- /dev/null +++ b/resources/MANIFEST.gl4 @@ -0,0 +1,35 @@ +# This file must contain the paths of all resources that are used by the Pathfinder library. +# +# When you add a new resource, make sure to add it to this file. + +shaders/gl4/blit.fs.glsl +shaders/gl4/blit.vs.glsl +shaders/gl4/clear.fs.glsl +shaders/gl4/clear.vs.glsl +shaders/gl4/d3d11/bin.cs.glsl +shaders/gl4/d3d11/bound.cs.glsl +shaders/gl4/d3d11/dice.cs.glsl +shaders/gl4/d3d11/fill.cs.glsl +shaders/gl4/d3d11/propagate.cs.glsl +shaders/gl4/d3d11/sort.cs.glsl +shaders/gl4/d3d11/tile.cs.glsl +shaders/gl4/d3d9/fill.fs.glsl +shaders/gl4/d3d9/fill.vs.glsl +shaders/gl4/d3d9/tile.fs.glsl +shaders/gl4/d3d9/tile.vs.glsl +shaders/gl4/d3d9/tile_clip_combine.fs.glsl +shaders/gl4/d3d9/tile_clip_combine.vs.glsl +shaders/gl4/d3d9/tile_clip_copy.fs.glsl +shaders/gl4/d3d9/tile_clip_copy.vs.glsl +shaders/gl4/d3d9/tile_copy.fs.glsl +shaders/gl4/d3d9/tile_copy.vs.glsl +shaders/gl4/debug/solid.fs.glsl +shaders/gl4/debug/solid.vs.glsl +shaders/gl4/debug/texture.fs.glsl +shaders/gl4/debug/texture.vs.glsl +shaders/gl4/demo_ground.fs.glsl +shaders/gl4/demo_ground.vs.glsl +shaders/gl4/reproject.fs.glsl +shaders/gl4/reproject.vs.glsl +shaders/gl4/stencil.fs.glsl +shaders/gl4/stencil.vs. \ No newline at end of file diff --git a/resources/MANIFEST.metal b/resources/MANIFEST.metal new file mode 100644 index 000000000..f26ad1ba7 --- /dev/null +++ b/resources/MANIFEST.metal @@ -0,0 +1,35 @@ +# This file must contain the paths of all resources that are used by the Pathfinder library. +# +# When you add a new resource, make sure to add it to this file. + +shaders/metal/blit.fs.metal +shaders/metal/blit.vs.metal +shaders/metal/clear.fs.metal +shaders/metal/clear.vs.metal +shaders/metal/d3d11/bin.cs.metal +shaders/metal/d3d11/bound.cs.metal +shaders/metal/d3d11/dice.cs.metal +shaders/metal/d3d11/fill.cs.metal +shaders/metal/d3d11/propagate.cs.metal +shaders/metal/d3d11/sort.cs.metal +shaders/metal/d3d11/tile.cs.metal +shaders/metal/d3d9/fill.fs.metal +shaders/metal/d3d9/fill.vs.metal +shaders/metal/d3d9/tile.fs.metal +shaders/metal/d3d9/tile.vs.metal +shaders/metal/d3d9/tile_clip_combine.fs.metal +shaders/metal/d3d9/tile_clip_combine.vs.metal +shaders/metal/d3d9/tile_clip_copy.fs.metal +shaders/metal/d3d9/tile_clip_copy.vs.metal +shaders/metal/d3d9/tile_copy.fs.metal +shaders/metal/d3d9/tile_copy.vs.metal +shaders/metal/debug/solid.fs.metal +shaders/metal/debug/solid.vs.metal +shaders/metal/debug/texture.fs.metal +shaders/metal/debug/texture.vs.metal +shaders/metal/demo_ground.fs.metal +shaders/metal/demo_ground.vs.metal +shaders/metal/reproject.fs.metal +shaders/metal/reproject.vs.metal +shaders/metal/stencil.fs.metal +shaders/metal/stencil.vs.metal \ No newline at end of file diff --git a/resources/build.rs b/resources/build.rs index 0912c1adc..b975ca322 100644 --- a/resources/build.rs +++ b/resources/build.rs @@ -23,25 +23,36 @@ fn main() { writeln!(&mut dest, "pub static RESOURCES: &'static [(&'static str, &'static [u8])] = &[").unwrap(); - let src = BufReader::new(File::open("MANIFEST").unwrap()); - for line in src.lines() { - let line = line.unwrap(); - let line = line.trim_start().trim_end(); - if line.is_empty() || line.starts_with("#") { - continue; + let mut add_manifest = |path: &str| { + let src = BufReader::new(File::open(path).unwrap()); + for line in src.lines() { + let line = line.unwrap(); + let line = line.trim_start().trim_end(); + if line.is_empty() || line.starts_with("#") { + continue; + } + + let escaped_path = line.escape_default().to_string(); + let mut full_path = cwd.clone(); + full_path.push(line); + let escaped_full_path = full_path.to_str().unwrap().escape_default().to_string(); + + writeln!(&mut dest, + " (\"{}\", include_bytes!(\"{}\")),", + escaped_path, + escaped_full_path).unwrap(); + + println!("cargo:rerun-if-changed={}", line); } + }; - let escaped_path = line.escape_default().to_string(); - let mut full_path = cwd.clone(); - full_path.push(line); - let escaped_full_path = full_path.to_str().unwrap().escape_default().to_string(); + add_manifest("MANIFEST"); - writeln!(&mut dest, - " (\"{}\", include_bytes!(\"{}\")),", - escaped_path, - escaped_full_path).unwrap(); - - println!("cargo:rerun-if-changed={}", line); + for part in ["debug", "gl3", "gl4", "metal"] { + let key = format!("CARGO_FEATURE_{part}"); + if env::var(&key).is_ok() { + add_manifest(&format!("MANIFEST.{part}")); + } } writeln!(&mut dest, "];").unwrap(); diff --git a/webgl/Cargo.toml b/webgl/Cargo.toml index 782eecaf4..070685605 100644 --- a/webgl/Cargo.toml +++ b/webgl/Cargo.toml @@ -21,6 +21,7 @@ path = "../gpu" [dependencies.pathfinder_renderer] path = "../renderer" +default-features = false [dependencies.pathfinder_simd] path = "../simd" From 3cd4b706fbaf9a7418c68cb755c6f2d74ec4a957 Mon Sep 17 00:00:00 2001 From: Sebastian K Date: Sat, 23 Mar 2024 16:27:07 +0100 Subject: [PATCH 3/3] fix errors from resource builder --- resources/MANIFEST | 1 + resources/MANIFEST.gl4 | 2 +- resources/build.rs | 2 +- resources/src/embedded.rs | 2 +- 4 files changed, 4 insertions(+), 3 deletions(-) diff --git a/resources/MANIFEST b/resources/MANIFEST index 859d07f94..ce6a5138d 100644 --- a/resources/MANIFEST +++ b/resources/MANIFEST @@ -2,4 +2,5 @@ # # When you add a new resource, make sure to add it to this file. +textures/area-lut.png textures/gamma-lut.png diff --git a/resources/MANIFEST.gl4 b/resources/MANIFEST.gl4 index ea07974ee..ec83157b8 100644 --- a/resources/MANIFEST.gl4 +++ b/resources/MANIFEST.gl4 @@ -32,4 +32,4 @@ shaders/gl4/demo_ground.vs.glsl shaders/gl4/reproject.fs.glsl shaders/gl4/reproject.vs.glsl shaders/gl4/stencil.fs.glsl -shaders/gl4/stencil.vs. \ No newline at end of file +shaders/gl4/stencil.vs.glsl \ No newline at end of file diff --git a/resources/build.rs b/resources/build.rs index b975ca322..54847441a 100644 --- a/resources/build.rs +++ b/resources/build.rs @@ -49,7 +49,7 @@ fn main() { add_manifest("MANIFEST"); for part in ["debug", "gl3", "gl4", "metal"] { - let key = format!("CARGO_FEATURE_{part}"); + let key = format!("CARGO_FEATURE_{}", part.to_ascii_uppercase()); if env::var(&key).is_ok() { add_manifest(&format!("MANIFEST.{part}")); } diff --git a/resources/src/embedded.rs b/resources/src/embedded.rs index e9879cde6..2847543a9 100644 --- a/resources/src/embedded.rs +++ b/resources/src/embedded.rs @@ -28,7 +28,7 @@ impl ResourceLoader for EmbeddedResourceLoader { fn slurp(&self, virtual_path: &str) -> Result, IOError> { match RESOURCES.iter().filter(|&(path, _)| *path == virtual_path).next() { Some((_, data)) => Ok(data.to_vec()), - None => Err(IOError::from(ErrorKind::NotFound)), + None => Err(IOError::new(ErrorKind::NotFound, virtual_path)), } } }