Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Port rectangles and segment building to support primitive interning. #3346

Merged
merged 2 commits into from Nov 25, 2018
Merged
Changes from 1 commit
Commits
File filter...
Filter file types
Jump to…
Jump to file
Failed to load files.

Always

Just for now

Next

Use interning for rectangles.

The major parts of this patch are the changes to allow interning
of primitives that make use of segment building.

Once that lands, the ports for other primitives that use segments
should be straightforward.
  • Loading branch information
gw3583 committed Nov 24, 2018
commit f168ba21b604bf231ed5bdfb697c9e0edf19c995
@@ -17,7 +17,7 @@ use internal_types::{FastHashMap, SavedTargetIndex, TextureSource};
use picture::{Picture3DContext, PictureCompositeMode, PicturePrimitive, PictureSurface};
use prim_store::{BrushKind, BrushPrimitive, DeferredResolve, PrimitiveTemplateKind};
use prim_store::{EdgeAaSegmentMask, ImageSource, PrimitiveInstanceKind, PrimitiveStore};
use prim_store::{VisibleGradientTile, PrimitiveInstance, PrimitiveOpacity};
use prim_store::{VisibleGradientTile, PrimitiveInstance, PrimitiveOpacity, SegmentInstanceIndex};
use prim_store::{BrushSegment, ClipMaskKind, ClipTaskIndex, PrimitiveDetails};
use render_task::{RenderTaskAddress, RenderTaskId, RenderTaskTree};
use renderer::{BlendMode, ImageBufferKind, ShaderColorMode};
@@ -905,6 +905,7 @@ impl AlphaBatchBuilder {
PrimitiveInstanceKind::LegacyPrimitive { .. } |
PrimitiveInstanceKind::NormalBorder { .. } |
PrimitiveInstanceKind::ImageBorder { .. } |
PrimitiveInstanceKind::Rectangle { .. } |
PrimitiveInstanceKind::Clear => {
unreachable!();
}
@@ -1617,6 +1618,72 @@ impl AlphaBatchBuilder {
ctx,
);
}
(
PrimitiveInstanceKind::Rectangle { segment_instance_index, opacity_binding_index, .. },
PrimitiveTemplateKind::Rectangle { .. }
) => {
let specified_blend_mode = BlendMode::PremultipliedAlpha;
let opacity_binding = ctx.prim_store.get_opacity_binding(*opacity_binding_index);

let opacity = PrimitiveOpacity::from_alpha(opacity_binding);
let opacity = opacity.combine(prim_data.opacity);

let non_segmented_blend_mode = if !opacity.is_opaque ||
prim_instance.clip_task_index != ClipTaskIndex::INVALID ||
transform_kind == TransformedRectKind::Complex
{
specified_blend_mode
} else {
BlendMode::None
};

let batch_params = BrushBatchParameters::shared(
BrushBatchKind::Solid,
BatchTextures::no_texture(),
[get_shader_opacity(opacity_binding), 0, 0],
0,
);

debug_assert!(*segment_instance_index != SegmentInstanceIndex::INVALID);
let (prim_cache_address, segments) = if *segment_instance_index == SegmentInstanceIndex::UNUSED {
(gpu_cache.get_address(&prim_data.gpu_cache_handle), None)
} else {
let segment_instance = &ctx.scratch.segment_instances[*segment_instance_index];
let segments = Some(&ctx.scratch.segments[segment_instance.segments_range]);
(gpu_cache.get_address(&segment_instance.gpu_cache_handle), segments)
};

let prim_header = PrimitiveHeader {
local_rect: prim_data.prim_rect,
local_clip_rect: prim_instance.combined_local_clip_rect,
task_address,
specific_prim_address: prim_cache_address,
clip_task_address,
transform_id,
};

let prim_header_index = prim_headers.push(
&prim_header,
z_id,
batch_params.prim_user_data,
);

self.add_segmented_prim_to_batch(
segments,
opacity,
&batch_params,
specified_blend_mode,
non_segmented_blend_mode,
prim_header_index,
clip_task_address,
bounding_rect,
transform_kind,
render_tasks,
z_id,
prim_instance.clip_task_index,
ctx,
);
}
_ => {
unreachable!();
}
@@ -1794,7 +1861,7 @@ impl AlphaBatchBuilder {
textures: segment_data.textures,
};
let instance = PrimitiveInstanceData::from(BrushInstance {
segment_index: 0,
segment_index: INVALID_SEGMENT_INDEX,
edge_flags: EdgeAaSegmentMask::all(),
clip_task_address,
brush_flags: BrushFlags::PERSPECTIVE_INTERPOLATION,
@@ -1999,15 +2066,6 @@ impl BrushPrimitive {
))
}
}
BrushKind::Solid { opacity_binding_index, .. } => {
let opacity_binding = prim_store.get_opacity_binding(opacity_binding_index);
Some(BrushBatchParameters::shared(
BrushBatchKind::Solid,
BatchTextures::no_texture(),
[get_shader_opacity(opacity_binding), 0, 0],
0,
))
}
BrushKind::RadialGradient { ref stops_handle, .. } => {
Some(BrushBatchParameters::shared(
BrushBatchKind::RadialGradient,
@@ -2106,7 +2164,6 @@ impl PrimitiveInstance {
AlphaType::Alpha => BlendMode::Alpha,
}
}
BrushKind::Solid { .. } |
BrushKind::YuvImage { .. } |
BrushKind::RadialGradient { .. } |
BrushKind::LinearGradient { .. } => {
@@ -8,7 +8,7 @@ use clip::ClipItemKey;
use display_list_flattener::DisplayListFlattener;
use gpu_cache::GpuCacheHandle;
use gpu_types::BoxShadowStretchMode;
use prim_store::{BrushKind, BrushPrimitive, PrimitiveContainer};
use prim_store::PrimitiveContainer;
use prim_store::ScrollNodeAndClipChain;
use render_task::RenderTaskCacheEntryHandle;
use util::RectHelpers;
@@ -149,7 +149,9 @@ impl<'a> DisplayListFlattener<'a> {
clip_and_scroll,
&LayoutPrimitiveInfo::with_clip_rect(final_prim_rect, prim_info.clip_rect),
clips,
PrimitiveContainer::Brush(BrushPrimitive::new(BrushKind::new_solid(*color), None)),
PrimitiveContainer::Rectangle {
color: *color,
},
);
} else {
// Normal path for box-shadows with a valid blur radius.
@@ -170,7 +172,9 @@ impl<'a> DisplayListFlattener<'a> {

// Draw the box-shadow as a solid rect, using a box-shadow
// clip mask item.
let prim = BrushPrimitive::new(BrushKind::new_solid(*color), None);
let prim = PrimitiveContainer::Rectangle {
color: *color,
};

// Create the box-shadow clip item.
let shadow_clip_source = ClipItemKey::box_shadow(
@@ -221,7 +225,7 @@ impl<'a> DisplayListFlattener<'a> {
clip_and_scroll,
&prim_info,
extra_clips,
PrimitiveContainer::Brush(prim),
prim,
);
}
}
@@ -840,7 +840,9 @@ impl<'a> DisplayListFlattener<'a> {
// style PrimitiveDetails structure from the
// source primitive container.
let mut info = info.clone();
let (prim_key_kind, prim_details) = container.build(&mut info);
let (prim_key_kind, prim_details) = container.build(
&mut info,
);

let prim_key = PrimitiveKey::new(
info.is_backface_visible,
@@ -1679,16 +1681,13 @@ impl<'a> DisplayListFlattener<'a> {
return;
}

let prim = BrushPrimitive::new(
BrushKind::new_solid(color),
None,
);

self.add_primitive(
clip_and_scroll,
info,
Vec::new(),
PrimitiveContainer::Brush(prim),
PrimitiveContainer::Rectangle {
color,
},
);
}

@@ -85,7 +85,6 @@ pub struct FrameBuildingState<'a> {
pub transforms: &'a mut TransformPalette,
pub segment_builder: SegmentBuilder,
pub surfaces: &'a mut Vec<SurfaceInfo>,
pub scratch: &'a mut PrimitiveScratchBuffer,
}

/// Immutable context of a picture when processing children.
@@ -255,7 +254,6 @@ impl FrameBuilder {
transforms: transform_palette,
segment_builder: SegmentBuilder::new(),
surfaces: pic_update_state.surfaces,
scratch,
};

let (pic_context, mut pic_state, mut prim_list) = self
@@ -279,6 +277,7 @@ impl FrameBuilder {
&frame_context,
&mut frame_state,
resources,
scratch,
);

let pic = &mut self.prim_store.pictures[self.root_pic_index.0];
@@ -414,14 +414,6 @@ impl TileCache {
// TODO(gw): In future, we might be able to completely remove
// opacity collapsing support. It's of limited use
// once we have full picture caching.
BrushKind::Solid { opacity_binding_index, .. } => {
let opacity_binding = &opacity_binding_store[opacity_binding_index];
for binding in &opacity_binding.bindings {
if let PropertyBinding::Binding(key, default) = binding {
opacity_bindings.push((key.id, *default));
}
}
}
BrushKind::Image { opacity_binding_index, ref request, .. } => {
let opacity_binding = &opacity_binding_store[opacity_binding_index];
for binding in &opacity_binding.bindings {
@@ -442,6 +434,14 @@ impl TileCache {
}
}
}
PrimitiveInstanceKind::Rectangle { opacity_binding_index, .. } => {
let opacity_binding = &opacity_binding_store[opacity_binding_index];
for binding in &opacity_binding.bindings {
if let PropertyBinding::Binding(key, default) = binding {
opacity_bindings.push((key.id, *default));
}
}
}
PrimitiveInstanceKind::TextRun { .. } |
PrimitiveInstanceKind::LineDecoration { .. } |
PrimitiveInstanceKind::Clear |
ProTip! Use n and p to navigate between commits in a pull request.
You can’t perform that action at this time.