Home | History | Annotate | Download | only in native_viewport
      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 
     14 namespace mojo {
     15 
     16 ViewportSurface::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 
     30 ViewportSurface::~ViewportSurface() {
     31 }
     32 
     33 void ViewportSurface::SetWidgetId(uint64_t widget_id) {
     34   widget_id_ = widget_id;
     35   if (id_allocator_)
     36     BindSurfaceToNativeViewport();
     37 }
     38 
     39 void 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 
     51 void ViewportSurface::SetChildId(cc::SurfaceId child_id) {
     52   child_id_ = child_id;
     53   SubmitFrame();
     54 }
     55 
     56 void 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 
     65 void 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 
     77 void 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 
    106 void 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