blob: 8a0ed59c0aa56d88c698a251bd715bd1de8f551f [file] [log] [blame]
James Robinson646469d2014-10-03 15:33:28 -07001// Copyright 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
James Robinsonf52517f2014-12-02 13:14:02 -08005#include "services/surfaces/surfaces_impl.h"
James Robinson646469d2014-10-03 15:33:28 -07006
James Robinson7b766f42015-02-06 15:14:04 -08007#include "base/trace_event/trace_event.h"
James Robinson646469d2014-10-03 15:33:28 -07008#include "cc/output/compositor_frame.h"
9#include "cc/resources/returned_resource.h"
10#include "cc/surfaces/display.h"
11#include "cc/surfaces/surface_id_allocator.h"
12#include "mojo/cc/context_provider_mojo.h"
James Robinsone2ac7e82014-10-15 13:21:59 -070013#include "mojo/cc/direct_output_surface.h"
14#include "mojo/converters/geometry/geometry_type_converters.h"
15#include "mojo/converters/surfaces/surfaces_type_converters.h"
James Robinson646469d2014-10-03 15:33:28 -070016
James Robinson92e7e452014-12-05 11:12:52 -080017using mojo::SurfaceIdPtr;
18
19namespace surfaces {
20
Adam Barth3374c8e2014-11-24 16:21:53 -080021namespace {
Elliot Glayshereae49292015-01-28 10:47:32 -080022void CallCallback(const mojo::Closure& callback, cc::SurfaceDrawStatus status) {
Adam Barth3374c8e2014-11-24 16:21:53 -080023 callback.Run();
24}
25}
James Robinson646469d2014-10-03 15:33:28 -070026
27SurfacesImpl::SurfacesImpl(cc::SurfaceManager* manager,
28 uint32_t id_namespace,
James Robinson52ea6b62014-11-18 16:23:56 -080029 Client* client,
James Robinson6f344a82014-12-16 15:15:22 -080030 mojo::InterfaceRequest<mojo::Surface> request)
31 : SurfacesImpl(manager, id_namespace, client) {
32 binding_.Bind(request.Pass());
James Robinson6f344a82014-12-16 15:15:22 -080033}
34
35SurfacesImpl::SurfacesImpl(cc::SurfaceManager* manager,
36 uint32_t id_namespace,
37 Client* client,
James Robinson92e7e452014-12-05 11:12:52 -080038 mojo::SurfacePtr* surface)
James Robinson6f344a82014-12-16 15:15:22 -080039 : SurfacesImpl(manager, id_namespace, client) {
40 binding_.Bind(surface);
James Robinson646469d2014-10-03 15:33:28 -070041}
42
43SurfacesImpl::~SurfacesImpl() {
Scott Violet14b35802014-11-13 13:17:34 -080044 client_->OnDisplayBeingDestroyed(display_.get());
Eric Seidel3f1157b2014-11-05 13:09:08 -080045 factory_.DestroyAll();
James Robinson646469d2014-10-03 15:33:28 -070046}
47
James Robinson86e3d332015-01-30 17:44:43 -080048void SurfacesImpl::GetIdNamespace(
49 const Surface::GetIdNamespaceCallback& callback) {
50 callback.Run(id_namespace_);
51}
52
53void SurfacesImpl::SetResourceReturner(mojo::ResourceReturnerPtr returner) {
54 returner_ = returner.Pass();
55}
56
James Robinson099fb6d2015-01-14 10:25:31 -080057void SurfacesImpl::CreateSurface(uint32_t local_id) {
58 factory_.Create(QualifyIdentifier(local_id));
James Robinson646469d2014-10-03 15:33:28 -070059}
60
James Robinson099fb6d2015-01-14 10:25:31 -080061void SurfacesImpl::SubmitFrame(uint32_t local_id,
62 mojo::FramePtr frame,
James Robinson92e7e452014-12-05 11:12:52 -080063 const mojo::Closure& callback) {
Adam Barth3374c8e2014-11-24 16:21:53 -080064 TRACE_EVENT0("mojo", "SurfacesImpl::SubmitFrame");
James Robinson099fb6d2015-01-14 10:25:31 -080065 factory_.SubmitFrame(QualifyIdentifier(local_id),
66 frame.To<scoped_ptr<cc::CompositorFrame>>(),
Adam Barth3374c8e2014-11-24 16:21:53 -080067 base::Bind(&CallCallback, callback));
James Robinson646469d2014-10-03 15:33:28 -070068 client_->FrameSubmitted();
69}
70
James Robinson099fb6d2015-01-14 10:25:31 -080071void SurfacesImpl::DestroySurface(uint32_t local_id) {
72 factory_.Destroy(QualifyIdentifier(local_id));
Benjamin Lermanbd5de962015-02-13 15:23:10 +010073 if (local_id == displayed_surface_) {
74 displayed_surface_ = 0;
75 client_->OnDisplayBeingDestroyed(display_.get());
76 display_.reset();
77 }
James Robinson646469d2014-10-03 15:33:28 -070078}
79
Adam Barth68487312014-11-25 12:14:20 -080080void SurfacesImpl::CreateGLES2BoundSurface(
James Robinson92e7e452014-12-05 11:12:52 -080081 mojo::CommandBufferPtr gles2_client,
James Robinson099fb6d2015-01-14 10:25:31 -080082 uint32_t local_id,
James Robinson92e7e452014-12-05 11:12:52 -080083 mojo::SizePtr size,
84 mojo::InterfaceRequest<mojo::ViewportParameterListener> listener_request) {
James Robinson646469d2014-10-03 15:33:28 -070085 command_buffer_handle_ = gles2_client.PassMessagePipe();
86
James Robinson646469d2014-10-03 15:33:28 -070087 if (!display_) {
James Robinsonc4c1c592014-11-21 18:27:04 -080088 cc::RendererSettings settings;
89 display_.reset(new cc::Display(this, manager_, nullptr, nullptr, settings));
James Robinson646469d2014-10-03 15:33:28 -070090 client_->SetDisplay(display_.get());
James Robinson92e7e452014-12-05 11:12:52 -080091 display_->Initialize(make_scoped_ptr(new mojo::DirectOutputSurface(
92 new mojo::ContextProviderMojo(command_buffer_handle_.Pass()))));
James Robinson646469d2014-10-03 15:33:28 -070093 }
Benjamin Lermanbd5de962015-02-13 15:23:10 +010094 displayed_surface_ = local_id;
James Robinson099fb6d2015-01-14 10:25:31 -080095 cc::SurfaceId cc_id = QualifyIdentifier(local_id);
James Robinson6a64b812014-12-03 13:38:42 -080096 factory_.Create(cc_id);
97 display_->SetSurfaceId(cc_id, 1.f);
98 display_->Resize(size.To<gfx::Size>());
Adam Barth68487312014-11-25 12:14:20 -080099 parameter_listeners_.AddBinding(this, listener_request.Pass());
James Robinson646469d2014-10-03 15:33:28 -0700100}
101
102void SurfacesImpl::ReturnResources(const cc::ReturnedResourceArray& resources) {
James Robinson86e3d332015-01-30 17:44:43 -0800103 if (resources.empty() || !returner_)
James Robinson099fb6d2015-01-14 10:25:31 -0800104 return;
James Robinson92e7e452014-12-05 11:12:52 -0800105 mojo::Array<mojo::ReturnedResourcePtr> ret(resources.size());
James Robinson646469d2014-10-03 15:33:28 -0700106 for (size_t i = 0; i < resources.size(); ++i) {
James Robinson92e7e452014-12-05 11:12:52 -0800107 ret[i] = mojo::ReturnedResource::From(resources[i]);
James Robinson646469d2014-10-03 15:33:28 -0700108 }
James Robinson86e3d332015-01-30 17:44:43 -0800109 returner_->ReturnResources(ret.Pass());
James Robinson646469d2014-10-03 15:33:28 -0700110}
111
112void SurfacesImpl::DisplayDamaged() {
113}
114
115void SurfacesImpl::DidSwapBuffers() {
116}
117
118void SurfacesImpl::DidSwapBuffersComplete() {
119}
120
121void SurfacesImpl::CommitVSyncParameters(base::TimeTicks timebase,
122 base::TimeDelta interval) {
123}
124
125void SurfacesImpl::OutputSurfaceLost() {
126}
127
128void SurfacesImpl::SetMemoryPolicy(const cc::ManagedMemoryPolicy& policy) {
129}
130
Adam Barth68487312014-11-25 12:14:20 -0800131void SurfacesImpl::OnVSyncParametersUpdated(int64_t timebase,
132 int64_t interval) {
133 client_->OnVSyncParametersUpdated(
134 base::TimeTicks::FromInternalValue(timebase),
135 base::TimeDelta::FromInternalValue(interval));
136}
137
James Robinson6f344a82014-12-16 15:15:22 -0800138SurfacesImpl::SurfacesImpl(cc::SurfaceManager* manager,
139 uint32_t id_namespace,
140 Client* client)
141 : manager_(manager),
142 factory_(manager, this),
143 id_namespace_(id_namespace),
144 client_(client),
Benjamin Lermanbd5de962015-02-13 15:23:10 +0100145 displayed_surface_(0),
James Robinson6f344a82014-12-16 15:15:22 -0800146 binding_(this) {
147}
148
James Robinson099fb6d2015-01-14 10:25:31 -0800149cc::SurfaceId SurfacesImpl::QualifyIdentifier(uint32_t local_id) {
150 return cc::SurfaceId(static_cast<uint64_t>(id_namespace_) << 32 | local_id);
151}
152
James Robinson646469d2014-10-03 15:33:28 -0700153} // namespace mojo