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 all commits
Commits
File filter...
Filter file types
Jump to…
Jump to file
Failed to load files.

Always

Just for now

@@ -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,71 @@ 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,
);

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 +1860,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 +2065,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 +2163,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.