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