Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2461)

Unified Diff: cc/trees/layer_tree_host_impl.cc

Issue 935333002: Update from https://crrev.com/316786 (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « cc/trees/layer_tree_host_impl.h ('k') | cc/trees/layer_tree_host_impl_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 672ffe80b30be64a8033a4d6b7d24b884582ac14..3cb285883b6356d4923e75bf3169a4473f108dbe 100644
--- a/cc/trees/layer_tree_host_impl.cc
+++ b/cc/trees/layer_tree_host_impl.cc
@@ -68,7 +68,6 @@
#include "cc/trees/layer_tree_host.h"
#include "cc/trees/layer_tree_host_common.h"
#include "cc/trees/layer_tree_impl.h"
-#include "cc/trees/occlusion_tracker.h"
#include "cc/trees/single_thread_proxy.h"
#include "cc/trees/tree_synchronizer.h"
#include "gpu/command_buffer/client/gles2_interface.h"
@@ -235,8 +234,9 @@ LayerTreeHostImpl::LayerTreeHostImpl(
SetDebugState(settings.initial_debug_state);
// LTHI always has an active tree.
- active_tree_ = LayerTreeImpl::create(this, new SyncedProperty<ScaleGroup>(),
- new SyncedElasticOverscroll);
+ active_tree_ =
+ LayerTreeImpl::create(this, new SyncedProperty<ScaleGroup>(),
+ new SyncedTopControls, new SyncedElasticOverscroll);
TRACE_EVENT_OBJECT_CREATED_WITH_ID(
TRACE_DISABLED_BY_DEFAULT("cc.debug"), "cc::LayerTreeHostImpl", id_);
@@ -295,7 +295,7 @@ void LayerTreeHostImpl::BeginCommit() {
if (!settings_.impl_side_painting && output_surface_)
output_surface_->ForceReclaimResources();
- if (UsePendingTreeForSync())
+ if (settings_.impl_side_painting && !proxy_->CommitToActiveTree())
CreatePendingTree();
}
@@ -548,7 +548,7 @@ void LayerTreeHostImpl::TrackDamageForAllSurfaces(
}
void LayerTreeHostImpl::FrameData::AsValueInto(
- base::debug::TracedValue* value) const {
+ base::trace_event::TracedValue* value) const {
value->SetBoolean("has_no_damage", has_no_damage);
// Quad data can be quite large, so only dump render passes if we select
@@ -588,51 +588,54 @@ DrawMode LayerTreeHostImpl::GetDrawMode() const {
}
}
-static void AppendQuadsForLayer(
- RenderPass* target_render_pass,
- LayerImpl* layer,
- const OcclusionTracker<LayerImpl>& occlusion_tracker,
- AppendQuadsData* append_quads_data) {
- layer->AppendQuads(
- target_render_pass,
- occlusion_tracker.GetCurrentOcclusionForLayer(layer->draw_transform()),
- append_quads_data);
-}
-
static void AppendQuadsForRenderSurfaceLayer(
RenderPass* target_render_pass,
LayerImpl* layer,
const RenderPass* contributing_render_pass,
- const OcclusionTracker<LayerImpl>& occlusion_tracker,
AppendQuadsData* append_quads_data) {
- bool is_replica = false;
- layer->render_surface()->AppendQuads(target_render_pass,
- occlusion_tracker,
- append_quads_data,
- is_replica,
- contributing_render_pass->id);
+ RenderSurfaceImpl* surface = layer->render_surface();
+ const gfx::Transform& draw_transform = surface->draw_transform();
+ const Occlusion& occlusion = surface->occlusion_in_content_space();
+ SkColor debug_border_color = surface->GetDebugBorderColor();
+ float debug_border_width = surface->GetDebugBorderWidth();
+ LayerImpl* mask_layer = layer->mask_layer();
+
+ surface->AppendQuads(target_render_pass, draw_transform, occlusion,
+ debug_border_color, debug_border_width, mask_layer,
+ append_quads_data, contributing_render_pass->id);
// Add replica after the surface so that it appears below the surface.
if (layer->has_replica()) {
- is_replica = true;
- layer->render_surface()->AppendQuads(target_render_pass,
- occlusion_tracker,
- append_quads_data,
- is_replica,
- contributing_render_pass->id);
- }
-}
-
-static void AppendQuadsToFillScreen(
- const gfx::Rect& root_scroll_layer_rect,
- RenderPass* target_render_pass,
- LayerImpl* root_layer,
- SkColor screen_background_color,
- const OcclusionTracker<LayerImpl>& occlusion_tracker) {
+ const gfx::Transform& replica_draw_transform =
+ surface->replica_draw_transform();
+ Occlusion replica_occlusion = occlusion.GetOcclusionWithGivenDrawTransform(
+ surface->replica_draw_transform());
+ SkColor replica_debug_border_color = surface->GetReplicaDebugBorderColor();
+ float replica_debug_border_width = surface->GetReplicaDebugBorderWidth();
+ // TODO(danakj): By using the same RenderSurfaceImpl for both the
+ // content and its reflection, it's currently not possible to apply a
+ // separate mask to the reflection layer or correctly handle opacity in
+ // reflections (opacity must be applied after drawing both the layer and its
+ // reflection). The solution is to introduce yet another RenderSurfaceImpl
+ // to draw the layer and its reflection in. For now we only apply a separate
+ // reflection mask if the contents don't have a mask of their own.
+ LayerImpl* replica_mask_layer =
+ mask_layer ? mask_layer : layer->replica_layer()->mask_layer();
+
+ surface->AppendQuads(target_render_pass, replica_draw_transform,
+ replica_occlusion, replica_debug_border_color,
+ replica_debug_border_width, replica_mask_layer,
+ append_quads_data, contributing_render_pass->id);
+ }
+}
+
+static void AppendQuadsToFillScreen(const gfx::Rect& root_scroll_layer_rect,
+ RenderPass* target_render_pass,
+ LayerImpl* root_layer,
+ SkColor screen_background_color,
+ const Region& fill_region) {
if (!root_layer || !SkColorGetA(screen_background_color))
return;
-
- Region fill_region = occlusion_tracker.ComputeVisibleRegionInScreen();
if (fill_region.IsEmpty())
return;
@@ -736,23 +739,14 @@ DrawResult LayerTreeHostImpl::CalculateRenderPasses(
root_pass->damage_rect = root_pass->output_rect;
}
- OcclusionTracker<LayerImpl> occlusion_tracker(
- active_tree_->root_layer()->render_surface()->content_rect());
- occlusion_tracker.set_minimum_tracking_size(
- settings_.minimum_occlusion_tracking_size);
-
- if (debug_state_.show_occluding_rects) {
- occlusion_tracker.set_occluding_screen_space_rects_container(
- &frame->occluding_screen_space_rects);
- }
- if (debug_state_.show_non_occluding_rects) {
- occlusion_tracker.set_non_occluding_screen_space_rects_container(
- &frame->non_occluding_screen_space_rects);
- }
-
- // Add quads to the Render passes in front-to-back order to allow for testing
- // occlusion and performing culling during the tree walk.
- typedef LayerIterator<LayerImpl> LayerIteratorType;
+ // Grab this region here before iterating layers. Taking copy requests from
+ // the layers while constructing the render passes will dirty the render
+ // surface layer list and this unoccluded region, flipping the dirty bit to
+ // true, and making us able to query for it without doing
+ // UpdateDrawProperties again. The value inside the Region is not actually
+ // changed until UpdateDrawProperties happens, so a reference to it is safe.
+ const Region& unoccluded_screen_space_region =
+ active_tree_->UnoccludedScreenSpaceRegion();
// Typically when we are missing a texture and use a checkerboard quad, we
// still draw the frame. However when the layer being checkerboarded is moving
@@ -770,19 +764,15 @@ DrawResult LayerTreeHostImpl::CalculateRenderPasses(
int num_missing_tiles = 0;
int num_incomplete_tiles = 0;
- LayerIteratorType end =
- LayerIteratorType::End(frame->render_surface_layer_list);
- for (LayerIteratorType it =
- LayerIteratorType::Begin(frame->render_surface_layer_list);
- it != end;
- ++it) {
+ auto end = LayerIterator<LayerImpl>::End(frame->render_surface_layer_list);
+ for (auto it =
+ LayerIterator<LayerImpl>::Begin(frame->render_surface_layer_list);
+ it != end; ++it) {
RenderPassId target_render_pass_id =
it.target_render_surface_layer()->render_surface()->GetRenderPassId();
RenderPass* target_render_pass =
frame->render_passes_by_id[target_render_pass_id];
- occlusion_tracker.EnterLayer(it);
-
AppendQuadsData append_quads_data;
if (it.represents_target_render_surface()) {
@@ -800,13 +790,12 @@ DrawResult LayerTreeHostImpl::CalculateRenderPasses(
AppendQuadsForRenderSurfaceLayer(target_render_pass,
*it,
contributing_render_pass,
- occlusion_tracker,
&append_quads_data);
} else if (it.represents_itself() &&
!it->visible_content_rect().IsEmpty()) {
bool occluded =
- occlusion_tracker.GetCurrentOcclusionForLayer(it->draw_transform())
- .IsOccluded(it->visible_content_rect());
+ it->draw_properties().occlusion_in_content_space.IsOccluded(
+ it->visible_content_rect());
if (!occluded && it->WillDraw(draw_mode, resource_provider_.get())) {
DCHECK_EQ(active_tree_, it->layer_tree_impl());
@@ -820,20 +809,14 @@ DrawResult LayerTreeHostImpl::CalculateRenderPasses(
RenderPass* render_pass =
frame->render_passes_by_id[contributing_render_pass_id];
- AppendQuadsForLayer(render_pass,
- *it,
- occlusion_tracker,
- &append_quads_data);
+ it->AppendQuads(render_pass, &append_quads_data);
contributing_render_pass_id =
it->NextContributingRenderPassId(contributing_render_pass_id);
}
}
- AppendQuadsForLayer(target_render_pass,
- *it,
- occlusion_tracker,
- &append_quads_data);
+ it->AppendQuads(target_render_pass, &append_quads_data);
// For layers that represent themselves, add composite frame timing
// requests if the visible rect intersects the requested rect.
@@ -872,8 +855,6 @@ DrawResult LayerTreeHostImpl::CalculateRenderPasses(
if (RequiresHighResToDraw())
draw_result = DRAW_ABORTED_MISSING_HIGH_RES_CONTENT;
}
-
- occlusion_tracker.LeaveLayer(it);
}
if (have_copy_request ||
@@ -894,10 +875,8 @@ DrawResult LayerTreeHostImpl::CalculateRenderPasses(
frame->render_passes.back()->has_transparent_background = false;
AppendQuadsToFillScreen(
active_tree_->RootScrollLayerDeviceViewportBounds(),
- frame->render_passes.back(),
- active_tree_->root_layer(),
- active_tree_->background_color(),
- occlusion_tracker);
+ frame->render_passes.back(), active_tree_->root_layer(),
+ active_tree_->background_color(), unoccluded_screen_space_region);
}
RemoveRenderPasses(CullRenderPassesWithNoQuads(), frame);
@@ -1113,8 +1092,10 @@ void LayerTreeHostImpl::BlockNotifyReadyToActivateForTesting(bool block) {
void LayerTreeHostImpl::ResetTreesForTesting() {
if (active_tree_)
active_tree_->DetachLayerTree();
- active_tree_ = LayerTreeImpl::create(this, active_tree()->page_scale_factor(),
- active_tree()->elastic_overscroll());
+ active_tree_ =
+ LayerTreeImpl::create(this, active_tree()->page_scale_factor(),
+ active_tree()->top_controls_shown_ratio(),
+ active_tree()->elastic_overscroll());
if (pending_tree_)
pending_tree_->DetachLayerTree();
pending_tree_ = nullptr;
@@ -1206,32 +1187,31 @@ void LayerTreeHostImpl::GetPictureLayerImplPairs(
std::vector<PictureLayerImpl::Pair>* layer_pairs,
bool need_valid_tile_priorities) const {
DCHECK(layer_pairs->empty());
- for (std::vector<PictureLayerImpl*>::const_iterator it =
- picture_layers_.begin();
- it != picture_layers_.end();
- ++it) {
- PictureLayerImpl* layer = *it;
- if (!layer->IsOnActiveOrPendingTree() ||
- (need_valid_tile_priorities && !layer->HasValidTilePriorities()))
+ for (auto& layer : active_tree_->picture_layers()) {
+ if (need_valid_tile_priorities && !layer->HasValidTilePriorities())
continue;
-
PictureLayerImpl* twin_layer = layer->GetPendingOrActiveTwinLayer();
-
// Ignore the twin layer when tile priorities are invalid.
if (need_valid_tile_priorities && twin_layer &&
- !twin_layer->HasValidTilePriorities())
- twin_layer = NULL;
-
- // If the current tree is ACTIVE_TREE, then always generate a layer_pair.
- // If current tree is PENDING_TREE, then only generate a layer_pair if
- // there is no twin layer.
- if (layer->GetTree() == ACTIVE_TREE) {
- DCHECK_IMPLIES(twin_layer, twin_layer->GetTree() == PENDING_TREE);
- layer_pairs->push_back(PictureLayerImpl::Pair(layer, twin_layer));
- } else if (!twin_layer) {
- DCHECK(layer->GetTree() == PENDING_TREE);
- layer_pairs->push_back(PictureLayerImpl::Pair(NULL, layer));
+ !twin_layer->HasValidTilePriorities()) {
+ twin_layer = nullptr;
+ }
+ layer_pairs->push_back(PictureLayerImpl::Pair(layer, twin_layer));
+ }
+
+ if (pending_tree_) {
+ for (auto& layer : pending_tree_->picture_layers()) {
+ if (need_valid_tile_priorities && !layer->HasValidTilePriorities())
+ continue;
+ if (PictureLayerImpl* twin_layer = layer->GetPendingOrActiveTwinLayer()) {
+ if (!need_valid_tile_priorities ||
+ twin_layer->HasValidTilePriorities()) {
+ // Already captured from the active tree.
+ continue;
+ }
+ }
+ layer_pairs->push_back(PictureLayerImpl::Pair(nullptr, layer));
}
}
}
@@ -1265,11 +1245,6 @@ void LayerTreeHostImpl::SetIsLikelyToRequireADraw(
is_likely_to_require_a_draw_ = is_likely_to_require_a_draw;
}
-const std::vector<PictureLayerImpl*>& LayerTreeHostImpl::GetPictureLayers()
- const {
- return picture_layers_;
-}
-
void LayerTreeHostImpl::NotifyReadyToActivate() {
client_->NotifyReadyToActivate();
}
@@ -1452,6 +1427,16 @@ CompositorFrameMetadata LayerTreeHostImpl::MakeCompositorFrameMetadata() const {
active_tree_->GetViewportSelection(&metadata.selection_start,
&metadata.selection_end);
+ LayerImpl* root_layer_for_overflow = OuterViewportScrollLayer()
+ ? OuterViewportScrollLayer()
+ : InnerViewportScrollLayer();
+ if (root_layer_for_overflow) {
+ metadata.root_overflow_x_hidden =
+ !root_layer_for_overflow->user_scrollable_horizontal();
+ metadata.root_overflow_y_hidden =
+ !root_layer_for_overflow->user_scrollable_vertical();
+ }
+
if (!InnerViewportScrollLayer())
return metadata;
@@ -1499,8 +1484,6 @@ void LayerTreeHostImpl::DrawLayers(FrameData* frame,
active_tree_->root_layer(),
active_tree_->hud_layer(),
*frame->render_surface_layer_list,
- frame->occluding_screen_space_rects,
- frame->non_occluding_screen_space_rects,
debug_state_);
}
@@ -1678,9 +1661,9 @@ void LayerTreeHostImpl::UpdateViewportContainerSizes() {
active_tree_->top_controls_shrink_blink_size()
? active_tree_->top_controls_height()
: 0.f;
- inner_container->SetBoundsDelta(
- gfx::Vector2dF(0, top_controls_layout_height -
- active_tree_->total_top_controls_content_offset()));
+ inner_container->SetBoundsDelta(gfx::Vector2dF(
+ 0,
+ top_controls_layout_height - top_controls_manager_->ContentTopOffset()));
if (!outer_container || outer_container->BoundsForScrolling().IsEmpty())
return;
@@ -1768,16 +1751,9 @@ void LayerTreeHostImpl::CreatePendingTree() {
else
pending_tree_ =
LayerTreeImpl::create(this, active_tree()->page_scale_factor(),
+ active_tree()->top_controls_shown_ratio(),
active_tree()->elastic_overscroll());
- // Update the delta from the active tree, which may have
- // adjusted its delta prior to the pending tree being created.
- DCHECK_EQ(0.f, pending_tree_->sent_top_controls_delta());
- pending_tree_->set_top_controls_delta(
- active_tree_->top_controls_delta() -
- active_tree_->sent_top_controls_delta());
- pending_tree_->set_top_controls_height(active_tree_->top_controls_height());
-
client_->OnCanDrawStateChanged(CanDraw());
TRACE_EVENT_ASYNC_BEGIN0("cc", "PendingTree:waiting", pending_tree_.get());
}
@@ -1812,14 +1788,6 @@ void LayerTreeHostImpl::ActivateSyncTree() {
active_tree_->SetRootLayerScrollOffsetDelegate(
root_layer_scroll_offset_delegate_);
- if (top_controls_manager_) {
- top_controls_manager_->SetTopControlsHeight(
- active_tree_->top_controls_height());
- top_controls_manager_->SetControlsTopOffset(
- active_tree_->total_top_controls_content_offset() -
- active_tree_->top_controls_height());
- }
-
UpdateViewportContainerSizes();
} else {
active_tree_->ProcessUIResourceRequestQueue();
@@ -1831,7 +1799,7 @@ void LayerTreeHostImpl::ActivateSyncTree() {
client_->RenewTreePriority();
// If we have any picture layers, then by activating we also modified tile
// priorities.
- if (!picture_layers_.empty())
+ if (!active_tree_->picture_layers().empty())
DidModifyTilePriorities();
}
@@ -2039,7 +2007,7 @@ void LayerTreeHostImpl::CreateResourceAndTileTaskWorkerPool(
*tile_task_worker_pool = GpuTileTaskWorkerPool::Create(
task_runner, TileTaskWorkerPool::GetTaskGraphRunner(),
- resource_provider_.get());
+ static_cast<GpuRasterizer*>(rasterizer_.get()));
return;
}
@@ -2104,12 +2072,6 @@ void LayerTreeHostImpl::DestroyTileManager() {
single_thread_synchronous_task_graph_runner_ = nullptr;
}
-bool LayerTreeHostImpl::UsePendingTreeForSync() const {
- // In impl-side painting, synchronize to the pending tree so that it has
- // time to raster before being displayed.
- return settings_.impl_side_painting;
-}
-
bool LayerTreeHostImpl::IsSynchronousSingleThreaded() const {
return !proxy_->HasImplThread() && !settings_.single_thread_proxy_scheduler;
}
@@ -2298,15 +2260,17 @@ void LayerTreeHostImpl::DidChangeTopControlsPosition() {
SetFullRootLayerDamage();
}
-void LayerTreeHostImpl::SetControlsTopOffset(float offset) {
- float current_top_offset = active_tree_->top_controls_content_offset() -
- active_tree_->top_controls_height();
- active_tree_->set_top_controls_delta(offset - current_top_offset);
+float LayerTreeHostImpl::TopControlsHeight() const {
+ return active_tree_->top_controls_height();
}
-float LayerTreeHostImpl::ControlsTopOffset() const {
- return active_tree_->total_top_controls_content_offset() -
- active_tree_->top_controls_height();
+void LayerTreeHostImpl::SetCurrentTopControlsShownRatio(float ratio) {
+ if (active_tree_->SetCurrentTopControlsShownRatio(ratio))
+ DidChangeTopControlsPosition();
+}
+
+float LayerTreeHostImpl::CurrentTopControlsShownRatio() const {
+ return active_tree_->CurrentTopControlsShownRatio();
}
void LayerTreeHostImpl::BindToClient(InputHandlerClient* client) {
@@ -3059,11 +3023,11 @@ scoped_ptr<ScrollAndScaleSet> LayerTreeHostImpl::ProcessScrollDeltas() {
CollectScrollDeltas(scroll_info.get(), active_tree_->root_layer());
scroll_info->page_scale_delta =
active_tree_->page_scale_factor()->PullDeltaForMainThread();
+ scroll_info->top_controls_delta =
+ active_tree()->top_controls_shown_ratio()->PullDeltaForMainThread();
scroll_info->elastic_overscroll_delta =
active_tree_->elastic_overscroll()->PullDeltaForMainThread();
scroll_info->swap_promises.swap(swap_promises_for_main_thread_scroll_update_);
- scroll_info->top_controls_delta = active_tree()->top_controls_delta();
- active_tree_->set_sent_top_controls_delta(scroll_info->top_controls_delta);
return scroll_info.Pass();
}
@@ -3282,26 +3246,27 @@ BeginFrameArgs LayerTreeHostImpl::CurrentBeginFrameArgs() const {
BeginFrameArgs::DefaultInterval(), BeginFrameArgs::NORMAL);
}
-scoped_refptr<base::debug::ConvertableToTraceFormat>
+scoped_refptr<base::trace_event::ConvertableToTraceFormat>
LayerTreeHostImpl::AsValue() const {
return AsValueWithFrame(NULL);
}
-scoped_refptr<base::debug::ConvertableToTraceFormat>
+scoped_refptr<base::trace_event::ConvertableToTraceFormat>
LayerTreeHostImpl::AsValueWithFrame(FrameData* frame) const {
- scoped_refptr<base::debug::TracedValue> state =
- new base::debug::TracedValue();
+ scoped_refptr<base::trace_event::TracedValue> state =
+ new base::trace_event::TracedValue();
AsValueWithFrameInto(frame, state.get());
return state;
}
-void LayerTreeHostImpl::AsValueInto(base::debug::TracedValue* value) const {
+void LayerTreeHostImpl::AsValueInto(
+ base::trace_event::TracedValue* value) const {
return AsValueWithFrameInto(NULL, value);
}
void LayerTreeHostImpl::AsValueWithFrameInto(
FrameData* frame,
- base::debug::TracedValue* state) const {
+ base::trace_event::TracedValue* state) const {
if (this->pending_tree_) {
state->BeginDictionary("activation_state");
ActivationStateAsValueInto(state);
@@ -3347,16 +3312,16 @@ void LayerTreeHostImpl::AsValueWithFrameInto(
}
}
-scoped_refptr<base::debug::ConvertableToTraceFormat>
+scoped_refptr<base::trace_event::ConvertableToTraceFormat>
LayerTreeHostImpl::ActivationStateAsValue() const {
- scoped_refptr<base::debug::TracedValue> state =
- new base::debug::TracedValue();
+ scoped_refptr<base::trace_event::TracedValue> state =
+ new base::trace_event::TracedValue();
ActivationStateAsValueInto(state.get());
return state;
}
void LayerTreeHostImpl::ActivationStateAsValueInto(
- base::debug::TracedValue* state) const {
+ base::trace_event::TracedValue* state) const {
TracedValue::SetIDRef(this, state, "lthi");
if (tile_manager_) {
state->BeginDictionary("tile_manager");
@@ -3509,17 +3474,4 @@ void LayerTreeHostImpl::NotifySwapPromiseMonitorsOfForwardingToMainThread() {
(*it)->OnForwardScrollUpdateToMainThreadOnImpl();
}
-void LayerTreeHostImpl::RegisterPictureLayerImpl(PictureLayerImpl* layer) {
- DCHECK(std::find(picture_layers_.begin(), picture_layers_.end(), layer) ==
- picture_layers_.end());
- picture_layers_.push_back(layer);
-}
-
-void LayerTreeHostImpl::UnregisterPictureLayerImpl(PictureLayerImpl* layer) {
- std::vector<PictureLayerImpl*>::iterator it =
- std::find(picture_layers_.begin(), picture_layers_.end(), layer);
- DCHECK(it != picture_layers_.end());
- picture_layers_.erase(it);
-}
-
} // namespace cc
« no previous file with comments | « cc/trees/layer_tree_host_impl.h ('k') | cc/trees/layer_tree_host_impl_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698