Upstream version 10.39.225.0
[platform/framework/web/crosswalk.git] / src / mojo / services / native_viewport / viewport_surface.cc
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