Skip to content

Commit

Permalink
Auto merge of #3218 - gw3583:prim-metadata, r=kvark
Browse files Browse the repository at this point in the history
Remove PrimitiveMetadata struct.

It doesn't really serve any useful purpose anymore, and it
will slightly simplify things as we move to storing primitives
as interned / immutable data + prim instances.

<!-- Reviewable:start -->
---
This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/webrender/3218)
<!-- Reviewable:end -->
  • Loading branch information
bors-servo committed Oct 19, 2018
2 parents c72754d + b7ba28b commit 15656cb
Show file tree
Hide file tree
Showing 7 changed files with 309 additions and 323 deletions.
36 changes: 24 additions & 12 deletions webrender/src/batch.rs
Original file line number Diff line number Diff line change
Expand Up @@ -507,7 +507,7 @@ impl AlphaBatchBuilder {
for poly in splitter.sort(vec3(0.0, 0.0, 1.0)) {
let prim_instance = &pic.prim_instances[poly.anchor];
let prim_index = prim_instance.prim_index;
let pic_metadata = &ctx.prim_store.primitives[prim_index.0].metadata;
let prim = &ctx.prim_store.primitives[prim_index.0];
if cfg!(debug_assertions) && ctx.prim_store.chase_id == Some(prim_index) {
println!("\t\tsplit polygon {:?}", poly.points);
}
Expand All @@ -523,15 +523,26 @@ impl AlphaBatchBuilder {
.map_or(OPAQUE_TASK_ADDRESS, |id| render_tasks.get_task_address(id));

let prim_header = PrimitiveHeader {
local_rect: pic_metadata.local_rect,
local_rect: prim.local_rect,
local_clip_rect: prim_instance.combined_local_clip_rect,
task_address,
specific_prim_address: GpuCacheAddress::invalid(),
clip_task_address,
transform_id,
};

let pic = ctx.prim_store.get_pic(prim_index);
let pic_index = match prim.details {
PrimitiveDetails::Brush(ref brush) => {
match brush.kind {
BrushKind::Picture { pic_index, .. } => pic_index,
_ => unreachable!(),
}
}
PrimitiveDetails::TextRun(..) => {
unreachable!();
}
};
let pic = &ctx.prim_store.pictures[pic_index.0];

let (uv_rect_address, _) = pic
.raster_config
Expand Down Expand Up @@ -607,7 +618,6 @@ impl AlphaBatchBuilder {
plane_split_anchor: usize,
) {
let prim = &ctx.prim_store.primitives[prim_instance.prim_index.0];
let prim_metadata = &prim.metadata;

if prim_instance.clipped_world_rect.is_none() {
return;
Expand All @@ -632,8 +642,7 @@ impl AlphaBatchBuilder {
.expect("bug");

// If the primitive is internally decomposed into multiple sub-primitives we may not
// use some of the per-primitive data typically stored in PrimitiveMetadata and get
// it from each sub-primitive instead.
// use some of the per-primitive data and get it from each sub-primitive instead.
let is_multiple_primitives = match prim.details {
PrimitiveDetails::Brush(ref brush) => {
match brush.kind {
Expand Down Expand Up @@ -667,7 +676,7 @@ impl AlphaBatchBuilder {
};

let prim_header = PrimitiveHeader {
local_rect: prim_metadata.local_rect,
local_rect: prim.local_rect,
local_clip_rect: prim_instance.combined_local_clip_rect,
task_address,
specific_prim_address: prim_cache_address,
Expand All @@ -683,7 +692,9 @@ impl AlphaBatchBuilder {
match prim.details {
PrimitiveDetails::Brush(ref brush) => {
match brush.kind {
BrushKind::Picture(ref picture) => {
BrushKind::Picture { pic_index, .. } => {
let picture = &ctx.prim_store.pictures[pic_index.0];

// If this picture is participating in a 3D rendering context,
// then don't add it to any batches here. Instead, create a polygon
// for it and add it to the current plane splitter.
Expand All @@ -698,8 +709,9 @@ impl AlphaBatchBuilder {
// rather that rectangles. The interpolation still works correctly
// since we determine the UVs by doing a bilerp with a factor
// from the original local rect.
let local_rect = prim_metadata.local_rect
.intersection(&prim_instance.combined_local_clip_rect);
let local_rect = prim
.local_rect
.intersection(&prim_instance.combined_local_clip_rect);

if let Some(local_rect) = local_rect {
match transform.transform_kind() {
Expand Down Expand Up @@ -828,8 +840,8 @@ impl AlphaBatchBuilder {
0,
]);

let shadow_rect = prim_metadata.local_rect.translate(&offset);
let shadow_clip_rect = prim_metadata.local_clip_rect.translate(&offset);
let shadow_rect = prim.local_rect.translate(&offset);
let shadow_clip_rect = prim.local_clip_rect.translate(&offset);

let shadow_prim_header = PrimitiveHeader {
local_rect: shadow_rect,
Expand Down
33 changes: 21 additions & 12 deletions webrender/src/display_list_flattener.rs
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,8 @@ use internal_types::{FastHashMap, FastHashSet};
use picture::{PictureCompositeMode, PictureIdGenerator, PicturePrimitive};
use prim_store::{BrushKind, BrushPrimitive, BrushSegmentDescriptor, PrimitiveInstance};
use prim_store::{EdgeAaSegmentMask, ImageSource, PrimitiveOpacity, PrimitiveKey};
use prim_store::{BorderSource, BrushSegment, BrushSegmentVec, PrimitiveContainer, PrimitiveIndex, PrimitiveStore};
use prim_store::{OpacityBinding, ScrollNodeAndClipChain, TextRunPrimitive};
use prim_store::{BorderSource, BrushSegment, BrushSegmentVec, PrimitiveContainer, PrimitiveStore};
use prim_store::{OpacityBinding, ScrollNodeAndClipChain, TextRunPrimitive, PictureIndex};
use render_backend::{DocumentView};
use resource_cache::{FontInstanceMap, ImageRequest};
use scene::{Scene, ScenePipeline, StackingContextHelpers};
Expand Down Expand Up @@ -159,9 +159,9 @@ pub struct DisplayListFlattener<'a> {
/// The estimated count of primtives we expect to encounter during flattening.
prim_count_estimate: usize,

/// The root primitive index for this flattener. This is the primitive
/// The root picture index for this flattener. This is the picture
/// to start the culling phase from.
pub root_prim_index: PrimitiveIndex,
pub root_pic_index: PictureIndex,
}

impl<'a> DisplayListFlattener<'a> {
Expand Down Expand Up @@ -201,7 +201,7 @@ impl<'a> DisplayListFlattener<'a> {
picture_id_generator,
resources,
prim_count_estimate: 0,
root_prim_index: PrimitiveIndex(0),
root_pic_index: PictureIndex(0),
};

flattener.push_root(
Expand Down Expand Up @@ -1064,9 +1064,10 @@ impl<'a> DisplayListFlattener<'a> {
stacking_context.requested_raster_space,
stacking_context.normal_primitives,
);
let leaf_pic_index = self.prim_store.create_picture(leaf_picture);

// Create a brush primitive that draws this picture.
let leaf_prim = BrushPrimitive::new_picture(leaf_picture);
let leaf_prim = BrushPrimitive::new_picture(leaf_pic_index);

// Add the brush to the parent picture.
let leaf_prim_index = self.prim_store.add_primitive(
Expand All @@ -1078,6 +1079,7 @@ impl<'a> DisplayListFlattener<'a> {
// Create a chain of pictures based on presence of filters,
// mix-blend-mode and/or 3d rendering context containers.
let mut current_prim_index = leaf_prim_index;
let mut current_pic_index = leaf_pic_index;

// For each filter, create a new image with that composite mode.
for filter in &stacking_context.composite_ops.filters {
Expand All @@ -1100,8 +1102,10 @@ impl<'a> DisplayListFlattener<'a> {
),
],
);
let filter_pic_index = self.prim_store.create_picture(filter_picture);
current_pic_index = filter_pic_index;

let filter_prim = BrushPrimitive::new_picture(filter_picture);
let filter_prim = BrushPrimitive::new_picture(filter_pic_index);

current_prim_index = self.prim_store.add_primitive(
&LayoutRect::zero(),
Expand All @@ -1111,7 +1115,7 @@ impl<'a> DisplayListFlattener<'a> {

// Run the optimize pass on this picture, to see if we can
// collapse opacity and avoid drawing to an off-screen surface.
self.prim_store.optimize_picture_if_possible(current_prim_index);
self.prim_store.optimize_picture_if_possible(current_pic_index);
}

// Same for mix-blend-mode.
Expand All @@ -1133,8 +1137,10 @@ impl<'a> DisplayListFlattener<'a> {
),
],
);
let blend_pic_index = self.prim_store.create_picture(blend_picture);
current_pic_index = blend_pic_index;

let blend_prim = BrushPrimitive::new_picture(blend_picture);
let blend_prim = BrushPrimitive::new_picture(blend_pic_index);

current_prim_index = self.prim_store.add_primitive(
&LayoutRect::zero(),
Expand Down Expand Up @@ -1167,8 +1173,10 @@ impl<'a> DisplayListFlattener<'a> {
stacking_context.requested_raster_space,
prims,
);
let container_pic_index = self.prim_store.create_picture(container_picture);
current_pic_index = container_pic_index;

let container_prim = BrushPrimitive::new_picture(container_picture);
let container_prim = BrushPrimitive::new_picture(container_pic_index);

current_prim_index = self.prim_store.add_primitive(
&LayoutRect::zero(),
Expand All @@ -1181,7 +1189,7 @@ impl<'a> DisplayListFlattener<'a> {

if self.sc_stack.is_empty() {
// This must be the root stacking context
self.root_prim_index = current_prim_index;
self.root_pic_index = current_pic_index;
return;
}

Expand Down Expand Up @@ -1500,7 +1508,8 @@ impl<'a> DisplayListFlattener<'a> {
);

// Create the primitive to draw the shadow picture into the scene.
let shadow_prim = BrushPrimitive::new_picture(shadow_pic);
let shadow_pic_index = self.prim_store.create_picture(shadow_pic);
let shadow_prim = BrushPrimitive::new_picture(shadow_pic_index);
let shadow_prim_index = self.prim_store.add_primitive(
&LayoutRect::zero(),
&max_clip,
Expand Down
18 changes: 9 additions & 9 deletions webrender/src/frame_builder.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ use gpu_types::{PrimitiveHeaders, TransformPalette, UvRectKind};
use hit_test::{HitTester, HitTestingRun};
use internal_types::{FastHashMap};
use picture::{PictureCompositeMode, PictureSurface, RasterConfig};
use prim_store::{PrimitiveIndex, PrimitiveStore, SpaceMapper};
use prim_store::{PrimitiveIndex, PrimitiveStore, SpaceMapper, PictureIndex};
use profiler::{FrameProfileCounters, GpuCacheProfileCounters, TextureCacheProfileCounters};
use render_backend::{FrameResources, FrameId};
use render_task::{RenderTask, RenderTaskId, RenderTaskLocation, RenderTaskTree};
Expand Down Expand Up @@ -58,7 +58,7 @@ pub struct FrameBuilder {
background_color: Option<ColorF>,
window_size: DeviceUintSize,
scene_id: u64,
root_prim_index: PrimitiveIndex,
root_pic_index: PictureIndex,
pub prim_store: PrimitiveStore,
pub clip_store: ClipStore,
pub hit_testing_runs: Vec<HitTestingRun>,
Expand Down Expand Up @@ -88,6 +88,7 @@ pub struct FrameBuildingState<'a> {
}

pub struct PictureContext {
pub pic_index: PictureIndex,
pub pipeline_id: PipelineId,
pub apply_local_clip_rect: bool,
pub inflation_factor: f32,
Expand Down Expand Up @@ -138,7 +139,7 @@ impl FrameBuilder {
window_size: DeviceUintSize::zero(),
background_color: None,
scene_id: 0,
root_prim_index: PrimitiveIndex(0),
root_pic_index: PictureIndex(0),
config: FrameBuilderConfig {
default_font_render_mode: FontRenderMode::Mono,
dual_source_blending_is_enabled: true,
Expand All @@ -159,7 +160,7 @@ impl FrameBuilder {
hit_testing_runs: flattener.hit_testing_runs,
prim_store: flattener.prim_store,
clip_store: flattener.clip_store,
root_prim_index: flattener.root_prim_index,
root_pic_index: flattener.root_pic_index,
screen_rect,
background_color,
window_size,
Expand Down Expand Up @@ -228,8 +229,9 @@ impl FrameBuilder {

let (pic_context, mut pic_state, mut instances) = self
.prim_store
.get_pic_mut(self.root_prim_index)
.pictures[self.root_pic_index.0]
.take_context(
self.root_pic_index,
&prim_context,
root_spatial_node_index,
root_spatial_node_index,
Expand All @@ -251,9 +253,7 @@ impl FrameBuilder {
&mut pic_rect,
);

let pic = self
.prim_store
.get_pic_mut(self.root_prim_index);
let pic = &mut self.prim_store.pictures[self.root_pic_index.0];
pic.restore_context(
instances,
pic_context,
Expand All @@ -267,7 +267,7 @@ impl FrameBuilder {
let root_render_task = RenderTask::new_picture(
RenderTaskLocation::Fixed(self.screen_rect.to_i32()),
self.screen_rect.size.to_f32(),
self.root_prim_index,
self.root_pic_index,
DeviceIntPoint::zero(),
pic_state.tasks,
UvRectKind::Rect,
Expand Down
Loading

0 comments on commit 15656cb

Please sign in to comment.