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

Side by Side Diff: remoting/client/ios/display/gl_display_handler.mm

Issue 2856933007: [Remoting iOS] Basic viewport manipulation support (Closed)
Patch Set: Move the delegate getter/setting to the bottom Created 3 years, 7 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
OLDNEW
1 // Copyright 2017 The Chromium Authors. All rights reserved. 1 // Copyright 2017 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 #if !defined(__has_feature) || !__has_feature(objc_arc) 5 #if !defined(__has_feature) || !__has_feature(objc_arc)
6 #error "This file requires ARC support." 6 #error "This file requires ARC support."
7 #endif 7 #endif
8 8
9 #include <array> 9 #include <array>
10 10
11 #import "remoting/client/ios/display/gl_display_handler.h" 11 #import "remoting/client/ios/display/gl_display_handler.h"
12 12
13 #import "base/mac/bind_objc_block.h" 13 #import "base/mac/bind_objc_block.h"
14 #import "remoting/client/display/sys_opengl.h" 14 #import "remoting/client/display/sys_opengl.h"
15 #import "remoting/client/ios/display/gl_demo_screen.h" 15 #import "remoting/client/ios/display/gl_demo_screen.h"
16 16
17 #include "base/bind.h" 17 #include "base/bind.h"
18 #include "base/macros.h" 18 #include "base/macros.h"
19 #include "base/memory/ptr_util.h" 19 #include "base/memory/ptr_util.h"
20 #include "base/memory/weak_ptr.h" 20 #include "base/memory/weak_ptr.h"
21 #include "remoting/client/chromoting_client_runtime.h" 21 #include "remoting/client/chromoting_client_runtime.h"
22 #include "remoting/client/cursor_shape_stub_proxy.h" 22 #include "remoting/client/cursor_shape_stub_proxy.h"
23 #include "remoting/client/display/gl_canvas.h" 23 #include "remoting/client/display/gl_canvas.h"
24 #include "remoting/client/display/gl_renderer.h" 24 #include "remoting/client/display/gl_renderer.h"
25 #include "remoting/client/display/gl_renderer_delegate.h" 25 #include "remoting/client/display/gl_renderer_delegate.h"
26 #include "remoting/client/dual_buffer_frame_consumer.h" 26 #include "remoting/client/dual_buffer_frame_consumer.h"
27 #include "remoting/client/queued_task_poster.h"
27 #include "remoting/client/software_video_renderer.h" 28 #include "remoting/client/software_video_renderer.h"
28 29
29 namespace remoting { 30 namespace remoting {
30 namespace GlDisplayHandler { 31 namespace GlDisplayHandler {
31 32
32 // The core that lives on the display thread. 33 // The core that lives on the display thread.
33 class Core : public protocol::CursorShapeStub, public GlRendererDelegate { 34 class Core : public protocol::CursorShapeStub, public GlRendererDelegate {
34 public: 35 public:
35 Core(); 36 Core();
36 ~Core() override; 37 ~Core() override;
37 38
38 void Initialize(); 39 void Initialize();
39 40
41 void SetHandlerDelegate(id<GlDisplayHandlerDelegate> delegate);
42
40 // CursorShapeStub interface. 43 // CursorShapeStub interface.
41 void SetCursorShape(const protocol::CursorShapeInfo& cursor_shape) override; 44 void SetCursorShape(const protocol::CursorShapeInfo& cursor_shape) override;
42 45
43 // GlRendererDelegate interface. 46 // GlRendererDelegate interface.
44 bool CanRenderFrame() override; 47 bool CanRenderFrame() override;
45 void OnFrameRendered() override; 48 void OnFrameRendered() override;
46 void OnSizeChanged(int width, int height) override; 49 void OnSizeChanged(int width, int height) override;
47 50
48 void OnFrameReceived(std::unique_ptr<webrtc::DesktopFrame> frame, 51 void OnFrameReceived(std::unique_ptr<webrtc::DesktopFrame> frame,
49 const base::Closure& done); 52 const base::Closure& done);
50 void Stop(); 53 void Stop();
51 void SurfaceCreated(GLKView* view); 54 void SurfaceCreated(GLKView* view);
52 void SurfaceChanged(int width, int height); 55 void SurfaceChanged(int width, int height);
56 void SetTransformation(const remoting::ViewMatrix& matrix);
53 std::unique_ptr<protocol::FrameConsumer> GrabFrameConsumer(); 57 std::unique_ptr<protocol::FrameConsumer> GrabFrameConsumer();
54 EAGLContext* GetEAGLContext(); 58 EAGLContext* GetEAGLContext();
55 base::WeakPtr<Core> GetWeakPtr(); 59 base::WeakPtr<Core> GetWeakPtr();
56 60
57 private: 61 private:
58 remoting::ChromotingClientRuntime* runtime_; 62 remoting::ChromotingClientRuntime* runtime_;
59 63
60 // Will be std::move'd when GrabFrameConsumer() is called. 64 // Will be std::move'd when GrabFrameConsumer() is called.
61 std::unique_ptr<DualBufferFrameConsumer> owned_frame_consumer_; 65 std::unique_ptr<DualBufferFrameConsumer> owned_frame_consumer_;
62 base::WeakPtr<DualBufferFrameConsumer> frame_consumer_; 66 base::WeakPtr<DualBufferFrameConsumer> frame_consumer_;
63 67
68 // TODO(yuweih): Release references once the surface is destroyed.
64 GLKView* gl_view_; 69 GLKView* gl_view_;
65 EAGLContext* eagl_context_; 70 EAGLContext* eagl_context_;
66 std::unique_ptr<GlRenderer> renderer_; 71 std::unique_ptr<GlRenderer> renderer_;
67 // GlDemoScreen *demo_screen_; 72 // GlDemoScreen *demo_screen_;
73 id<GlDisplayHandlerDelegate> handler_delegate_;
68 74
69 // Used on display thread. 75 // Used on display thread.
70 base::WeakPtr<Core> weak_ptr_; 76 base::WeakPtr<Core> weak_ptr_;
71 base::WeakPtrFactory<Core> weak_factory_; 77 base::WeakPtrFactory<Core> weak_factory_;
72 78
73 DISALLOW_COPY_AND_ASSIGN(Core); 79 DISALLOW_COPY_AND_ASSIGN(Core);
74 }; 80 };
75 81
76 Core::Core() : weak_factory_(this) { 82 Core::Core() : weak_factory_(this) {
77 runtime_ = ChromotingClientRuntime::GetInstance(); 83 runtime_ = ChromotingClientRuntime::GetInstance();
(...skipping 30 matching lines...) Expand all
108 114
109 renderer_ = remoting::GlRenderer::CreateGlRendererWithDesktop(); 115 renderer_ = remoting::GlRenderer::CreateGlRendererWithDesktop();
110 116
111 // renderer_.RequestCanvasSize(); 117 // renderer_.RequestCanvasSize();
112 118
113 // demo_screen_ = new GlDemoScreen(); 119 // demo_screen_ = new GlDemoScreen();
114 // renderer_->AddDrawable(demo_screen_->GetWeakPtr()); 120 // renderer_->AddDrawable(demo_screen_->GetWeakPtr());
115 renderer_->SetDelegate(weak_ptr_); 121 renderer_->SetDelegate(weak_ptr_);
116 } 122 }
117 123
124 void Core::SetHandlerDelegate(id<GlDisplayHandlerDelegate> delegate) {
125 DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread());
126 handler_delegate_ = delegate;
127 }
128
118 void Core::SetCursorShape(const protocol::CursorShapeInfo& cursor_shape) { 129 void Core::SetCursorShape(const protocol::CursorShapeInfo& cursor_shape) {
119 DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread()); 130 DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread());
120 renderer_->OnCursorShapeChanged(cursor_shape); 131 renderer_->OnCursorShapeChanged(cursor_shape);
121 } 132 }
122 133
123 bool Core::CanRenderFrame() { 134 bool Core::CanRenderFrame() {
124 DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread()); 135 DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread());
125 return gl_view_ != NULL && eagl_context_ != NULL; 136 return gl_view_ != NULL && eagl_context_ != NULL;
126 } 137 }
127 138
128 std::unique_ptr<protocol::FrameConsumer> Core::GrabFrameConsumer() { 139 std::unique_ptr<protocol::FrameConsumer> Core::GrabFrameConsumer() {
129 DCHECK(owned_frame_consumer_) << "The frame consumer is already grabbed."; 140 DCHECK(owned_frame_consumer_) << "The frame consumer is already grabbed.";
130 return std::move(owned_frame_consumer_); 141 return std::move(owned_frame_consumer_);
131 } 142 }
132 143
133 void Core::OnFrameReceived(std::unique_ptr<webrtc::DesktopFrame> frame, 144 void Core::OnFrameReceived(std::unique_ptr<webrtc::DesktopFrame> frame,
134 const base::Closure& done) { 145 const base::Closure& done) {
135 DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread()); 146 DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread());
136 renderer_->OnFrameReceived(std::move(frame), done); 147 renderer_->OnFrameReceived(std::move(frame), done);
137 } 148 }
138 149
139 void Core::OnFrameRendered() { 150 void Core::OnFrameRendered() {
140 [gl_view_ setNeedsDisplay]; 151 [gl_view_ display];
141 } 152 }
142 153
143 void Core::OnSizeChanged(int width, int height) { 154 void Core::OnSizeChanged(int width, int height) {
144 // Nothing to do. 155 DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread());
156 runtime_->ui_task_runner()->PostTask(
157 FROM_HERE, base::BindBlockArc(^() {
158 [handler_delegate_ canvasSizeChanged:CGSizeMake(width, height)];
159 }));
145 } 160 }
146 161
147 void Core::Stop() { 162 void Core::Stop() {
148 DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread()); 163 DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread());
149 164
150 eagl_context_ = nil; 165 eagl_context_ = nil;
151 // demo_screen_ = nil; 166 // demo_screen_ = nil;
152 } 167 }
153 168
154 void Core::SurfaceCreated(GLKView* view) { 169 void Core::SurfaceCreated(GLKView* view) {
155 DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread()); 170 DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread());
156 gl_view_ = view; 171 gl_view_ = view;
157 172
158 renderer_->OnSurfaceCreated( 173 renderer_->OnSurfaceCreated(
159 base::MakeUnique<GlCanvas>(static_cast<int>([eagl_context_ API]))); 174 base::MakeUnique<GlCanvas>(static_cast<int>([eagl_context_ API])));
160 175
176 renderer_->RequestCanvasSize();
177
161 runtime_->network_task_runner()->PostTask( 178 runtime_->network_task_runner()->PostTask(
162 FROM_HERE, base::Bind(&DualBufferFrameConsumer::RequestFullDesktopFrame, 179 FROM_HERE, base::Bind(&DualBufferFrameConsumer::RequestFullDesktopFrame,
163 frame_consumer_)); 180 frame_consumer_));
164 } 181 }
165 182
166 void Core::SurfaceChanged(int width, int height) { 183 void Core::SurfaceChanged(int width, int height) {
167 DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread()); 184 DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread());
168 renderer_->OnSurfaceChanged(width, height); 185 renderer_->OnSurfaceChanged(width, height);
186 }
169 187
170 // TODO(nicholss): This are wrong values but it lets us get something on the 188 void Core::SetTransformation(const remoting::ViewMatrix& matrix) {
171 // screen. 189 DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread());
172 std::array<float, 9> matrix = {{1, 0, 0, // Row 1 190 renderer_->OnPixelTransformationChanged(matrix.ToMatrixArray());
173 0, 1, 0, // Row 2
174 0, 0, 1}};
175
176 renderer_->OnPixelTransformationChanged(matrix);
177 } 191 }
178 192
179 EAGLContext* Core::GetEAGLContext() { 193 EAGLContext* Core::GetEAGLContext() {
180 return eagl_context_; 194 return eagl_context_;
181 } 195 }
182 196
183 base::WeakPtr<remoting::GlDisplayHandler::Core> Core::GetWeakPtr() { 197 base::WeakPtr<remoting::GlDisplayHandler::Core> Core::GetWeakPtr() {
184 return weak_ptr_; 198 return weak_ptr_;
185 } 199 }
186 200
187 } // namespace GlDisplayHandler 201 } // namespace GlDisplayHandler
188 } // namespace remoting 202 } // namespace remoting
189 203
190 @interface GlDisplayHandler () { 204 @interface GlDisplayHandler () {
191 remoting::GlDisplayHandler::Core* _core; 205 remoting::GlDisplayHandler::Core* _core;
192 remoting::ChromotingClientRuntime* _runtime; 206 remoting::ChromotingClientRuntime* _runtime;
207 std::unique_ptr<remoting::QueuedTaskPoster> _uiTaskPoster;
193 } 208 }
194 @end 209 @end
195 210
196 @implementation GlDisplayHandler 211 @implementation GlDisplayHandler
197 212
198 - (id)init { 213 - (id)init {
199 self = [super init]; 214 self = [super init];
200 if (self) { 215 if (self) {
201 _runtime = remoting::ChromotingClientRuntime::GetInstance(); 216 _runtime = remoting::ChromotingClientRuntime::GetInstance();
202 _core = new remoting::GlDisplayHandler::Core(); 217 _core = new remoting::GlDisplayHandler::Core();
218 _uiTaskPoster.reset(
219 new remoting::QueuedTaskPoster(_runtime->display_task_runner()));
203 } 220 }
204 return self; 221 return self;
205 } 222 }
206 223
207 #pragma mark - Public 224 #pragma mark - Public
208 225
209 - (void)stop { 226 - (void)stop {
210 _runtime->display_task_runner()->PostTask( 227 _runtime->display_task_runner()->PostTask(
211 FROM_HERE, 228 FROM_HERE,
212 base::Bind(&remoting::GlDisplayHandler::Core::Stop, _core->GetWeakPtr())); 229 base::Bind(&remoting::GlDisplayHandler::Core::Stop, _core->GetWeakPtr()));
(...skipping 19 matching lines...) Expand all
232 _core->GetWeakPtr(), view)); 249 _core->GetWeakPtr(), view));
233 } 250 }
234 251
235 - (void)onSurfaceChanged:(const CGRect&)frame { 252 - (void)onSurfaceChanged:(const CGRect&)frame {
236 _runtime->display_task_runner()->PostTask( 253 _runtime->display_task_runner()->PostTask(
237 FROM_HERE, 254 FROM_HERE,
238 base::Bind(&remoting::GlDisplayHandler::Core::SurfaceChanged, 255 base::Bind(&remoting::GlDisplayHandler::Core::SurfaceChanged,
239 _core->GetWeakPtr(), frame.size.width, frame.size.height)); 256 _core->GetWeakPtr(), frame.size.width, frame.size.height));
240 } 257 }
241 258
242 // TODO(nicholss): Remove this function, it is not used in the final impl, 259 - (void)onPixelTransformationChanged:(const remoting::ViewMatrix&)matrix {
243 // or it should call RequestRender. 260 _uiTaskPoster->AddTask(
244 - (void)glkView:(GLKView*)view drawInRect:(CGRect)rect { 261 base::Bind(&remoting::GlDisplayHandler::Core::SetTransformation,
245 if (_core) { 262 _core->GetWeakPtr(), matrix));
246 _runtime->display_task_runner()->PostTask( 263 }
247 FROM_HERE, 264
248 base::Bind(&remoting::GlDisplayHandler::Core::SurfaceChanged, 265 #pragma mark - Properties
249 _core->GetWeakPtr(), rect.size.width, rect.size.height)); 266
250 } 267 - (void)setDelegate:(id<GlDisplayHandlerDelegate>)delegate {
268 _runtime->display_task_runner()->PostTask(
269 FROM_HERE,
270 base::Bind(&remoting::GlDisplayHandler::Core::SetHandlerDelegate,
271 _core->GetWeakPtr(), delegate));
272 }
273
274 - (id<GlDisplayHandlerDelegate>)delegate {
275 // Implementation is still required for UNAVAILABLE_ATTRIBUTE.
276 NOTREACHED();
277 return nil;
251 } 278 }
252 279
253 @end 280 @end
OLDNEW
« no previous file with comments | « remoting/client/ios/display/gl_display_handler.h ('k') | remoting/client/ios/session/remoting_client.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698