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

Sync changes from mozilla-central gfx/wr #3842

Merged
merged 3 commits into from Jan 24, 2020
Merged
Changes from 1 commit
Commits
File filter...
Filter file types
Jump to…
Jump to file
Failed to load files.

Always

Just for now

Bug 1611176 - Avoid expensive memmoves when adding render tasks. r=gw

On pages with many render tasks (typically a lot of text shadows), we spend a lot of time moving RenderTask which is a fairly large struct into the render graph's buffer. This patch avoids it by using the VecHelper trick of allocaitng space before initializing the value. Some RenderTask::new_* methods which take the render task graph in parameter were modified to add the task and return the task ID to work around borrow-checking restriction.

Differential Revision: https://phabricator.services.mozilla.com/D60854

[ghsync] From https://hg.mozilla.org/mozilla-central/rev/e30053699db0bc3c77888e789f0ba576f0904d1f
  • Loading branch information
nical authored and moz-gfx committed Jan 24, 2020
commit d7aba665e2d54e17d4e7fa328af6139b5aa1a326
@@ -270,20 +270,20 @@ impl FrameBuilder {
fb_config: &scene.config,
};

let root_render_task = RenderTask::new_picture(
RenderTaskLocation::Fixed(scene.output_rect),
scene.output_rect.size.to_f32(),
scene.root_pic_index,
DeviceIntPoint::zero(),
UvRectKind::Rect,
ROOT_SPATIAL_NODE_INDEX,
global_device_pixel_scale,
PrimitiveVisibilityMask::all(),
None,
let root_render_task_id = render_tasks.add().init(
RenderTask::new_picture(
RenderTaskLocation::Fixed(scene.output_rect),
scene.output_rect.size.to_f32(),
scene.root_pic_index,
DeviceIntPoint::zero(),
UvRectKind::Rect,
ROOT_SPATIAL_NODE_INDEX,
global_device_pixel_scale,
PrimitiveVisibilityMask::all(),
None,
)
);

let root_render_task_id = render_tasks.add(root_render_task);

// Construct a dummy root surface, that represents the
// main framebuffer surface.
let root_surface = SurfaceInfo::new(
@@ -3755,20 +3755,20 @@ impl PicturePrimitive {
true,
);

let picture_task = RenderTask::new_picture(
RenderTaskLocation::Dynamic(None, device_rect.size),
unclipped.size,
pic_index,
device_rect.origin,
uv_rect_kind,
surface_spatial_node_index,
device_pixel_scale,
PrimitiveVisibilityMask::all(),
None,
let picture_task_id = frame_state.render_tasks.add().init(
RenderTask::new_picture(
RenderTaskLocation::Dynamic(None, device_rect.size),
unclipped.size,
pic_index,
device_rect.origin,
uv_rect_kind,
surface_spatial_node_index,
device_pixel_scale,
PrimitiveVisibilityMask::all(),
None,
)
);

let picture_task_id = frame_state.render_tasks.add(picture_task);

let blur_render_task_id = RenderTask::new_blur(
blur_std_deviation,
picture_task_id,
@@ -3818,20 +3818,22 @@ impl PicturePrimitive {
true,
);

let mut picture_task = RenderTask::new_picture(
RenderTaskLocation::Dynamic(None, device_rect.size),
unclipped.size,
pic_index,
device_rect.origin,
uv_rect_kind,
surface_spatial_node_index,
device_pixel_scale,
PrimitiveVisibilityMask::all(),
None,
);
picture_task.mark_for_saving();
let picture_task_id = frame_state.render_tasks.add().init({
let mut picture_task = RenderTask::new_picture(
RenderTaskLocation::Dynamic(None, device_rect.size),
unclipped.size,
pic_index,
device_rect.origin,
uv_rect_kind,
surface_spatial_node_index,
device_pixel_scale,
PrimitiveVisibilityMask::all(),
None,
);
picture_task.mark_for_saving();

let picture_task_id = frame_state.render_tasks.add(picture_task);
picture_task
});

self.secondary_render_task_id = Some(picture_task_id);

@@ -3865,19 +3867,7 @@ impl PicturePrimitive {
true,
);

let picture_task = RenderTask::new_picture(
RenderTaskLocation::Dynamic(None, clipped.size),
unclipped.size,
pic_index,
clipped.origin,
uv_rect_kind,
surface_spatial_node_index,
device_pixel_scale,
PrimitiveVisibilityMask::all(),
None,
);

let readback_task_id = frame_state.render_tasks.add(
let readback_task_id = frame_state.render_tasks.add().init(
RenderTask::new_readback(clipped)
);

@@ -3888,7 +3878,19 @@ impl PicturePrimitive {

self.secondary_render_task_id = Some(readback_task_id);

let render_task_id = frame_state.render_tasks.add(picture_task);
let render_task_id = frame_state.render_tasks.add().init(
RenderTask::new_picture(
RenderTaskLocation::Dynamic(None, clipped.size),
unclipped.size,
pic_index,
clipped.origin,
uv_rect_kind,
surface_spatial_node_index,
device_pixel_scale,
PrimitiveVisibilityMask::all(),
None,
)
);

Some((render_task_id, render_task_id))
}
@@ -3901,20 +3903,20 @@ impl PicturePrimitive {
true,
);

let picture_task = RenderTask::new_picture(
RenderTaskLocation::Dynamic(None, clipped.size),
unclipped.size,
pic_index,
clipped.origin,
uv_rect_kind,
surface_spatial_node_index,
device_pixel_scale,
PrimitiveVisibilityMask::all(),
None,
let render_task_id = frame_state.render_tasks.add().init(
RenderTask::new_picture(
RenderTaskLocation::Dynamic(None, clipped.size),
unclipped.size,
pic_index,
clipped.origin,
uv_rect_kind,
surface_spatial_node_index,
device_pixel_scale,
PrimitiveVisibilityMask::all(),
None,
)
);

let render_task_id = frame_state.render_tasks.add(picture_task);

Some((render_task_id, render_task_id))
}
PictureCompositeMode::ComponentTransferFilter(..) => {
@@ -3926,20 +3928,20 @@ impl PicturePrimitive {
true,
);

let picture_task = RenderTask::new_picture(
RenderTaskLocation::Dynamic(None, clipped.size),
unclipped.size,
pic_index,
clipped.origin,
uv_rect_kind,
surface_spatial_node_index,
device_pixel_scale,
PrimitiveVisibilityMask::all(),
None,
let render_task_id = frame_state.render_tasks.add().init(
RenderTask::new_picture(
RenderTaskLocation::Dynamic(None, clipped.size),
unclipped.size,
pic_index,
clipped.origin,
uv_rect_kind,
surface_spatial_node_index,
device_pixel_scale,
PrimitiveVisibilityMask::all(),
None,
)
);

let render_task_id = frame_state.render_tasks.add(picture_task);

Some((render_task_id, render_task_id))
}
PictureCompositeMode::TileCache { .. } => {
@@ -4138,23 +4140,23 @@ impl PicturePrimitive {
tile_cache.current_tile_size,
);

let task = RenderTask::new_picture(
RenderTaskLocation::PictureCache {
size: tile_cache.current_tile_size,
surface,
},
tile_cache.current_tile_size.to_f32(),
pic_index,
content_origin.to_i32(),
UvRectKind::Rect,
surface_spatial_node_index,
device_pixel_scale,
*visibility_mask,
Some(scissor_rect.to_i32()),
let render_task_id = frame_state.render_tasks.add().init(
RenderTask::new_picture(
RenderTaskLocation::PictureCache {
size: tile_cache.current_tile_size,
surface,
},
tile_cache.current_tile_size.to_f32(),
pic_index,
content_origin.to_i32(),
UvRectKind::Rect,
surface_spatial_node_index,
device_pixel_scale,
*visibility_mask,
Some(scissor_rect.to_i32()),
)
);

let render_task_id = frame_state.render_tasks.add(task);

frame_state.render_tasks.add_dependency(
frame_state.surfaces[parent_surface_index.0].render_tasks.unwrap().port,
render_task_id,
@@ -4202,20 +4204,20 @@ impl PicturePrimitive {
supports_snapping,
);

let picture_task = RenderTask::new_picture(
RenderTaskLocation::Dynamic(None, clipped.size),
unclipped.size,
pic_index,
clipped.origin,
uv_rect_kind,
surface_spatial_node_index,
device_pixel_scale,
PrimitiveVisibilityMask::all(),
None,
let render_task_id = frame_state.render_tasks.add().init(
RenderTask::new_picture(
RenderTaskLocation::Dynamic(None, clipped.size),
unclipped.size,
pic_index,
clipped.origin,
uv_rect_kind,
surface_spatial_node_index,
device_pixel_scale,
PrimitiveVisibilityMask::all(),
None,
)
);

let render_task_id = frame_state.render_tasks.add(picture_task);

Some((render_task_id, render_task_id))
}
PictureCompositeMode::SvgFilter(ref primitives, ref filter_datas) => {
@@ -4227,20 +4229,20 @@ impl PicturePrimitive {
true,
);

let picture_task = RenderTask::new_picture(
RenderTaskLocation::Dynamic(None, clipped.size),
unclipped.size,
pic_index,
clipped.origin,
uv_rect_kind,
surface_spatial_node_index,
device_pixel_scale,
PrimitiveVisibilityMask::all(),
None,
let picture_task_id = frame_state.render_tasks.add().init(
RenderTask::new_picture(
RenderTaskLocation::Dynamic(None, clipped.size),
unclipped.size,
pic_index,
clipped.origin,
uv_rect_kind,
surface_spatial_node_index,
device_pixel_scale,
PrimitiveVisibilityMask::all(),
None,
)
);

let picture_task_id = frame_state.render_tasks.add(picture_task);

let filter_task_id = RenderTask::new_svg_filter(
primitives,
filter_datas,
@@ -237,35 +237,24 @@ impl ImageData {
// Create a task to blit from the texture cache to
// a normal transient render task surface. This will
// copy only the sub-rect, if specified.
let cache_to_target_task = if false {
// TODO: figure out if/when this can be used
RenderTask::new_blit_with_padding(
*size,
padding,
BlitSource::Image { key: image_cache_key },
)
} else {
RenderTask::new_scaling_with_padding(
BlitSource::Image { key: image_cache_key },
render_tasks,
target_kind,
*size,
padding,
)
};
let cache_to_target_task_id = render_tasks.add(cache_to_target_task);
// TODO: figure out if/when we can do a blit instead.
let cache_to_target_task_id = RenderTask::new_scaling_with_padding(
BlitSource::Image { key: image_cache_key },
render_tasks,
target_kind,
*size,
padding,
);

// Create a task to blit the rect from the child render
// task above back into the right spot in the persistent
// render target cache.
let target_to_cache_task = RenderTask::new_blit(
render_tasks.add().init(RenderTask::new_blit(
*size,
BlitSource::RenderTask {
task_id: cache_to_target_task_id,
},
);

render_tasks.add(target_to_cache_task)
))
}
));
}
ProTip! Use n and p to navigate between commits in a pull request.
You can’t perform that action at this time.