diff options
Diffstat (limited to 'gfx/wr/webrender/src/renderer/mod.rs')
-rw-r--r-- | gfx/wr/webrender/src/renderer/mod.rs | 75 |
1 files changed, 44 insertions, 31 deletions
diff --git a/gfx/wr/webrender/src/renderer/mod.rs b/gfx/wr/webrender/src/renderer/mod.rs index 3a058ae8f4..a70d3eca18 100644 --- a/gfx/wr/webrender/src/renderer/mod.rs +++ b/gfx/wr/webrender/src/renderer/mod.rs @@ -48,6 +48,7 @@ use api::channel::{Sender, Receiver}; pub use api::DebugFlags; use core::time::Duration; +use crate::pattern::PatternKind; use crate::render_api::{DebugCommand, ApiMsg, MemoryReport}; use crate::batch::{AlphaBatchContainer, BatchKind, BatchFeatures, BatchTextures, BrushBatchKind, ClipBatchList}; use crate::batch::{ClipMaskInstanceList}; @@ -286,7 +287,8 @@ impl BatchKind { } } BatchKind::TextRun(_) => GPU_TAG_PRIM_TEXT_RUN, - BatchKind::Primitive => GPU_TAG_PRIMITIVE, + BatchKind::Quad(PatternKind::ColorOrTexture) => GPU_TAG_PRIMITIVE, + BatchKind::Quad(PatternKind::Mask) => GPU_TAG_INDIRECT_MASK, } } } @@ -2171,8 +2173,8 @@ impl Renderer { fn handle_prims( &mut self, draw_target: &DrawTarget, - prim_instances: &[PrimitiveInstanceData], - prim_instances_with_scissor: &FastHashMap<DeviceIntRect, Vec<PrimitiveInstanceData>>, + prim_instances: &[Vec<PrimitiveInstanceData>], + prim_instances_with_scissor: &FastHashMap<(DeviceIntRect, PatternKind), Vec<PrimitiveInstanceData>>, projection: &default::Transform3D<f32>, stats: &mut RendererStats, ) { @@ -2181,10 +2183,17 @@ impl Renderer { { let _timer = self.gpu_profiler.start_timer(GPU_TAG_INDIRECT_PRIM); - if !prim_instances.is_empty() { + if prim_instances.iter().any(|instances| !instances.is_empty()) { self.set_blend(false, FramebufferKind::Other); + } - self.shaders.borrow_mut().ps_quad_textured.bind( + for (pattern_idx, prim_instances) in prim_instances.iter().enumerate() { + if prim_instances.is_empty() { + continue; + } + let pattern = PatternKind::from_u32(pattern_idx as u32); + + self.shaders.borrow_mut().get_quad_shader(pattern).bind( &mut self.device, projection, None, @@ -2192,10 +2201,13 @@ impl Renderer { &mut self.profile, ); + // TODO: Some patterns will need to be able to sample textures. + let texture_bindings = BatchTextures::empty(); + self.draw_instanced_batch( prim_instances, VertexArrayKind::Primitive, - &BatchTextures::empty(), + &texture_bindings, stats, ); } @@ -2205,17 +2217,22 @@ impl Renderer { self.device.set_blend_mode_premultiplied_alpha(); self.device.enable_scissor(); - self.shaders.borrow_mut().ps_quad_textured.bind( - &mut self.device, - projection, - None, - &mut self.renderer_errors, - &mut self.profile, - ); + let mut prev_pattern = None; - for (scissor_rect, prim_instances) in prim_instances_with_scissor { - self.device.set_scissor_rect(draw_target.to_framebuffer_rect(*scissor_rect)); + for ((scissor_rect, pattern), prim_instances) in prim_instances_with_scissor { + if prev_pattern != Some(*pattern) { + prev_pattern = Some(*pattern); + self.shaders.borrow_mut().get_quad_shader(*pattern).bind( + &mut self.device, + projection, + None, + &mut self.renderer_errors, + &mut self.profile, + ); + } + self.device.set_scissor_rect(draw_target.to_framebuffer_rect(*scissor_rect)); + // TODO: hook up the right pattern. self.draw_instanced_batch( prim_instances, VertexArrayKind::Primitive, @@ -3578,14 +3595,12 @@ impl Renderer { stats, ); - for clip_masks in &target.clip_masks { - self.handle_clips( - &draw_target, - clip_masks, - projection, - stats, - ); - } + self.handle_clips( + &draw_target, + &target.clip_masks, + projection, + stats, + ); if clear_depth.is_some() { self.device.invalidate_depth_target(); @@ -3840,14 +3855,12 @@ impl Renderer { stats, ); - for clip_masks in &target.clip_masks { - self.handle_clips( - &draw_target, - clip_masks, - projection, - stats, - ); - } + self.handle_clips( + &draw_target, + &target.clip_masks, + projection, + stats, + ); } self.gpu_profiler.finish_sampler(alpha_sampler); |