Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(199)

Side by Side Diff: services/native_viewport/viewport_surface.cc

Issue 826423008: Use local ids for Surfaces APIs that can only apply to local surfaces (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: Created 5 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « services/native_viewport/viewport_surface.h ('k') | services/surfaces/surfaces_impl.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "services/native_viewport/viewport_surface.h" 5 #include "services/native_viewport/viewport_surface.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "cc/surfaces/surface_id_allocator.h"
9 #include "mojo/converters/geometry/geometry_type_converters.h" 8 #include "mojo/converters/geometry/geometry_type_converters.h"
10 #include "mojo/converters/surfaces/surfaces_type_converters.h" 9 #include "mojo/converters/surfaces/surfaces_type_converters.h"
11 #include "mojo/services/surfaces/public/cpp/surfaces_utils.h" 10 #include "mojo/services/surfaces/public/cpp/surfaces_utils.h"
12 #include "ui/gfx/transform.h" 11 #include "ui/gfx/transform.h"
13 12
14 using mojo::Size; 13 using mojo::Size;
15 using mojo::SurfaceId; 14 using mojo::SurfaceId;
16 15
16 static uint32_t kGLES2BoundSurfaceLocalId = 1u;
17
17 namespace native_viewport { 18 namespace native_viewport {
18 19
19 ViewportSurface::ViewportSurface(mojo::SurfacesService* surfaces_service, 20 ViewportSurface::ViewportSurface(mojo::SurfacePtr surface,
20 mojo::Gpu* gpu_service, 21 mojo::Gpu* gpu_service,
21 const gfx::Size& size, 22 const gfx::Size& size,
22 cc::SurfaceId child_id) 23 cc::SurfaceId child_id)
23 : gpu_service_(gpu_service), 24 : surface_(surface.Pass()),
25 gpu_service_(gpu_service),
24 widget_id_(0u), 26 widget_id_(0u),
25 size_(size), 27 size_(size),
28 gles2_bound_surface_created_(false),
26 child_id_(child_id), 29 child_id_(child_id),
27 weak_factory_(this) { 30 weak_factory_(this) {
28 surfaces_service->CreateSurfaceConnection( 31 surface_.set_client(this);
29 base::Bind(&ViewportSurface::OnSurfaceConnectionCreated,
30 weak_factory_.GetWeakPtr()));
31 } 32 }
32 33
33 ViewportSurface::~ViewportSurface() { 34 ViewportSurface::~ViewportSurface() {
34 } 35 }
35 36
36 void ViewportSurface::SetWidgetId(uint64_t widget_id) { 37 void ViewportSurface::SetWidgetId(uint64_t widget_id) {
37 widget_id_ = widget_id; 38 widget_id_ = widget_id;
38 if (id_allocator_) 39 BindSurfaceToNativeViewport();
39 BindSurfaceToNativeViewport();
40 } 40 }
41 41
42 void ViewportSurface::SetSize(const gfx::Size& size) { 42 void ViewportSurface::SetSize(const gfx::Size& size) {
43 if (size_ == size) 43 if (size_ == size)
44 return; 44 return;
45 45
46 size_ = size; 46 size_ = size;
47 if (id_.is_null()) 47 if (!gles2_bound_surface_created_)
48 return; 48 return;
49 49
50 surface_->DestroySurface(SurfaceId::From(id_)); 50 surface_->DestroySurface(kGLES2BoundSurfaceLocalId);
51 if (widget_id_) 51 if (widget_id_)
52 BindSurfaceToNativeViewport(); 52 BindSurfaceToNativeViewport();
53 } 53 }
54 54
55 void ViewportSurface::SetChildId(cc::SurfaceId child_id) { 55 void ViewportSurface::SetChildId(cc::SurfaceId child_id) {
56 child_id_ = child_id; 56 child_id_ = child_id;
57 SubmitFrame(); 57 SubmitFrame();
58 } 58 }
59 59
60 void ViewportSurface::OnSurfaceConnectionCreated(mojo::SurfacePtr surface,
61 uint32_t id_namespace) {
62 surface_ = surface.Pass();
63 surface_.set_client(this);
64 id_allocator_.reset(new cc::SurfaceIdAllocator(id_namespace));
65 if (widget_id_ != 0u)
66 BindSurfaceToNativeViewport();
67 }
68
69 void ViewportSurface::BindSurfaceToNativeViewport() { 60 void ViewportSurface::BindSurfaceToNativeViewport() {
70 mojo::ViewportParameterListenerPtr listener; 61 mojo::ViewportParameterListenerPtr listener;
71 auto listener_request = GetProxy(&listener); 62 auto listener_request = GetProxy(&listener);
72 mojo::CommandBufferPtr command_buffer; 63 mojo::CommandBufferPtr command_buffer;
73 gpu_service_->CreateOnscreenGLES2Context(widget_id_, Size::From(size_), 64 gpu_service_->CreateOnscreenGLES2Context(widget_id_, Size::From(size_),
74 GetProxy(&command_buffer), 65 GetProxy(&command_buffer),
75 listener.Pass()); 66 listener.Pass());
76 67
77 id_ = id_allocator_->GenerateId(); 68 gles2_bound_surface_created_ = true;
78 surface_->CreateGLES2BoundSurface(command_buffer.Pass(), SurfaceId::From(id_), 69 surface_->CreateGLES2BoundSurface(command_buffer.Pass(),
70 kGLES2BoundSurfaceLocalId,
79 Size::From(size_), listener_request.Pass()); 71 Size::From(size_), listener_request.Pass());
80 72
81 SubmitFrame(); 73 SubmitFrame();
82 } 74 }
83 75
84 void ViewportSurface::SubmitFrame() { 76 void ViewportSurface::SubmitFrame() {
85 if (child_id_.is_null() || id_.is_null()) 77 if (child_id_.is_null() || !gles2_bound_surface_created_)
86 return; 78 return;
87 79
88 auto surface_quad_state = mojo::SurfaceQuadState::New(); 80 auto surface_quad_state = mojo::SurfaceQuadState::New();
89 surface_quad_state->surface = SurfaceId::From(child_id_); 81 surface_quad_state->surface = SurfaceId::From(child_id_);
90 82
91 gfx::Rect bounds(size_); 83 gfx::Rect bounds(size_);
92 84
93 auto surface_quad = mojo::Quad::New(); 85 auto surface_quad = mojo::Quad::New();
94 surface_quad->material = mojo::Material::MATERIAL_SURFACE_CONTENT; 86 surface_quad->material = mojo::Material::MATERIAL_SURFACE_CONTENT;
95 surface_quad->rect = mojo::Rect::From(bounds); 87 surface_quad->rect = mojo::Rect::From(bounds);
96 surface_quad->opaque_rect = mojo::Rect::From(bounds); 88 surface_quad->opaque_rect = mojo::Rect::From(bounds);
97 surface_quad->visible_rect = mojo::Rect::From(bounds); 89 surface_quad->visible_rect = mojo::Rect::From(bounds);
98 surface_quad->needs_blending = true; 90 surface_quad->needs_blending = true;
99 surface_quad->shared_quad_state_index = 0; 91 surface_quad->shared_quad_state_index = 0;
100 surface_quad->surface_quad_state = surface_quad_state.Pass(); 92 surface_quad->surface_quad_state = surface_quad_state.Pass();
101 93
102 auto pass = CreateDefaultPass(1, *mojo::Rect::From(bounds)); 94 auto pass = CreateDefaultPass(1, *mojo::Rect::From(bounds));
103 95
104 pass->quads.push_back(surface_quad.Pass()); 96 pass->quads.push_back(surface_quad.Pass());
105 pass->shared_quad_states.push_back(CreateDefaultSQS( 97 pass->shared_quad_states.push_back(CreateDefaultSQS(
106 *mojo::Size::From(size_))); 98 *mojo::Size::From(size_)));
107 99
108 auto frame = mojo::Frame::New(); 100 auto frame = mojo::Frame::New();
109 frame->passes.push_back(pass.Pass()); 101 frame->passes.push_back(pass.Pass());
110 frame->resources.resize(0u); 102 frame->resources.resize(0u);
111 surface_->SubmitFrame(SurfaceId::From(id_), frame.Pass(), mojo::Closure()); 103 surface_->SubmitFrame(kGLES2BoundSurfaceLocalId, frame.Pass(),
104 mojo::Closure());
112 } 105 }
113 106
114 void ViewportSurface::SetIdNamespace(uint32_t id_namespace) { 107 void ViewportSurface::SetIdNamespace(uint32_t id_namespace) {
108 // We never pass our surface ID to anyone else, so we never need to generate a
109 // fully qualified id and thus don't care about our namespace.
115 } 110 }
116 111
117 void ViewportSurface::ReturnResources( 112 void ViewportSurface::ReturnResources(
118 mojo::Array<mojo::ReturnedResourcePtr> resources) { 113 mojo::Array<mojo::ReturnedResourcePtr> resources) {
119 // We never submit resources so we should never get any back. 114 // We never submit resources so we should never get any back.
120 DCHECK_EQ(0u, resources.size()); 115 DCHECK_EQ(0u, resources.size());
121 } 116 }
122 117
123 } // namespace native_viewport 118 } // namespace native_viewport
OLDNEW
« no previous file with comments | « services/native_viewport/viewport_surface.h ('k') | services/surfaces/surfaces_impl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698