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

Unified Diff: blimp/client/core/compositor/blimp_compositor.cc

Issue 2624903006: Remove all blimp client code. (Closed)
Patch Set: Update buildbot configuration Created 3 years, 11 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
Index: blimp/client/core/compositor/blimp_compositor.cc
diff --git a/blimp/client/core/compositor/blimp_compositor.cc b/blimp/client/core/compositor/blimp_compositor.cc
deleted file mode 100644
index 2e225d4802951b6e83a0233778d25e5fd1ba4122..0000000000000000000000000000000000000000
--- a/blimp/client/core/compositor/blimp_compositor.cc
+++ /dev/null
@@ -1,447 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "blimp/client/core/compositor/blimp_compositor.h"
-
-#include "base/bind_helpers.h"
-#include "base/command_line.h"
-#include "base/memory/ptr_util.h"
-#include "base/metrics/histogram_macros.h"
-#include "base/numerics/safe_conversions.h"
-#include "base/single_thread_task_runner.h"
-#include "base/threading/thread.h"
-#include "base/threading/thread_local.h"
-#include "base/threading/thread_restrictions.h"
-#include "base/threading/thread_task_runner_handle.h"
-#include "blimp/client/core/compositor/blimp_compositor_dependencies.h"
-#include "blimp/client/core/compositor/blimp_compositor_frame_sink.h"
-#include "blimp/client/public/compositor/compositor_dependencies.h"
-#include "blimp/net/blimp_stats.h"
-#include "cc/animation/animation_host.h"
-#include "cc/blimp/client_picture_cache.h"
-#include "cc/blimp/compositor_state_deserializer.h"
-#include "cc/blimp/image_serialization_processor.h"
-#include "cc/layers/layer.h"
-#include "cc/layers/surface_layer.h"
-#include "cc/output/compositor_frame_sink.h"
-#include "cc/proto/compositor_message.pb.h"
-#include "cc/surfaces/surface.h"
-#include "cc/surfaces/surface_factory.h"
-#include "cc/surfaces/surface_id_allocator.h"
-#include "cc/surfaces/surface_manager.h"
-#include "cc/trees/layer_tree_host_in_process.h"
-#include "gpu/command_buffer/client/gpu_memory_buffer_manager.h"
-#include "net/base/net_errors.h"
-#include "ui/gl/gl_surface.h"
-
-namespace blimp {
-namespace client {
-
-class BlimpCompositor::FrameTrackingSwapPromise : public cc::SwapPromise {
- public:
- FrameTrackingSwapPromise(
- std::unique_ptr<cc::CopyOutputRequest> copy_request,
- base::WeakPtr<BlimpCompositor> compositor,
- scoped_refptr<base::SingleThreadTaskRunner> main_task_runner)
- : copy_request_(std::move(copy_request)),
- compositor_weak_ptr_(compositor),
- main_task_runner_(std::move(main_task_runner)) {}
- ~FrameTrackingSwapPromise() override = default;
-
- // cc::SwapPromise implementation.
- void DidActivate() override {}
- void WillSwap(cc::CompositorFrameMetadata* metadata) override {}
- void DidSwap() override {
- // DidSwap could be called on compositor thread and we need this to run on
- // the main thread.
- main_task_runner_->PostTask(
- FROM_HERE,
- base::Bind(&BlimpCompositor::MakeCopyRequestOnNextSwap,
- compositor_weak_ptr_, base::Passed(&copy_request_)));
- }
- DidNotSwapAction DidNotSwap(DidNotSwapReason reason) override {
- switch (reason) {
- case DidNotSwapReason::SWAP_FAILS:
- // The swap will fail if there is no frame damage, we can queue the
- // request right away.
- main_task_runner_->PostTask(
- FROM_HERE, base::Bind(&BlimpCompositor::RequestCopyOfOutput,
- compositor_weak_ptr_,
- base::Passed(&copy_request_), false));
- break;
- case DidNotSwapReason::COMMIT_FAILS:
- // The commit fails when the host is going away.
- break;
- case DidNotSwapReason::COMMIT_NO_UPDATE:
- main_task_runner_->PostTask(
- FROM_HERE, base::Bind(&BlimpCompositor::RequestCopyOfOutput,
- compositor_weak_ptr_,
- base::Passed(&copy_request_), false));
- break;
- case DidNotSwapReason::ACTIVATION_FAILS:
- // Failure to activate the pending tree implies either the host in going
- // away or the FrameSink was lost.
- break;
- }
- return DidNotSwapAction::BREAK_PROMISE;
- }
- int64_t TraceId() const override { return 0; }
-
- private:
- std::unique_ptr<cc::CopyOutputRequest> copy_request_;
- base::WeakPtr<BlimpCompositor> compositor_weak_ptr_;
- scoped_refptr<base::SingleThreadTaskRunner> main_task_runner_;
-};
-
-// static
-std::unique_ptr<BlimpCompositor> BlimpCompositor::Create(
- BlimpCompositorDependencies* compositor_dependencies,
- BlimpCompositorClient* client) {
- std::unique_ptr<BlimpCompositor> compositor =
- base::WrapUnique(new BlimpCompositor(compositor_dependencies, client));
- compositor->Initialize();
- return compositor;
-}
-
-BlimpCompositor::BlimpCompositor(
- BlimpCompositorDependencies* compositor_dependencies,
- BlimpCompositorClient* client)
- : client_(client),
- compositor_dependencies_(compositor_dependencies),
- frame_sink_id_(compositor_dependencies_->GetEmbedderDependencies()
- ->AllocateFrameSinkId()),
- proxy_client_(nullptr),
- bound_to_proxy_(false),
- compositor_frame_sink_request_pending_(false),
- layer_(cc::Layer::Create()),
- weak_ptr_factory_(this) {
- DCHECK(thread_checker_.CalledOnValidThread());
-}
-
-void BlimpCompositor::Initialize() {
- surface_id_allocator_ = base::MakeUnique<cc::SurfaceIdAllocator>();
- GetEmbedderDeps()->GetSurfaceManager()->RegisterFrameSinkId(frame_sink_id_);
- surface_factory_ = base::MakeUnique<cc::SurfaceFactory>(
- frame_sink_id_, GetEmbedderDeps()->GetSurfaceManager(), this);
- animation_host_ = cc::AnimationHost::CreateMainInstance();
- host_ = CreateLayerTreeHost();
-
- std::unique_ptr<cc::ClientPictureCache> client_picture_cache =
- compositor_dependencies_->GetImageSerializationProcessor()
- ->CreateClientPictureCache();
- compositor_state_deserializer_ =
- base::MakeUnique<cc::CompositorStateDeserializer>(
- host_.get(), std::move(client_picture_cache), this);
-}
-
-BlimpCompositor::~BlimpCompositor() {
- DCHECK(thread_checker_.CalledOnValidThread());
-
- DestroyLayerTreeHost();
- GetEmbedderDeps()->GetSurfaceManager()->InvalidateFrameSinkId(frame_sink_id_);
-}
-
-void BlimpCompositor::SetVisible(bool visible) {
- host_->SetVisible(visible);
-}
-
-bool BlimpCompositor::IsVisible() const {
- return host_->IsVisible();
-}
-
-bool BlimpCompositor::HasPendingFrameUpdateFromEngine() const {
- return pending_frame_update_.get() != nullptr;
-}
-
-void BlimpCompositor::RequestCopyOfOutput(
- std::unique_ptr<cc::CopyOutputRequest> copy_request,
- bool flush_pending_update) {
- // If we don't have a FrameSink, fail right away.
- if (!bound_to_proxy_)
- return;
-
- if (flush_pending_update) {
- // Always request a commit when queuing the promise to make sure that any
- // frames pending draws are cleared from the pipeline.
- host_->QueueSwapPromise(base::MakeUnique<FrameTrackingSwapPromise>(
- std::move(copy_request), weak_ptr_factory_.GetWeakPtr(),
- base::ThreadTaskRunnerHandle::Get()));
- host_->SetNeedsCommit();
- } else if (local_frame_id_.is_valid()) {
- // Make a copy request for the surface directly.
- surface_factory_->RequestCopyOfSurface(std::move(copy_request));
- }
-}
-
-void BlimpCompositor::UpdateLayerTreeHost() {
- // UpdateLayerTreeHost marks the end of reporting of any deltas from the impl
- // thread. So send a client state update if the local state was modified now.
- FlushClientState();
-
- if (pending_frame_update_) {
- compositor_state_deserializer_->DeserializeCompositorUpdate(
- pending_frame_update_->layer_tree_host());
- pending_frame_update_ = nullptr;
- cc::proto::CompositorMessage frame_ack;
- frame_ack.set_frame_ack(true);
- client_->SendCompositorMessage(frame_ack);
- }
-
- // Send back any deltas that have not yet been resolved on the main thread
- // back to the impl thread.
- compositor_state_deserializer_->SendUnappliedDeltasToLayerTreeHost();
-}
-
-void BlimpCompositor::ApplyViewportDeltas(
- const gfx::Vector2dF& inner_delta,
- const gfx::Vector2dF& outer_delta,
- const gfx::Vector2dF& elastic_overscroll_delta,
- float page_scale,
- float top_controls_delta) {
- compositor_state_deserializer_->ApplyViewportDeltas(
- inner_delta, outer_delta, elastic_overscroll_delta, page_scale,
- top_controls_delta);
-}
-
-void BlimpCompositor::RequestNewCompositorFrameSink() {
- DCHECK(!bound_to_proxy_);
- DCHECK(!compositor_frame_sink_request_pending_);
-
- compositor_frame_sink_request_pending_ = true;
- GetEmbedderDeps()->GetContextProviders(
- base::Bind(&BlimpCompositor::OnContextProvidersCreated,
- weak_ptr_factory_.GetWeakPtr()));
-}
-
-void BlimpCompositor::DidInitializeCompositorFrameSink() {
- compositor_frame_sink_request_pending_ = false;
-}
-
-void BlimpCompositor::DidCommitAndDrawFrame() {}
-
-void BlimpCompositor::OnCompositorMessageReceived(
- std::unique_ptr<cc::proto::CompositorMessage> message) {
- cc::proto::CompositorMessage* message_received = message.get();
-
- if (message_received->has_layer_tree_host()) {
- DCHECK(!pending_frame_update_)
- << "We should have only a single frame in flight";
-
- UMA_HISTOGRAM_MEMORY_KB("Blimp.Compositor.CommitSizeKb",
- (float)message->ByteSize() / 1024);
- BlimpStats::GetInstance()->Add(BlimpStats::COMMIT, 1);
-
- pending_frame_update_ = std::move(message);
- host_->SetNeedsAnimate();
- }
-
- if (message_received->client_state_update_ack()) {
- DCHECK(client_state_update_ack_pending_);
-
- client_state_update_ack_pending_ = false;
- compositor_state_deserializer_->DidApplyStateUpdatesOnEngine();
-
- // If there are any updates that we have queued because we were waiting for
- // an ack, send them now.
- FlushClientState();
- }
-}
-
-const base::WeakPtr<cc::InputHandler>& BlimpCompositor::GetInputHandler() {
- return host_->GetInputHandler();
-}
-
-void BlimpCompositor::OnContextProvidersCreated(
- const scoped_refptr<cc::ContextProvider>& compositor_context_provider,
- const scoped_refptr<cc::ContextProvider>& worker_context_provider) {
- DCHECK(!bound_to_proxy_) << "Any connection to the old CompositorFrameSink "
- "should have been destroyed";
-
- // Make sure we still have a host and we're still expecting a
- // CompositorFrameSink. This can happen if the host dies while the request is
- // outstanding and we build a new one that hasn't asked for a surface yet.
- if (!compositor_frame_sink_request_pending_)
- return;
-
- // Try again if the context creation failed.
- if (!compositor_context_provider) {
- GetEmbedderDeps()->GetContextProviders(
- base::Bind(&BlimpCompositor::OnContextProvidersCreated,
- weak_ptr_factory_.GetWeakPtr()));
- return;
- }
-
- auto compositor_frame_sink = base::MakeUnique<BlimpCompositorFrameSink>(
- std::move(compositor_context_provider),
- std::move(worker_context_provider),
- GetEmbedderDeps()->GetGpuMemoryBufferManager(), nullptr,
- base::ThreadTaskRunnerHandle::Get(), weak_ptr_factory_.GetWeakPtr());
-
- host_->SetCompositorFrameSink(std::move(compositor_frame_sink));
-}
-
-void BlimpCompositor::BindToProxyClient(
- base::WeakPtr<BlimpCompositorFrameSinkProxyClient> proxy_client) {
- DCHECK(thread_checker_.CalledOnValidThread());
- DCHECK(!bound_to_proxy_);
-
- bound_to_proxy_ = true;
- proxy_client_ = proxy_client;
-}
-
-void BlimpCompositor::SubmitCompositorFrame(cc::CompositorFrame frame) {
- DCHECK(thread_checker_.CalledOnValidThread());
- DCHECK(bound_to_proxy_);
-
- cc::RenderPass* root_pass = frame.render_pass_list.back().get();
- gfx::Size surface_size = root_pass->output_rect.size();
-
- if (!local_frame_id_.is_valid() || current_surface_size_ != surface_size) {
- DestroyDelegatedContent();
- DCHECK(layer_->children().empty());
-
- local_frame_id_ = surface_id_allocator_->GenerateId();
- current_surface_size_ = surface_size;
-
- // manager must outlive compositors using it.
- cc::SurfaceManager* surface_manager =
- GetEmbedderDeps()->GetSurfaceManager();
- auto content_layer =
- cc::SurfaceLayer::Create(surface_manager->reference_factory());
- cc::SurfaceId surface_id(surface_factory_->frame_sink_id(),
- local_frame_id_);
- content_layer->SetSurfaceInfo(
- cc::SurfaceInfo(surface_id, 1.f, surface_size));
- content_layer->SetBounds(current_surface_size_);
- content_layer->SetIsDrawable(true);
- content_layer->SetContentsOpaque(true);
-
- layer_->AddChild(content_layer);
- }
-
- surface_factory_->SubmitCompositorFrame(
- local_frame_id_, std::move(frame),
- base::Bind(&BlimpCompositor::SubmitCompositorFrameAck,
- weak_ptr_factory_.GetWeakPtr()));
-
- for (auto& copy_request : copy_requests_for_next_swap_) {
- surface_factory_->RequestCopyOfSurface(std::move(copy_request));
- }
- copy_requests_for_next_swap_.clear();
-}
-
-void BlimpCompositor::SubmitCompositorFrameAck() {
- compositor_dependencies_->GetCompositorTaskRunner()->PostTask(
- FROM_HERE,
- base::Bind(&BlimpCompositorFrameSinkProxyClient::SubmitCompositorFrameAck,
- proxy_client_));
-}
-
-void BlimpCompositor::MakeCopyRequestOnNextSwap(
- std::unique_ptr<cc::CopyOutputRequest> copy_request) {
- copy_requests_for_next_swap_.push_back(std::move(copy_request));
-}
-
-void BlimpCompositor::UnbindProxyClient() {
- DCHECK(thread_checker_.CalledOnValidThread());
- DCHECK(bound_to_proxy_);
-
- DestroyDelegatedContent();
- surface_factory_->Reset();
- bound_to_proxy_ = false;
- proxy_client_ = nullptr;
-}
-
-void BlimpCompositor::ReturnResources(
- const cc::ReturnedResourceArray& resources) {
- DCHECK(bound_to_proxy_);
- compositor_dependencies_->GetCompositorTaskRunner()->PostTask(
- FROM_HERE,
- base::Bind(
- &BlimpCompositorFrameSinkProxyClient::ReclaimCompositorResources,
- proxy_client_, resources));
-}
-
-void BlimpCompositor::DidUpdateLocalState() {
- client_state_dirty_ = true;
-}
-
-void BlimpCompositor::FlushClientState() {
- // If the client state has not been modified, we don't need to send an update.
- if (!client_state_dirty_)
- return;
-
- // If we had sent an update and an ack for it is still pending, we can't send
- // another update till the ack is received.
- if (client_state_update_ack_pending_)
- return;
-
- cc::proto::CompositorMessage message;
- message.set_frame_ack(false);
- compositor_state_deserializer_->PullClientStateUpdate(
- message.mutable_client_state_update());
-
- client_state_dirty_ = false;
- client_state_update_ack_pending_ = true;
- client_->SendCompositorMessage(message);
-}
-
-CompositorDependencies* BlimpCompositor::GetEmbedderDeps() {
- return compositor_dependencies_->GetEmbedderDependencies();
-}
-
-void BlimpCompositor::DestroyDelegatedContent() {
- if (!local_frame_id_.is_valid())
- return;
-
- // Remove any references for the surface layer that uses this
- // |local_frame_id_|.
- layer_->RemoveAllChildren();
- surface_factory_->EvictSurface();
- local_frame_id_ = cc::LocalFrameId();
-}
-
-std::unique_ptr<cc::LayerTreeHostInProcess>
-BlimpCompositor::CreateLayerTreeHost() {
- DCHECK(animation_host_);
- std::unique_ptr<cc::LayerTreeHostInProcess> host;
-
- cc::LayerTreeHostInProcess::InitParams params;
- params.client = this;
- params.task_graph_runner = compositor_dependencies_->GetTaskGraphRunner();
- params.main_task_runner = base::ThreadTaskRunnerHandle::Get();
- params.image_serialization_processor =
- compositor_dependencies_->GetImageSerializationProcessor();
-
- cc::LayerTreeSettings* settings =
- compositor_dependencies_->GetLayerTreeSettings();
- params.settings = settings;
- params.mutator_host = animation_host_.get();
-
- scoped_refptr<base::SingleThreadTaskRunner> compositor_task_runner =
- compositor_dependencies_->GetCompositorTaskRunner();
-
- host = cc::LayerTreeHostInProcess::CreateThreaded(compositor_task_runner,
- &params);
-
- return host;
-}
-
-void BlimpCompositor::DestroyLayerTreeHost() {
- DCHECK(host_);
-
- // Tear down the output surface connection with the old LayerTreeHost
- // instance.
- DestroyDelegatedContent();
-
- // Destroy the old LayerTreeHost state.
- host_.reset();
-
- // Cancel any outstanding CompositorFrameSink requests. That way if we get an
- // async callback related to the old request we know to drop it.
- compositor_frame_sink_request_pending_ = false;
-}
-
-} // namespace client
-} // namespace blimp
« no previous file with comments | « blimp/client/core/compositor/blimp_compositor.h ('k') | blimp/client/core/compositor/blimp_compositor_dependencies.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698