summaryrefslogtreecommitdiffstats
path: root/gfx/wr/webrender/src/renderer/mod.rs
diff options
context:
space:
mode:
Diffstat (limited to 'gfx/wr/webrender/src/renderer/mod.rs')
-rw-r--r--gfx/wr/webrender/src/renderer/mod.rs75
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);