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 5#include "mojo/services/native_viewport/viewport_surface.h" 6 7#include "base/bind.h" 8#include "cc/surfaces/surface_id_allocator.h" 9#include "mojo/services/public/cpp/geometry/geometry_type_converters.h" 10#include "mojo/services/public/cpp/surfaces/surfaces_type_converters.h" 11#include "mojo/services/public/cpp/surfaces/surfaces_utils.h" 12#include "ui/gfx/transform.h" 13 14namespace mojo { 15 16ViewportSurface::ViewportSurface(SurfacesService* surfaces_service, 17 Gpu* gpu_service, 18 const gfx::Size& size, 19 cc::SurfaceId child_id) 20 : gpu_service_(gpu_service), 21 widget_id_(0u), 22 size_(size), 23 child_id_(child_id), 24 weak_factory_(this) { 25 surfaces_service->CreateSurfaceConnection( 26 base::Bind(&ViewportSurface::OnSurfaceConnectionCreated, 27 weak_factory_.GetWeakPtr())); 28} 29 30ViewportSurface::~ViewportSurface() { 31} 32 33void ViewportSurface::SetWidgetId(uint64_t widget_id) { 34 widget_id_ = widget_id; 35 if (id_allocator_) 36 BindSurfaceToNativeViewport(); 37} 38 39void ViewportSurface::SetSize(const gfx::Size& size) { 40 if (size_ == size) 41 return; 42 43 if (id_.is_null()) 44 return; 45 46 surface_->DestroySurface(SurfaceId::From(id_)); 47 if (widget_id_) 48 BindSurfaceToNativeViewport(); 49} 50 51void ViewportSurface::SetChildId(cc::SurfaceId child_id) { 52 child_id_ = child_id; 53 SubmitFrame(); 54} 55 56void ViewportSurface::OnSurfaceConnectionCreated(SurfacePtr surface, 57 uint32_t id_namespace) { 58 surface_ = surface.Pass(); 59 surface_.set_client(this); 60 id_allocator_.reset(new cc::SurfaceIdAllocator(id_namespace)); 61 if (widget_id_ != 0u) 62 BindSurfaceToNativeViewport(); 63} 64 65void ViewportSurface::BindSurfaceToNativeViewport() { 66 CommandBufferPtr cb; 67 gpu_service_->CreateOnscreenGLES2Context( 68 widget_id_, Size::From(size_), Get(&cb)); 69 70 id_ = id_allocator_->GenerateId(); 71 surface_->CreateGLES2BoundSurface( 72 cb.Pass(), SurfaceId::From(id_), Size::From(size_)); 73 74 SubmitFrame(); 75} 76 77void ViewportSurface::SubmitFrame() { 78 if (child_id_.is_null() || id_.is_null()) 79 return; 80 81 SurfaceQuadStatePtr surface_quad_state = SurfaceQuadState::New(); 82 surface_quad_state->surface = SurfaceId::From(child_id_); 83 84 gfx::Rect bounds(size_); 85 86 QuadPtr surface_quad = Quad::New(); 87 surface_quad->material = Material::MATERIAL_SURFACE_CONTENT; 88 surface_quad->rect = Rect::From(bounds); 89 surface_quad->opaque_rect = Rect::From(bounds); 90 surface_quad->visible_rect = Rect::From(bounds); 91 surface_quad->needs_blending = true; 92 surface_quad->shared_quad_state_index = 0; 93 surface_quad->surface_quad_state = surface_quad_state.Pass(); 94 95 PassPtr pass = CreateDefaultPass(1, bounds); 96 97 pass->quads.push_back(surface_quad.Pass()); 98 pass->shared_quad_states.push_back(CreateDefaultSQS(size_)); 99 100 FramePtr frame = Frame::New(); 101 frame->passes.push_back(pass.Pass()); 102 frame->resources.resize(0u); 103 surface_->SubmitFrame(SurfaceId::From(id_), frame.Pass()); 104} 105 106void ViewportSurface::ReturnResources(Array<ReturnedResourcePtr> resources) { 107 // We never submit resources so we should never get any back. 108 DCHECK_EQ(0u, resources.size()); 109} 110 111} // namespace mojo 112