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

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

Issue 2805963002: Adding session object for iOS to integerate client sessions. (Closed)
Patch Set: Updating display handler to use correct paths. Created 3 years, 8 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 9 #import "remoting/client/ios/display/gl_display_handler.h"
10 #import <Foundation/Foundation.h>
11 #import <GLKit/GLKit.h>
12 10
13 #import "remoting/client/display/sys_opengl.h" 11 #import "remoting/client/display/sys_opengl.h"
14 #import "remoting/client/ios/display/gl_demo_screen.h" 12 #import "remoting/client/ios/display/gl_demo_screen.h"
15 #import "remoting/client/ios/display/gl_display_handler.h"
16 13
14 #include "base/bind.h"
17 #include "base/macros.h" 15 #include "base/macros.h"
18 #include "base/memory/ptr_util.h" 16 #include "base/memory/ptr_util.h"
19 #include "base/memory/weak_ptr.h" 17 #include "base/memory/weak_ptr.h"
20 #include "remoting/client/chromoting_client.h" 18 #include "remoting/client/chromoting_client.h"
19 #include "remoting/client/chromoting_client_runtime.h"
20 #include "remoting/client/cursor_shape_stub_proxy.h"
21 #include "remoting/client/display/gl_canvas.h" 21 #include "remoting/client/display/gl_canvas.h"
22 #include "remoting/client/display/gl_renderer.h" 22 #include "remoting/client/display/gl_renderer.h"
23 #include "remoting/client/display/gl_renderer_delegate.h" 23 #include "remoting/client/display/gl_renderer_delegate.h"
24 #include "remoting/client/dual_buffer_frame_consumer.h" 24 #include "remoting/client/dual_buffer_frame_consumer.h"
25 #include "remoting/client/ios/app_runtime.h"
26 #include "remoting/client/software_video_renderer.h" 25 #include "remoting/client/software_video_renderer.h"
27 26
28 namespace remoting { 27 namespace remoting {
29 namespace GlDisplayHandler { 28 namespace GlDisplayHandler {
30 29
31 // The core that lives on the display thread. 30 // The core that lives on the display thread.
32 class Core : public GlRendererDelegate { 31 class Core : public protocol::CursorShapeStub, public GlRendererDelegate {
33 public: 32 public:
34 Core(remoting::ios::AppRuntime* runtime); 33 Core();
35 ~Core() override; 34 ~Core() override;
36 35
36 // CursorShapeStub interface.
37 void SetCursorShape(const protocol::CursorShapeInfo& cursor_shape) override;
38
37 // GlRendererDelegate interface. 39 // GlRendererDelegate interface.
38 bool CanRenderFrame() override; 40 bool CanRenderFrame() override;
39 void OnFrameRendered() override; 41 void OnFrameRendered() override;
40 void OnSizeChanged(int width, int height) override; 42 void OnSizeChanged(int width, int height) override;
41 43
42 void Created(); 44 void Created();
45 void Stop();
43 void SurfaceChanged(int width, int height); 46 void SurfaceChanged(int width, int height);
44 std::unique_ptr<protocol::FrameConsumer> GrabFrameConsumer(); 47 std::unique_ptr<protocol::FrameConsumer> GrabFrameConsumer();
45 base::WeakPtr<Core> GetWeakPtr(); 48 base::WeakPtr<Core> GetWeakPtr();
46 49
47 private: 50 private:
48 // Will be std::move'd when GrabFrameConsumer() is called. 51 // Will be std::move'd when GrabFrameConsumer() is called.
49 remoting::ios::AppRuntime* runtime_; 52 remoting::ChromotingClientRuntime* runtime_;
50 std::unique_ptr<DualBufferFrameConsumer> owned_frame_consumer_; 53 std::unique_ptr<DualBufferFrameConsumer> owned_frame_consumer_;
51 54
52 base::WeakPtr<DualBufferFrameConsumer> frame_consumer_; 55 base::WeakPtr<DualBufferFrameConsumer> frame_consumer_;
53 EAGLContext* eagl_context_; 56 EAGLContext* eagl_context_;
54 GlRenderer renderer_; 57 GlRenderer renderer_;
55 GlDemoScreen demo_screen_; 58 GlDemoScreen demo_screen_;
56 59
57 // Used on display thread. 60 // Used on display thread.
58 base::WeakPtr<Core> weak_ptr_; 61 base::WeakPtr<Core> weak_ptr_;
59 base::WeakPtrFactory<Core> weak_factory_; 62 base::WeakPtrFactory<Core> weak_factory_;
60 63
61 DISALLOW_COPY_AND_ASSIGN(Core); 64 DISALLOW_COPY_AND_ASSIGN(Core);
62 }; 65 };
63 66
64 Core::Core(remoting::ios::AppRuntime* runtime) 67 Core::Core() : weak_factory_(this) {
65 : runtime_(runtime), weak_factory_(this) { 68 runtime_ = ChromotingClientRuntime::GetInstance();
66 weak_ptr_ = weak_factory_.GetWeakPtr(); 69 weak_ptr_ = weak_factory_.GetWeakPtr();
67 renderer_.SetDelegate(weak_ptr_); 70 renderer_.SetDelegate(weak_ptr_);
68 owned_frame_consumer_.reset(new remoting::DualBufferFrameConsumer( 71 owned_frame_consumer_.reset(new remoting::DualBufferFrameConsumer(
69 base::Bind(&remoting::GlRenderer::OnFrameReceived, 72 base::Bind(&remoting::GlRenderer::OnFrameReceived,
70 renderer_.GetWeakPtr()), 73 renderer_.GetWeakPtr()),
71 runtime_->display_task_runner(), 74 runtime_->display_task_runner(),
72 remoting::protocol::FrameConsumer::PixelFormat::FORMAT_RGBA)); 75 remoting::protocol::FrameConsumer::PixelFormat::FORMAT_RGBA));
73 frame_consumer_ = owned_frame_consumer_->GetWeakPtr(); 76 frame_consumer_ = owned_frame_consumer_->GetWeakPtr();
74 renderer_.AddDrawable(demo_screen_.GetWeakPtr()); 77 renderer_.AddDrawable(demo_screen_.GetWeakPtr());
75 } 78 }
76 79
77 Core::~Core() {} 80 Core::~Core() {}
78 81
82 void Core::SetCursorShape(const protocol::CursorShapeInfo& cursor_shape) {
83 DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread());
84 renderer_.OnCursorShapeChanged(cursor_shape);
85 }
86
79 bool Core::CanRenderFrame() { 87 bool Core::CanRenderFrame() {
80 DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread()); 88 DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread());
81 return eagl_context_ != NULL; 89 return eagl_context_ != NULL;
82 } 90 }
83 91
84 std::unique_ptr<protocol::FrameConsumer> Core::GrabFrameConsumer() { 92 std::unique_ptr<protocol::FrameConsumer> Core::GrabFrameConsumer() {
85 DCHECK(owned_frame_consumer_) << "The frame consumer is already grabbed."; 93 DCHECK(owned_frame_consumer_) << "The frame consumer is already grabbed.";
86 return std::move(owned_frame_consumer_); 94 return std::move(owned_frame_consumer_);
87 } 95 }
88 96
89 void Core::OnFrameRendered() { 97 void Core::OnFrameRendered() {
90 // Nothing to do. 98 // Nothing to do.
91 } 99 }
92 100
93 void Core::OnSizeChanged(int width, int height) { 101 void Core::OnSizeChanged(int width, int height) {
94 // Nothing to do. 102 // Nothing to do.
95 } 103 }
96 104
97 void Core::Created() { 105 void Core::Created() {
98 DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread()); 106 DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread());
99 DCHECK(!eagl_context_); 107 DCHECK(!eagl_context_);
100 108
101 eagl_context_ = [EAGLContext currentContext]; 109 eagl_context_ = [EAGLContext currentContext];
110 if (!eagl_context_) {
111 eagl_context_ =
112 [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES3];
113 [EAGLContext setCurrentContext:eagl_context_];
114 }
102 renderer_.RequestCanvasSize(); 115 renderer_.RequestCanvasSize();
103 116
104 renderer_.OnSurfaceCreated(base::MakeUnique<GlCanvas>( 117 renderer_.OnSurfaceCreated(base::MakeUnique<GlCanvas>(
105 static_cast<int>([eagl_context_ API]))); 118 static_cast<int>([eagl_context_ API])));
106 } 119 }
107 120
121 void Core::Stop() {
122 DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread());
123
124 eagl_context_ = nil;
125 // demo_screen_
Yuwei 2017/04/08 02:42:37 What are these comments for?
nicholss 2017/04/10 16:17:09 Cruft leftover from playing with the demo. I will
126 // renderer_ = nil;
127 }
128
108 void Core::SurfaceChanged(int width, int height) { 129 void Core::SurfaceChanged(int width, int height) {
109 DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread()); 130 DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread());
110 renderer_.OnSurfaceChanged(width, height); 131 renderer_.OnSurfaceChanged(width, height);
111 } 132 }
112 133
113 base::WeakPtr<remoting::GlDisplayHandler::Core> Core::GetWeakPtr() { 134 base::WeakPtr<remoting::GlDisplayHandler::Core> Core::GetWeakPtr() {
114 return weak_ptr_; 135 return weak_ptr_;
115 } 136 }
116 137
117 } // namespace GlDisplayHandler 138 } // namespace GlDisplayHandler
118 } // namespace remoting 139 } // namespace remoting
119 140
120 @interface GlDisplayHandler () 141 @interface GlDisplayHandler ()
121 @property(nonatomic) remoting::GlDisplayHandler::Core* core_; 142 @property(nonatomic) remoting::GlDisplayHandler::Core* core_;
122 @property(nonatomic) remoting::ios::AppRuntime* runtime_; 143 @property(nonatomic) remoting::ChromotingClientRuntime* runtime_;
123 @end 144 @end
124 145
125 @implementation GlDisplayHandler 146 @implementation GlDisplayHandler
126 147
127 @synthesize core_ = _core_; 148 @synthesize core_ = _core_;
128 @synthesize runtime_ = _runtime_; 149 @synthesize runtime_ = _runtime_;
129 150
130 - (id)initWithRuntime:(remoting::ios::AppRuntime*)runtime { 151 - (id)initWithRuntime:(remoting::ChromotingClientRuntime*)runtime {
131 self.runtime_ = runtime; 152 self.runtime_ = runtime;
132 return self; 153 return self;
133 } 154 }
134 155
135 - (void)created { 156 - (void)created {
136 _core_ = new remoting::GlDisplayHandler::Core(self.runtime_); 157 _core_ = new remoting::GlDisplayHandler::Core();
137 158
138 self.runtime_->display_task_runner()->PostTask( 159 self.runtime_->display_task_runner()->PostTask(
139 FROM_HERE, base::Bind(&remoting::GlDisplayHandler::Core::Created, 160 FROM_HERE, base::Bind(&remoting::GlDisplayHandler::Core::Created,
140 self.core_->GetWeakPtr())); 161 self.core_->GetWeakPtr()));
141 } 162 }
142 163
164 - (void)stop {
165 self.runtime_->display_task_runner()->PostTask(
166 FROM_HERE, base::Bind(&remoting::GlDisplayHandler::Core::Stop,
167 self.core_->GetWeakPtr()));
168 }
169
143 - (std::unique_ptr<remoting::protocol::VideoRenderer>)CreateVideoRenderer { 170 - (std::unique_ptr<remoting::protocol::VideoRenderer>)CreateVideoRenderer {
144 return base::MakeUnique<remoting::SoftwareVideoRenderer>( 171 return base::MakeUnique<remoting::SoftwareVideoRenderer>(
145 _core_->GrabFrameConsumer()); 172 _core_->GrabFrameConsumer());
146 } 173 }
147 174
175 - (std::unique_ptr<remoting::protocol::CursorShapeStub>)CreateCursorShapeStub {
176 return base::MakeUnique<remoting::CursorShapeStubProxy>(
177 _core_->GetWeakPtr(), self.runtime_->display_task_runner());
178 }
179
148 // In general, avoid expensive work in this function to maximize frame rate. 180 // In general, avoid expensive work in this function to maximize frame rate.
149 - (void)glkView:(GLKView*)view drawInRect:(CGRect)rect { 181 - (void)glkView:(GLKView*)view drawInRect:(CGRect)rect {
150 if (_core_) { 182 if (_core_) {
151 _core_->SurfaceChanged(rect.size.width, rect.size.height); 183 _core_->SurfaceChanged(rect.size.width, rect.size.height);
152 } 184 }
153 } 185 }
154 186
155 @end 187 @end
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698