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

Unified Diff: mojo/aura/surface_binding.cc

Issue 851853002: It is time. (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: Trying to reup because the last upload failed. Created 5 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
« no previous file with comments | « mojo/aura/surface_binding.h ('k') | mojo/aura/surface_context_factory.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: mojo/aura/surface_binding.cc
diff --git a/mojo/aura/surface_binding.cc b/mojo/aura/surface_binding.cc
deleted file mode 100644
index 618db38246f7db8503b8d377ef0111d73dedbb90..0000000000000000000000000000000000000000
--- a/mojo/aura/surface_binding.cc
+++ /dev/null
@@ -1,252 +0,0 @@
-// Copyright 2014 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 "mojo/aura/surface_binding.h"
-
-#include <map>
-
-#include "base/bind.h"
-#include "base/lazy_instance.h"
-#include "base/threading/thread_local.h"
-#include "cc/output/compositor_frame.h"
-#include "cc/output/output_surface.h"
-#include "cc/output/output_surface_client.h"
-#include "cc/output/software_output_device.h"
-#include "cc/resources/shared_bitmap_manager.h"
-#include "mojo/aura/window_tree_host_mojo.h"
-#include "mojo/cc/context_provider_mojo.h"
-#include "mojo/cc/output_surface_mojo.h"
-#include "mojo/converters/geometry/geometry_type_converters.h"
-#include "mojo/converters/surfaces/surfaces_type_converters.h"
-#include "mojo/public/cpp/application/connect.h"
-#include "mojo/public/interfaces/application/shell.mojom.h"
-#include "mojo/services/gpu/public/interfaces/gpu.mojom.h"
-#include "mojo/services/surfaces/public/interfaces/surfaces.mojom.h"
-#include "mojo/services/surfaces/public/interfaces/surfaces_service.mojom.h"
-#include "mojo/services/view_manager/public/cpp/view.h"
-#include "mojo/services/view_manager/public/cpp/view_manager.h"
-
-namespace mojo {
-namespace {
-
-// SurfaceclientImpl -----------------------------------------------------------
-
-class SurfaceClientImpl : public SurfaceClient {
- public:
- SurfaceClientImpl() {}
- ~SurfaceClientImpl() override {}
-
- // SurfaceClient:
- void SetIdNamespace(uint32_t id_namespace) override {}
- void ReturnResources(Array<ReturnedResourcePtr> resources) override {
- // TODO (sky|jamesr): figure out right way to recycle resources.
- }
-
- private:
- DISALLOW_COPY_AND_ASSIGN(SurfaceClientImpl);
-};
-
-// OutputSurface ---------------------------------------------------------------
-
-// OutputSurface implementation for a view. Pushes the surface id to View when
-// appropriate.
-class OutputSurfaceImpl : public cc::OutputSurface {
- public:
- OutputSurfaceImpl(View* view,
- const scoped_refptr<cc::ContextProvider>& context_provider,
- Surface* surface,
- cc::SurfaceIdAllocator* id_allocator);
- ~OutputSurfaceImpl() override;
-
- // cc::OutputSurface:
- void SwapBuffers(cc::CompositorFrame* frame) override;
-
- private:
- View* view_;
- Surface* surface_;
- cc::SurfaceIdAllocator* id_allocator_;
- cc::SurfaceId surface_id_;
- gfx::Size surface_size_;
-
- DISALLOW_COPY_AND_ASSIGN(OutputSurfaceImpl);
-};
-
-OutputSurfaceImpl::OutputSurfaceImpl(
- View* view,
- const scoped_refptr<cc::ContextProvider>& context_provider,
- Surface* surface,
- cc::SurfaceIdAllocator* id_allocator)
- : cc::OutputSurface(context_provider),
- view_(view),
- surface_(surface),
- id_allocator_(id_allocator) {
- capabilities_.delegated_rendering = true;
- capabilities_.max_frames_pending = 1;
-}
-
-OutputSurfaceImpl::~OutputSurfaceImpl() {
-}
-
-void OutputSurfaceImpl::SwapBuffers(cc::CompositorFrame* frame) {
- gfx::Size frame_size =
- frame->delegated_frame_data->render_pass_list.back()->output_rect.size();
- if (frame_size != surface_size_) {
- if (!surface_id_.is_null())
- surface_->DestroySurface(SurfaceId::From(surface_id_));
- surface_id_ = id_allocator_->GenerateId();
- surface_->CreateSurface(SurfaceId::From(surface_id_));
- view_->SetSurfaceId(SurfaceId::From(surface_id_));
- surface_size_ = frame_size;
- }
-
- surface_->SubmitFrame(SurfaceId::From(surface_id_), Frame::From(*frame),
- mojo::Closure());
-
- client_->DidSwapBuffers();
- client_->DidSwapBuffersComplete();
-}
-
-} // namespace
-
-// PerViewManagerState ---------------------------------------------------------
-
-// State needed per ViewManager. Provides the real implementation of
-// CreateOutputSurface. SurfaceBinding obtains a pointer to the
-// PerViewManagerState appropriate for the ViewManager. PerViewManagerState is
-// stored in a thread local map. When no more refereces to a PerViewManagerState
-// remain the PerViewManagerState is deleted and the underlying map cleaned up.
-class SurfaceBinding::PerViewManagerState
- : public base::RefCounted<PerViewManagerState> {
- public:
- static PerViewManagerState* Get(Shell* shell, ViewManager* view_manager);
-
- scoped_ptr<cc::OutputSurface> CreateOutputSurface(View* view);
-
- private:
- typedef std::map<ViewManager*, PerViewManagerState*> ViewManagerToStateMap;
-
- friend class base::RefCounted<PerViewManagerState>;
-
- PerViewManagerState(Shell* shell, ViewManager* view_manager);
- ~PerViewManagerState();
-
- void Init();
-
- // Callback when a Surface has been created.
- void OnCreatedSurfaceConnection(SurfacePtr surface, uint32_t id_namespace);
-
- static base::LazyInstance<
- base::ThreadLocalPointer<ViewManagerToStateMap>>::Leaky view_states;
-
- Shell* shell_;
- ViewManager* view_manager_;
-
- // Set of state needed to create an OutputSurface.
- scoped_ptr<SurfaceClient> surface_client_;
- GpuPtr gpu_;
- SurfacePtr surface_;
- SurfacesServicePtr surfaces_service_;
- scoped_ptr<cc::SurfaceIdAllocator> surface_id_allocator_;
-
- DISALLOW_COPY_AND_ASSIGN(PerViewManagerState);
-};
-
-// static
-base::LazyInstance<base::ThreadLocalPointer<
- SurfaceBinding::PerViewManagerState::ViewManagerToStateMap>>::Leaky
- SurfaceBinding::PerViewManagerState::view_states;
-
-// static
-SurfaceBinding::PerViewManagerState* SurfaceBinding::PerViewManagerState::Get(
- Shell* shell,
- ViewManager* view_manager) {
- ViewManagerToStateMap* view_map = view_states.Pointer()->Get();
- if (!view_map) {
- view_map = new ViewManagerToStateMap;
- view_states.Pointer()->Set(view_map);
- }
- if (!(*view_map)[view_manager]) {
- (*view_map)[view_manager] = new PerViewManagerState(shell, view_manager);
- (*view_map)[view_manager]->Init();
- }
- return (*view_map)[view_manager];
-}
-
-scoped_ptr<cc::OutputSurface>
-SurfaceBinding::PerViewManagerState::CreateOutputSurface(View* view) {
- // TODO(sky): figure out lifetime here. Do I need to worry about the return
- // value outliving this?
- CommandBufferPtr cb;
- gpu_->CreateOffscreenGLES2Context(GetProxy(&cb));
- scoped_refptr<cc::ContextProvider> context_provider(
- new ContextProviderMojo(cb.PassMessagePipe()));
- return make_scoped_ptr(new OutputSurfaceImpl(
- view, context_provider, surface_.get(), surface_id_allocator_.get()));
-}
-
-SurfaceBinding::PerViewManagerState::PerViewManagerState(
- Shell* shell,
- ViewManager* view_manager)
- : shell_(shell), view_manager_(view_manager) {
-}
-
-SurfaceBinding::PerViewManagerState::~PerViewManagerState() {
- ViewManagerToStateMap* view_map = view_states.Pointer()->Get();
- DCHECK(view_map);
- DCHECK_EQ(this, (*view_map)[view_manager_]);
- view_map->erase(view_manager_);
- if (view_map->empty()) {
- delete view_map;
- view_states.Pointer()->Set(nullptr);
- }
-}
-
-void SurfaceBinding::PerViewManagerState::Init() {
- DCHECK(!surfaces_service_.get());
-
- ServiceProviderPtr surfaces_service_provider;
- shell_->ConnectToApplication("mojo:surfaces_service",
- GetProxy(&surfaces_service_provider));
- ConnectToService(surfaces_service_provider.get(), &surfaces_service_);
- // base::Unretained is ok here as we block until the call is received.
- surfaces_service_->CreateSurfaceConnection(
- base::Bind(&PerViewManagerState::OnCreatedSurfaceConnection,
- base::Unretained(this)));
- // Block until we get the surface. This is done to make it easy for client
- // code. OTOH blocking is ick and leads to all sorts of problems.
- // TODO(sky): ick! There needs to be a better way to deal with this.
- surfaces_service_.WaitForIncomingMethodCall();
- DCHECK(surface_.get());
- surface_client_.reset(new SurfaceClientImpl);
- surface_.set_client(surface_client_.get());
-
- ServiceProviderPtr gpu_service_provider;
- // TODO(jamesr): Should be mojo:gpu_service
- shell_->ConnectToApplication("mojo:native_viewport_service",
- GetProxy(&gpu_service_provider));
- ConnectToService(gpu_service_provider.get(), &gpu_);
-}
-
-void SurfaceBinding::PerViewManagerState::OnCreatedSurfaceConnection(
- SurfacePtr surface,
- uint32_t id_namespace) {
- surface_id_allocator_.reset(new cc::SurfaceIdAllocator(id_namespace));
- surface_ = surface.Pass();
-}
-
-// SurfaceBinding --------------------------------------------------------------
-
-SurfaceBinding::SurfaceBinding(Shell* shell, View* view)
- : view_(view),
- state_(PerViewManagerState::Get(shell, view->view_manager())) {
-}
-
-SurfaceBinding::~SurfaceBinding() {
-}
-
-scoped_ptr<cc::OutputSurface> SurfaceBinding::CreateOutputSurface() {
- return state_->CreateOutputSurface(view_);
-}
-
-} // namespace mojo
« no previous file with comments | « mojo/aura/surface_binding.h ('k') | mojo/aura/surface_context_factory.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698