1116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
2116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
3116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// found in the LICENSE file.
4116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
5116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "mojo/services/surfaces/surfaces_impl.h"
6116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
7116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "cc/output/compositor_frame.h"
8116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "cc/resources/returned_resource.h"
9116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "cc/surfaces/display.h"
10116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "cc/surfaces/surface_id_allocator.h"
11116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "mojo/cc/context_provider_mojo.h"
12116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "mojo/services/public/cpp/geometry/geometry_type_converters.h"
13116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "mojo/services/public/cpp/surfaces/surfaces_type_converters.h"
14116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
15116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace mojo {
16116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)SurfacesImpl::SurfacesImpl(cc::SurfaceManager* manager,
185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                           uint32_t id_namespace,
195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                           Client* client)
205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    : manager_(manager),
215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      factory_(manager, this),
225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      id_namespace_(id_namespace),
235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      client_(client) {
24116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
25116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
26116680a4aac90f2aa7413d9095a592090648e557Ben MurdochSurfacesImpl::~SurfacesImpl() {
27116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
28116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
29116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid SurfacesImpl::CreateSurface(SurfaceIdPtr id, mojo::SizePtr size) {
30116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  cc::SurfaceId cc_id = id.To<cc::SurfaceId>();
31116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (cc::SurfaceIdAllocator::NamespaceForId(cc_id) != id_namespace_) {
32116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // Bad message, do something bad to the caller?
33116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    NOTREACHED();
34116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return;
35116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
36116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  factory_.Create(id.To<cc::SurfaceId>(), size.To<gfx::Size>());
37116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
38116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
39116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid SurfacesImpl::SubmitFrame(SurfaceIdPtr id, FramePtr frame_ptr) {
40116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  cc::SurfaceId cc_id = id.To<cc::SurfaceId>();
41116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (cc::SurfaceIdAllocator::NamespaceForId(cc_id) != id_namespace_) {
42116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // Bad message, do something bad to the caller?
4303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    LOG(FATAL) << "Received frame for id " << cc_id.id << " namespace "
4403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)               << cc::SurfaceIdAllocator::NamespaceForId(cc_id)
4503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)               << " should be namespace " << id_namespace_;
46116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return;
47116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  factory_.SubmitFrame(id.To<cc::SurfaceId>(),
491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                       frame_ptr.To<scoped_ptr<cc::CompositorFrame> >(),
501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                       base::Closure());
515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  client_->FrameSubmitted();
52116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
53116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
54116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid SurfacesImpl::DestroySurface(SurfaceIdPtr id) {
55116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  cc::SurfaceId cc_id = id.To<cc::SurfaceId>();
56116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (cc::SurfaceIdAllocator::NamespaceForId(cc_id) != id_namespace_) {
57116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // Bad message, do something bad to the caller?
58116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    NOTREACHED();
59116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return;
60116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
61116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  factory_.Destroy(id.To<cc::SurfaceId>());
62116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
63116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
64116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid SurfacesImpl::CreateGLES2BoundSurface(CommandBufferPtr gles2_client,
65116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                           SurfaceIdPtr id,
66116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                           mojo::SizePtr size) {
67116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  command_buffer_handle_ = gles2_client.PassMessagePipe();
68116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
69116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  cc::SurfaceId cc_id = id.To<cc::SurfaceId>();
70116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (cc::SurfaceIdAllocator::NamespaceForId(cc_id) != id_namespace_) {
71116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // Bad message, do something bad to the caller?
7203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    LOG(FATAL) << "Received request for id " << cc_id.id << " namespace "
7303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)               << cc::SurfaceIdAllocator::NamespaceForId(cc_id)
7403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)               << " should be namespace " << id_namespace_;
75116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return;
76116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
77116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (!display_) {
785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    display_.reset(new cc::Display(this, manager_, NULL));
795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    client_->SetDisplay(display_.get());
80116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
81116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  factory_.Create(cc_id, size.To<gfx::Size>());
82116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  display_->Resize(cc_id, size.To<gfx::Size>());
83116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
84116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
85116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid SurfacesImpl::ReturnResources(const cc::ReturnedResourceArray& resources) {
86116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  Array<ReturnedResourcePtr> ret(resources.size());
87116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  for (size_t i = 0; i < resources.size(); ++i) {
88116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    ret[i] = ReturnedResource::From(resources[i]);
89116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
90116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  client()->ReturnResources(ret.Pass());
91116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
92116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
93116680a4aac90f2aa7413d9095a592090648e557Ben Murdochscoped_ptr<cc::OutputSurface> SurfacesImpl::CreateOutputSurface() {
94116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return make_scoped_ptr(new cc::OutputSurface(
95116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      new ContextProviderMojo(command_buffer_handle_.Pass())));
96116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
97116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
9803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void SurfacesImpl::DisplayDamaged() {
9903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
10003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid SurfacesImpl::DidSwapBuffers() {
1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid SurfacesImpl::DidSwapBuffersComplete() {
1051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid SurfacesImpl::CommitVSyncParameters(base::TimeTicks timebase,
1081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                         base::TimeDelta interval) {
1091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
111116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}  // namespace mojo
112