| 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 5e30beafb92ae0040e07dffa71bd7357cde2f3db..a89c0551b82c514679af63974362ef07310d08fd 100644
|
| --- a/cc/trees/layer_tree_host_impl.cc
|
| +++ b/cc/trees/layer_tree_host_impl.cc
|
| @@ -50,9 +50,9 @@
|
| #include "cc/layers/scrollbar_layer_impl_base.h"
|
| #include "cc/layers/surface_layer_impl.h"
|
| #include "cc/layers/viewport.h"
|
| +#include "cc/output/compositor_frame.h"
|
| #include "cc/output/compositor_frame_metadata.h"
|
| #include "cc/output/copy_output_request.h"
|
| -#include "cc/output/delegating_renderer.h"
|
| #include "cc/output/texture_mailbox_deleter.h"
|
| #include "cc/quads/render_pass_draw_quad.h"
|
| #include "cc/quads/shared_quad_state.h"
|
| @@ -277,7 +277,6 @@ LayerTreeHostImpl::~LayerTreeHostImpl() {
|
| // It is released before shutdown.
|
| DCHECK(!output_surface_);
|
|
|
| - DCHECK(!renderer_);
|
| DCHECK(!resource_provider_);
|
| DCHECK(!resource_pool_);
|
| DCHECK(!tile_task_manager_);
|
| @@ -394,15 +393,12 @@ bool LayerTreeHostImpl::CanDraw() const {
|
| // client_->OnCanDrawStateChanged in the proper places and update the
|
| // NotifyIfCanDrawChanged test.
|
|
|
| - if (!renderer_) {
|
| - TRACE_EVENT_INSTANT0("cc", "LayerTreeHostImpl::CanDraw no renderer",
|
| + if (!output_surface_) {
|
| + TRACE_EVENT_INSTANT0("cc", "LayerTreeHostImpl::CanDraw no output surface",
|
| TRACE_EVENT_SCOPE_THREAD);
|
| return false;
|
| }
|
|
|
| - // Must have an OutputSurface if |renderer_| is not NULL.
|
| - DCHECK(output_surface_);
|
| -
|
| // TODO(boliu): Make draws without layers work and move this below
|
| // |resourceless_software_draw_| check. Tracked in crbug.com/264967.
|
| if (active_tree_->LayerListIsEmpty()) {
|
| @@ -1383,6 +1379,8 @@ void LayerTreeHostImpl::NotifyTileStateChanged(const Tile* tile) {
|
| }
|
|
|
| void LayerTreeHostImpl::SetMemoryPolicy(const ManagedMemoryPolicy& policy) {
|
| + DCHECK(task_runner_provider_->IsImplThread());
|
| +
|
| SetManagedMemoryPolicy(policy);
|
|
|
| // This is short term solution to synchronously drop tile resources when
|
| @@ -1415,22 +1413,13 @@ void LayerTreeHostImpl::SetManagedMemoryPolicy(
|
| return;
|
|
|
| ManagedMemoryPolicy old_policy = ActualManagedMemoryPolicy();
|
| -
|
| cached_managed_memory_policy_ = policy;
|
| ManagedMemoryPolicy actual_policy = ActualManagedMemoryPolicy();
|
|
|
| if (old_policy == actual_policy)
|
| return;
|
|
|
| - if (!task_runner_provider_->HasImplThread()) {
|
| - // In single-thread mode, this can be called on the main thread by
|
| - // GLRenderer::OnMemoryAllocationChanged.
|
| - DebugScopedSetImplThread impl_thread(task_runner_provider_);
|
| - UpdateTileManagerMemoryPolicy(actual_policy);
|
| - } else {
|
| - DCHECK(task_runner_provider_->IsImplThread());
|
| - UpdateTileManagerMemoryPolicy(actual_policy);
|
| - }
|
| + UpdateTileManagerMemoryPolicy(actual_policy);
|
|
|
| // If there is already enough memory to draw everything imaginable and the
|
| // new memory limit does not change this, then do not re-commit. Don't bother
|
| @@ -1698,7 +1687,23 @@ bool LayerTreeHostImpl::DrawLayers(FrameData* frame) {
|
| }
|
| }
|
|
|
| - renderer_->DrawFrame(std::move(metadata), std::move(frame->render_passes));
|
| + // Collect all resource ids in the render passes into a single array.
|
| + ResourceProvider::ResourceIdArray resources;
|
| + for (const auto& render_pass : frame->render_passes) {
|
| + for (auto* quad : render_pass->quad_list) {
|
| + for (ResourceId resource_id : quad->resources)
|
| + resources.push_back(resource_id);
|
| + }
|
| + }
|
| +
|
| + auto data = base::MakeUnique<DelegatedFrameData>();
|
| + resource_provider_->PrepareSendToParent(resources, &data->resource_list);
|
| + data->render_pass_list = std::move(frame->render_passes);
|
| +
|
| + CompositorFrame compositor_frame;
|
| + compositor_frame.metadata = std::move(metadata);
|
| + compositor_frame.delegated_frame_data = std::move(data);
|
| + output_surface_->SwapBuffers(std::move(compositor_frame));
|
|
|
| // The next frame should start by assuming nothing has changed, and changes
|
| // are noted as they occur.
|
| @@ -2125,24 +2130,6 @@ void LayerTreeHostImpl::RecreateTreeResources() {
|
| recycle_tree_->RecreateResources();
|
| }
|
|
|
| -void LayerTreeHostImpl::CreateAndSetRenderer() {
|
| - DCHECK(!renderer_);
|
| - DCHECK(output_surface_);
|
| - DCHECK(resource_provider_);
|
| -
|
| - DCHECK(output_surface_->capabilities().delegated_rendering);
|
| - renderer_ = base::MakeUnique<DelegatingRenderer>(output_surface_,
|
| - resource_provider_.get());
|
| - SetFullViewportDamage();
|
| -
|
| - // See note in LayerTreeImpl::UpdateDrawProperties. Renderer needs to be
|
| - // initialized to get max texture size. Also, after releasing resources,
|
| - // trees need another update to generate new ones.
|
| - active_tree_->set_needs_update_draw_properties();
|
| - if (pending_tree_)
|
| - pending_tree_->set_needs_update_draw_properties();
|
| -}
|
| -
|
| void LayerTreeHostImpl::CreateTileManagerResources() {
|
| CreateResourceAndRasterBufferProvider(&raster_buffer_provider_,
|
| &resource_pool_);
|
| @@ -2287,8 +2274,7 @@ void LayerTreeHostImpl::ReleaseOutputSurface() {
|
| // before we destroy the old resource provider.
|
| ReleaseTreeResources();
|
|
|
| - // Note: order is important here.
|
| - renderer_ = nullptr;
|
| + // Note: ui resource cleanup uses the |resource_provider_|.
|
| CleanUpTileManagerAndUIResources();
|
| resource_provider_ = nullptr;
|
|
|
| @@ -2313,6 +2299,7 @@ void LayerTreeHostImpl::ReleaseOutputSurface() {
|
| }
|
|
|
| bool LayerTreeHostImpl::InitializeRenderer(OutputSurface* output_surface) {
|
| + DCHECK(output_surface->capabilities().delegated_rendering);
|
| TRACE_EVENT0("cc", "LayerTreeHostImpl::InitializeRenderer");
|
|
|
| ReleaseOutputSurface();
|
| @@ -2345,7 +2332,13 @@ bool LayerTreeHostImpl::InitializeRenderer(OutputSurface* output_surface) {
|
| // already.
|
| UpdateGpuRasterizationStatus();
|
|
|
| - CreateAndSetRenderer();
|
| + // See note in LayerTreeImpl::UpdateDrawProperties, new OutputSurface means a
|
| + // new max texture size which affects draw properties. Also, if the draw
|
| + // properties were up to date, layers still lost resources and we need to
|
| + // UpdateDrawProperties() after calling RecreateTreeResources().
|
| + active_tree_->set_needs_update_draw_properties();
|
| + if (pending_tree_)
|
| + pending_tree_->set_needs_update_draw_properties();
|
|
|
| CreateTileManagerResources();
|
| RecreateTreeResources();
|
| @@ -2361,6 +2354,7 @@ bool LayerTreeHostImpl::InitializeRenderer(OutputSurface* output_surface) {
|
| DCHECK_EQ(1, output_surface_->capabilities().max_frames_pending);
|
| client_->OnCanDrawStateChanged(CanDraw());
|
|
|
| + SetFullViewportDamage();
|
| // There will not be anything to draw here, so set high res
|
| // to avoid checkerboards, typically when we are recovering
|
| // from lost context.
|
|
|