James Robinson | 646469d | 2014-10-03 15:33:28 -0700 | [diff] [blame] | 1 | // 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 Robinson | f52517f | 2014-12-02 13:14:02 -0800 | [diff] [blame] | 5 | #include "services/surfaces/surfaces_impl.h" |
James Robinson | 646469d | 2014-10-03 15:33:28 -0700 | [diff] [blame] | 6 | |
James Robinson | 7b766f4 | 2015-02-06 15:14:04 -0800 | [diff] [blame] | 7 | #include "base/trace_event/trace_event.h" |
James Robinson | 646469d | 2014-10-03 15:33:28 -0700 | [diff] [blame] | 8 | #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 Robinson | e2ac7e8 | 2014-10-15 13:21:59 -0700 | [diff] [blame] | 13 | #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 Robinson | 646469d | 2014-10-03 15:33:28 -0700 | [diff] [blame] | 16 | |
James Robinson | 92e7e45 | 2014-12-05 11:12:52 -0800 | [diff] [blame] | 17 | using mojo::SurfaceIdPtr; |
| 18 | |
| 19 | namespace surfaces { |
| 20 | |
Adam Barth | 3374c8e | 2014-11-24 16:21:53 -0800 | [diff] [blame] | 21 | namespace { |
Elliot Glaysher | eae4929 | 2015-01-28 10:47:32 -0800 | [diff] [blame] | 22 | void CallCallback(const mojo::Closure& callback, cc::SurfaceDrawStatus status) { |
Adam Barth | 3374c8e | 2014-11-24 16:21:53 -0800 | [diff] [blame] | 23 | callback.Run(); |
| 24 | } |
| 25 | } |
James Robinson | 646469d | 2014-10-03 15:33:28 -0700 | [diff] [blame] | 26 | |
| 27 | SurfacesImpl::SurfacesImpl(cc::SurfaceManager* manager, |
| 28 | uint32_t id_namespace, |
James Robinson | 52ea6b6 | 2014-11-18 16:23:56 -0800 | [diff] [blame] | 29 | Client* client, |
James Robinson | 6f344a8 | 2014-12-16 15:15:22 -0800 | [diff] [blame] | 30 | mojo::InterfaceRequest<mojo::Surface> request) |
| 31 | : SurfacesImpl(manager, id_namespace, client) { |
| 32 | binding_.Bind(request.Pass()); |
James Robinson | 6f344a8 | 2014-12-16 15:15:22 -0800 | [diff] [blame] | 33 | } |
| 34 | |
| 35 | SurfacesImpl::SurfacesImpl(cc::SurfaceManager* manager, |
| 36 | uint32_t id_namespace, |
| 37 | Client* client, |
James Robinson | 92e7e45 | 2014-12-05 11:12:52 -0800 | [diff] [blame] | 38 | mojo::SurfacePtr* surface) |
James Robinson | 6f344a8 | 2014-12-16 15:15:22 -0800 | [diff] [blame] | 39 | : SurfacesImpl(manager, id_namespace, client) { |
| 40 | binding_.Bind(surface); |
James Robinson | 646469d | 2014-10-03 15:33:28 -0700 | [diff] [blame] | 41 | } |
| 42 | |
| 43 | SurfacesImpl::~SurfacesImpl() { |
Scott Violet | 14b3580 | 2014-11-13 13:17:34 -0800 | [diff] [blame] | 44 | client_->OnDisplayBeingDestroyed(display_.get()); |
Eric Seidel | 3f1157b | 2014-11-05 13:09:08 -0800 | [diff] [blame] | 45 | factory_.DestroyAll(); |
James Robinson | 646469d | 2014-10-03 15:33:28 -0700 | [diff] [blame] | 46 | } |
| 47 | |
James Robinson | 86e3d33 | 2015-01-30 17:44:43 -0800 | [diff] [blame] | 48 | void SurfacesImpl::GetIdNamespace( |
| 49 | const Surface::GetIdNamespaceCallback& callback) { |
| 50 | callback.Run(id_namespace_); |
| 51 | } |
| 52 | |
| 53 | void SurfacesImpl::SetResourceReturner(mojo::ResourceReturnerPtr returner) { |
| 54 | returner_ = returner.Pass(); |
| 55 | } |
| 56 | |
James Robinson | 099fb6d | 2015-01-14 10:25:31 -0800 | [diff] [blame] | 57 | void SurfacesImpl::CreateSurface(uint32_t local_id) { |
| 58 | factory_.Create(QualifyIdentifier(local_id)); |
James Robinson | 646469d | 2014-10-03 15:33:28 -0700 | [diff] [blame] | 59 | } |
| 60 | |
James Robinson | 099fb6d | 2015-01-14 10:25:31 -0800 | [diff] [blame] | 61 | void SurfacesImpl::SubmitFrame(uint32_t local_id, |
| 62 | mojo::FramePtr frame, |
James Robinson | 92e7e45 | 2014-12-05 11:12:52 -0800 | [diff] [blame] | 63 | const mojo::Closure& callback) { |
Adam Barth | 3374c8e | 2014-11-24 16:21:53 -0800 | [diff] [blame] | 64 | TRACE_EVENT0("mojo", "SurfacesImpl::SubmitFrame"); |
James Robinson | 099fb6d | 2015-01-14 10:25:31 -0800 | [diff] [blame] | 65 | factory_.SubmitFrame(QualifyIdentifier(local_id), |
| 66 | frame.To<scoped_ptr<cc::CompositorFrame>>(), |
Adam Barth | 3374c8e | 2014-11-24 16:21:53 -0800 | [diff] [blame] | 67 | base::Bind(&CallCallback, callback)); |
James Robinson | 646469d | 2014-10-03 15:33:28 -0700 | [diff] [blame] | 68 | client_->FrameSubmitted(); |
| 69 | } |
| 70 | |
James Robinson | 099fb6d | 2015-01-14 10:25:31 -0800 | [diff] [blame] | 71 | void SurfacesImpl::DestroySurface(uint32_t local_id) { |
| 72 | factory_.Destroy(QualifyIdentifier(local_id)); |
Benjamin Lerman | bd5de96 | 2015-02-13 15:23:10 +0100 | [diff] [blame] | 73 | if (local_id == displayed_surface_) { |
| 74 | displayed_surface_ = 0; |
| 75 | client_->OnDisplayBeingDestroyed(display_.get()); |
| 76 | display_.reset(); |
| 77 | } |
James Robinson | 646469d | 2014-10-03 15:33:28 -0700 | [diff] [blame] | 78 | } |
| 79 | |
Adam Barth | 6848731 | 2014-11-25 12:14:20 -0800 | [diff] [blame] | 80 | void SurfacesImpl::CreateGLES2BoundSurface( |
James Robinson | 92e7e45 | 2014-12-05 11:12:52 -0800 | [diff] [blame] | 81 | mojo::CommandBufferPtr gles2_client, |
James Robinson | 099fb6d | 2015-01-14 10:25:31 -0800 | [diff] [blame] | 82 | uint32_t local_id, |
James Robinson | 92e7e45 | 2014-12-05 11:12:52 -0800 | [diff] [blame] | 83 | mojo::SizePtr size, |
| 84 | mojo::InterfaceRequest<mojo::ViewportParameterListener> listener_request) { |
James Robinson | 646469d | 2014-10-03 15:33:28 -0700 | [diff] [blame] | 85 | command_buffer_handle_ = gles2_client.PassMessagePipe(); |
| 86 | |
James Robinson | 646469d | 2014-10-03 15:33:28 -0700 | [diff] [blame] | 87 | if (!display_) { |
James Robinson | c4c1c59 | 2014-11-21 18:27:04 -0800 | [diff] [blame] | 88 | cc::RendererSettings settings; |
| 89 | display_.reset(new cc::Display(this, manager_, nullptr, nullptr, settings)); |
James Robinson | 646469d | 2014-10-03 15:33:28 -0700 | [diff] [blame] | 90 | client_->SetDisplay(display_.get()); |
James Robinson | 92e7e45 | 2014-12-05 11:12:52 -0800 | [diff] [blame] | 91 | display_->Initialize(make_scoped_ptr(new mojo::DirectOutputSurface( |
| 92 | new mojo::ContextProviderMojo(command_buffer_handle_.Pass())))); |
James Robinson | 646469d | 2014-10-03 15:33:28 -0700 | [diff] [blame] | 93 | } |
Benjamin Lerman | bd5de96 | 2015-02-13 15:23:10 +0100 | [diff] [blame] | 94 | displayed_surface_ = local_id; |
James Robinson | 099fb6d | 2015-01-14 10:25:31 -0800 | [diff] [blame] | 95 | cc::SurfaceId cc_id = QualifyIdentifier(local_id); |
James Robinson | 6a64b81 | 2014-12-03 13:38:42 -0800 | [diff] [blame] | 96 | factory_.Create(cc_id); |
| 97 | display_->SetSurfaceId(cc_id, 1.f); |
| 98 | display_->Resize(size.To<gfx::Size>()); |
Adam Barth | 6848731 | 2014-11-25 12:14:20 -0800 | [diff] [blame] | 99 | parameter_listeners_.AddBinding(this, listener_request.Pass()); |
James Robinson | 646469d | 2014-10-03 15:33:28 -0700 | [diff] [blame] | 100 | } |
| 101 | |
| 102 | void SurfacesImpl::ReturnResources(const cc::ReturnedResourceArray& resources) { |
James Robinson | 86e3d33 | 2015-01-30 17:44:43 -0800 | [diff] [blame] | 103 | if (resources.empty() || !returner_) |
James Robinson | 099fb6d | 2015-01-14 10:25:31 -0800 | [diff] [blame] | 104 | return; |
James Robinson | 92e7e45 | 2014-12-05 11:12:52 -0800 | [diff] [blame] | 105 | mojo::Array<mojo::ReturnedResourcePtr> ret(resources.size()); |
James Robinson | 646469d | 2014-10-03 15:33:28 -0700 | [diff] [blame] | 106 | for (size_t i = 0; i < resources.size(); ++i) { |
James Robinson | 92e7e45 | 2014-12-05 11:12:52 -0800 | [diff] [blame] | 107 | ret[i] = mojo::ReturnedResource::From(resources[i]); |
James Robinson | 646469d | 2014-10-03 15:33:28 -0700 | [diff] [blame] | 108 | } |
James Robinson | 86e3d33 | 2015-01-30 17:44:43 -0800 | [diff] [blame] | 109 | returner_->ReturnResources(ret.Pass()); |
James Robinson | 646469d | 2014-10-03 15:33:28 -0700 | [diff] [blame] | 110 | } |
| 111 | |
| 112 | void SurfacesImpl::DisplayDamaged() { |
| 113 | } |
| 114 | |
| 115 | void SurfacesImpl::DidSwapBuffers() { |
| 116 | } |
| 117 | |
| 118 | void SurfacesImpl::DidSwapBuffersComplete() { |
| 119 | } |
| 120 | |
| 121 | void SurfacesImpl::CommitVSyncParameters(base::TimeTicks timebase, |
| 122 | base::TimeDelta interval) { |
| 123 | } |
| 124 | |
| 125 | void SurfacesImpl::OutputSurfaceLost() { |
| 126 | } |
| 127 | |
| 128 | void SurfacesImpl::SetMemoryPolicy(const cc::ManagedMemoryPolicy& policy) { |
| 129 | } |
| 130 | |
Adam Barth | 6848731 | 2014-11-25 12:14:20 -0800 | [diff] [blame] | 131 | void 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 Robinson | 6f344a8 | 2014-12-16 15:15:22 -0800 | [diff] [blame] | 138 | SurfacesImpl::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 Lerman | bd5de96 | 2015-02-13 15:23:10 +0100 | [diff] [blame] | 145 | displayed_surface_(0), |
James Robinson | 6f344a8 | 2014-12-16 15:15:22 -0800 | [diff] [blame] | 146 | binding_(this) { |
| 147 | } |
| 148 | |
James Robinson | 099fb6d | 2015-01-14 10:25:31 -0800 | [diff] [blame] | 149 | cc::SurfaceId SurfacesImpl::QualifyIdentifier(uint32_t local_id) { |
| 150 | return cc::SurfaceId(static_cast<uint64_t>(id_namespace_) << 32 | local_id); |
| 151 | } |
| 152 | |
James Robinson | 646469d | 2014-10-03 15:33:28 -0700 | [diff] [blame] | 153 | } // namespace mojo |