Index: cc/trees/layer_tree_host_impl.cc |
diff --git a/cc/trees/layer_tree_host_impl.cc b/cc/trees/layer_tree_host_impl.cc |
index 3d31e8ef5424cf76033958ffc1d32b581b1d02b0..398ef81895ae08bc199b823c30c9bd27861a3c29 100644 |
--- a/cc/trees/layer_tree_host_impl.cc |
+++ b/cc/trees/layer_tree_host_impl.cc |
@@ -9,11 +9,11 @@ |
#include "base/basictypes.h" |
#include "base/containers/hash_tables.h" |
-#include "base/debug/trace_event_argument.h" |
#include "base/json/json_writer.h" |
#include "base/metrics/histogram.h" |
#include "base/stl_util.h" |
#include "base/strings/stringprintf.h" |
+#include "base/trace_event/trace_event_argument.h" |
#include "cc/animation/animation_id_provider.h" |
#include "cc/animation/scroll_offset_animation_curve.h" |
#include "cc/animation/scrollbar_animation_controller.h" |
@@ -88,10 +88,10 @@ class ViewportAnchor { |
ViewportAnchor(LayerImpl* inner_scroll, LayerImpl* outer_scroll) |
: inner_(inner_scroll), |
outer_(outer_scroll) { |
- viewport_in_content_coordinates_ = inner_->TotalScrollOffset(); |
+ viewport_in_content_coordinates_ = inner_->CurrentScrollOffset(); |
if (outer_) |
- viewport_in_content_coordinates_ += outer_->TotalScrollOffset(); |
+ viewport_in_content_coordinates_ += outer_->CurrentScrollOffset(); |
} |
void ResetViewportToAnchoredPosition() { |
@@ -100,8 +100,8 @@ class ViewportAnchor { |
inner_->ClampScrollToMaxScrollOffset(); |
outer_->ClampScrollToMaxScrollOffset(); |
- gfx::ScrollOffset viewport_location = inner_->TotalScrollOffset() + |
- outer_->TotalScrollOffset(); |
+ gfx::ScrollOffset viewport_location = |
+ inner_->CurrentScrollOffset() + outer_->CurrentScrollOffset(); |
gfx::Vector2dF delta = |
viewport_in_content_coordinates_.DeltaFrom(viewport_location); |
@@ -229,7 +229,7 @@ LayerTreeHostImpl::LayerTreeHostImpl( |
gpu_memory_buffer_manager_(gpu_memory_buffer_manager), |
id_(id), |
requires_high_res_to_draw_(false), |
- required_for_draw_tile_is_top_of_raster_queue_(false) { |
+ is_likely_to_require_a_draw_(false) { |
DCHECK(proxy_->IsImplThread()); |
DidVisibilityChange(this, visible_); |
animation_registrar_->set_supports_scroll_animations( |
@@ -305,8 +305,6 @@ void LayerTreeHostImpl::BeginCommit() { |
void LayerTreeHostImpl::CommitComplete() { |
TRACE_EVENT0("cc", "LayerTreeHostImpl::CommitComplete"); |
- if (pending_tree_) |
- pending_tree_->ApplyScrollDeltasSinceBeginMainFrame(); |
sync_tree()->set_needs_update_draw_properties(); |
if (settings_.impl_side_painting) { |
@@ -459,6 +457,18 @@ bool LayerTreeHostImpl::IsCurrentlyScrollingLayerAt( |
return CurrentlyScrollingLayer() == scrolling_layer_impl; |
} |
+bool LayerTreeHostImpl::HaveWheelEventHandlersAt( |
+ const gfx::Point& viewport_point) { |
+ gfx::PointF device_viewport_point = |
+ gfx::ScalePoint(viewport_point, device_scale_factor_); |
+ |
+ LayerImpl* layer_impl = |
+ active_tree_->FindLayerWithWheelHandlerThatIsHitByPoint( |
+ device_viewport_point); |
+ |
+ return layer_impl != NULL; |
+} |
+ |
bool LayerTreeHostImpl::HaveTouchEventHandlersAt( |
const gfx::Point& viewport_point) { |
@@ -752,7 +762,7 @@ DrawResult LayerTreeHostImpl::CalculateRenderPasses( |
occlusion_tracker.EnterLayer(it); |
- AppendQuadsData append_quads_data(target_render_pass_id); |
+ AppendQuadsData append_quads_data; |
if (it.represents_target_render_surface()) { |
if (it->HasCopyRequest()) { |
@@ -789,7 +799,6 @@ DrawResult LayerTreeHostImpl::CalculateRenderPasses( |
RenderPass* render_pass = |
frame->render_passes_by_id[contributing_render_pass_id]; |
- AppendQuadsData append_quads_data(render_pass->id); |
AppendQuadsForLayer(render_pass, |
*it, |
occlusion_tracker, |
@@ -1200,23 +1209,8 @@ scoped_ptr<RasterTilePriorityQueue> LayerTreeHostImpl::BuildRasterQueue( |
TRACE_EVENT0("cc", "LayerTreeHostImpl::BuildRasterQueue"); |
picture_layer_pairs_.clear(); |
GetPictureLayerImplPairs(&picture_layer_pairs_, true); |
- scoped_ptr<RasterTilePriorityQueue> queue(RasterTilePriorityQueue::Create( |
- picture_layer_pairs_, tree_priority, type)); |
- |
- if (!queue->IsEmpty()) { |
- // Only checking the Top() tile here isn't a definite answer that there is |
- // or isn't something required for draw in this raster queue. It's just a |
- // heuristic to let us hit the common case and proactively tell the |
- // scheduler that we expect to draw within each vsync until we get all the |
- // tiles ready to draw. If we happen to miss a required for draw tile here, |
- // then we will miss telling the scheduler each frame that we intend to draw |
- // so it may make worse scheduling decisions. |
- required_for_draw_tile_is_top_of_raster_queue_ = |
- queue->Top()->required_for_draw(); |
- } else { |
- required_for_draw_tile_is_top_of_raster_queue_ = false; |
- } |
- return queue; |
+ return RasterTilePriorityQueue::Create(picture_layer_pairs_, tree_priority, |
+ type); |
} |
scoped_ptr<EvictionTilePriorityQueue> LayerTreeHostImpl::BuildEvictionQueue( |
@@ -1229,6 +1223,15 @@ scoped_ptr<EvictionTilePriorityQueue> LayerTreeHostImpl::BuildEvictionQueue( |
return queue; |
} |
+void LayerTreeHostImpl::SetIsLikelyToRequireADraw( |
+ bool is_likely_to_require_a_draw) { |
+ // Proactively tell the scheduler that we expect to draw within each vsync |
+ // until we get all the tiles ready to draw. If we happen to miss a required |
+ // for draw tile here, then we will miss telling the scheduler each frame that |
+ // we intend to draw so it may make worse scheduling decisions. |
+ is_likely_to_require_a_draw_ = is_likely_to_require_a_draw; |
+} |
+ |
const std::vector<PictureLayerImpl*>& LayerTreeHostImpl::GetPictureLayers() |
const { |
return picture_layers_; |
@@ -1242,7 +1245,7 @@ void LayerTreeHostImpl::NotifyReadyToDraw() { |
// Tiles that are ready will cause NotifyTileStateChanged() to be called so we |
// don't need to schedule a draw here. Just stop WillBeginImplFrame() from |
// causing optimistic requests to draw a frame. |
- required_for_draw_tile_is_top_of_raster_queue_ = false; |
+ is_likely_to_require_a_draw_ = false; |
client_->NotifyReadyToDraw(); |
} |
@@ -1612,10 +1615,10 @@ void LayerTreeHostImpl::WillBeginImplFrame(const BeginFrameArgs& args) { |
// Cache the begin impl frame interval |
begin_impl_frame_interval_ = args.interval; |
- if (required_for_draw_tile_is_top_of_raster_queue_) { |
- // Optimistically schedule a draw, as a tile required for draw is at the top |
- // of the current raster queue. This will let us expect the tile to complete |
- // and draw it within the impl frame we are beginning now. |
+ if (is_likely_to_require_a_draw_) { |
+ // Optimistically schedule a draw. This will let us expect the tile manager |
+ // to complete its work so that we can draw new tiles within the impl frame |
+ // we are beginning now. |
SetNeedsRedraw(); |
} |
} |
@@ -1956,7 +1959,8 @@ scoped_ptr<Rasterizer> LayerTreeHostImpl::CreateRasterizer() { |
ContextProvider* context_provider = output_surface_->context_provider(); |
if (use_gpu_rasterization_ && context_provider) { |
return GpuRasterizer::Create(context_provider, resource_provider_.get(), |
- settings_.use_distance_field_text, false); |
+ settings_.use_distance_field_text, false, |
+ settings_.gpu_rasterization_msaa_sample_count); |
} |
return SoftwareRasterizer::Create(); |
} |
@@ -2401,7 +2405,7 @@ InputHandler::ScrollStatus LayerTreeHostImpl::ScrollAnimated( |
if (!layer_impl->scrollable()) |
continue; |
- gfx::ScrollOffset current_offset = layer_impl->TotalScrollOffset(); |
+ gfx::ScrollOffset current_offset = layer_impl->CurrentScrollOffset(); |
gfx::ScrollOffset target_offset = |
ScrollOffsetWithDelta(current_offset, pending_delta); |
target_offset.SetToMax(gfx::ScrollOffset()); |
@@ -2491,14 +2495,15 @@ gfx::Vector2dF LayerTreeHostImpl::ScrollLayerWithViewportSpaceDelta( |
local_end_point.Scale(width_scale, height_scale); |
// Apply the scroll delta. |
- gfx::Vector2dF previous_delta = layer_impl->ScrollDelta(); |
+ gfx::ScrollOffset previous_offset = layer_impl->CurrentScrollOffset(); |
layer_impl->ScrollBy(local_end_point - local_start_point); |
+ gfx::ScrollOffset scrolled = |
+ layer_impl->CurrentScrollOffset() - previous_offset; |
// Get the end point in the layer's content space so we can apply its |
// ScreenSpaceTransform. |
- gfx::PointF actual_local_end_point = local_start_point + |
- layer_impl->ScrollDelta() - |
- previous_delta; |
+ gfx::PointF actual_local_end_point = |
+ local_start_point + gfx::Vector2dF(scrolled.x(), scrolled.y()); |
gfx::PointF actual_local_content_end_point = |
gfx::ScalePoint(actual_local_end_point, |
1.f / width_scale, |
@@ -2522,11 +2527,13 @@ static gfx::Vector2dF ScrollLayerWithLocalDelta( |
LayerImpl* layer_impl, |
const gfx::Vector2dF& local_delta, |
float page_scale_factor) { |
- gfx::Vector2dF previous_delta(layer_impl->ScrollDelta()); |
+ gfx::ScrollOffset previous_offset = layer_impl->CurrentScrollOffset(); |
gfx::Vector2dF delta = local_delta; |
delta.Scale(1.f / page_scale_factor); |
layer_impl->ScrollBy(delta); |
- return layer_impl->ScrollDelta() - previous_delta; |
+ gfx::ScrollOffset scrolled = |
+ layer_impl->CurrentScrollOffset() - previous_offset; |
+ return gfx::Vector2dF(scrolled.x(), scrolled.y()); |
} |
bool LayerTreeHostImpl::ShouldTopControlsConsumeScroll( |
@@ -2976,14 +2983,13 @@ static void CollectScrollDeltas(ScrollAndScaleSet* scroll_info, |
if (!layer_impl) |
return; |
- gfx::Vector2d scroll_delta = |
- gfx::ToFlooredVector2d(layer_impl->ScrollDelta()); |
+ gfx::ScrollOffset scroll_delta = layer_impl->PullDeltaForMainThread(); |
+ |
if (!scroll_delta.IsZero()) { |
LayerTreeHostCommon::ScrollUpdateInfo scroll; |
scroll.layer_id = layer_impl->id(); |
- scroll.scroll_delta = scroll_delta; |
+ scroll.scroll_delta = gfx::Vector2d(scroll_delta.x(), scroll_delta.y()); |
scroll_info->scrolls.push_back(scroll); |
- layer_impl->SetSentScrollDelta(scroll_delta); |
} |
for (size_t i = 0; i < layer_impl->children().size(); ++i) |