OLD | NEW |
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 |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
59 base::WeakPtr<Core> GetWeakPtr(); | 59 base::WeakPtr<Core> GetWeakPtr(); |
60 | 60 |
61 private: | 61 private: |
62 remoting::ChromotingClientRuntime* runtime_; | 62 remoting::ChromotingClientRuntime* runtime_; |
63 | 63 |
64 // Will be std::move'd when GrabFrameConsumer() is called. | 64 // Will be std::move'd when GrabFrameConsumer() is called. |
65 std::unique_ptr<DualBufferFrameConsumer> owned_frame_consumer_; | 65 std::unique_ptr<DualBufferFrameConsumer> owned_frame_consumer_; |
66 base::WeakPtr<DualBufferFrameConsumer> frame_consumer_; | 66 base::WeakPtr<DualBufferFrameConsumer> frame_consumer_; |
67 | 67 |
68 // TODO(yuweih): Release references once the surface is destroyed. | 68 // TODO(yuweih): Release references once the surface is destroyed. |
69 GLKView* gl_view_; | |
70 EAGLContext* eagl_context_; | 69 EAGLContext* eagl_context_; |
71 std::unique_ptr<GlRenderer> renderer_; | 70 std::unique_ptr<GlRenderer> renderer_; |
72 // GlDemoScreen *demo_screen_; | 71 // GlDemoScreen *demo_screen_; |
73 id<GlDisplayHandlerDelegate> handler_delegate_; | 72 id<GlDisplayHandlerDelegate> handler_delegate_; |
74 | 73 |
75 // Used on display thread. | 74 // Used on display thread. |
76 base::WeakPtr<Core> weak_ptr_; | 75 base::WeakPtr<Core> weak_ptr_; |
77 base::WeakPtrFactory<Core> weak_factory_; | 76 base::WeakPtrFactory<Core> weak_factory_; |
78 | 77 |
79 DISALLOW_COPY_AND_ASSIGN(Core); | 78 DISALLOW_COPY_AND_ASSIGN(Core); |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
126 handler_delegate_ = delegate; | 125 handler_delegate_ = delegate; |
127 } | 126 } |
128 | 127 |
129 void Core::SetCursorShape(const protocol::CursorShapeInfo& cursor_shape) { | 128 void Core::SetCursorShape(const protocol::CursorShapeInfo& cursor_shape) { |
130 DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread()); | 129 DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread()); |
131 renderer_->OnCursorShapeChanged(cursor_shape); | 130 renderer_->OnCursorShapeChanged(cursor_shape); |
132 } | 131 } |
133 | 132 |
134 bool Core::CanRenderFrame() { | 133 bool Core::CanRenderFrame() { |
135 DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread()); | 134 DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread()); |
136 return gl_view_ != NULL && eagl_context_ != NULL; | 135 |
| 136 return eagl_context_ != nil; |
137 } | 137 } |
138 | 138 |
139 std::unique_ptr<protocol::FrameConsumer> Core::GrabFrameConsumer() { | 139 std::unique_ptr<protocol::FrameConsumer> Core::GrabFrameConsumer() { |
140 DCHECK(owned_frame_consumer_) << "The frame consumer is already grabbed."; | 140 DCHECK(owned_frame_consumer_) << "The frame consumer is already grabbed."; |
141 return std::move(owned_frame_consumer_); | 141 return std::move(owned_frame_consumer_); |
142 } | 142 } |
143 | 143 |
144 void Core::OnFrameReceived(std::unique_ptr<webrtc::DesktopFrame> frame, | 144 void Core::OnFrameReceived(std::unique_ptr<webrtc::DesktopFrame> frame, |
145 const base::Closure& done) { | 145 const base::Closure& done) { |
146 DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread()); | 146 DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread()); |
147 renderer_->OnFrameReceived(std::move(frame), done); | 147 renderer_->OnFrameReceived(std::move(frame), done); |
148 } | 148 } |
149 | 149 |
150 void Core::OnFrameRendered() { | 150 void Core::OnFrameRendered() { |
151 [gl_view_ display]; | 151 [eagl_context_ presentRenderbuffer:GL_RENDERBUFFER]; |
152 } | 152 } |
153 | 153 |
154 void Core::OnSizeChanged(int width, int height) { | 154 void Core::OnSizeChanged(int width, int height) { |
155 DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread()); | 155 DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread()); |
156 runtime_->ui_task_runner()->PostTask( | 156 runtime_->ui_task_runner()->PostTask( |
157 FROM_HERE, base::BindBlockArc(^() { | 157 FROM_HERE, base::BindBlockArc(^() { |
158 [handler_delegate_ canvasSizeChanged:CGSizeMake(width, height)]; | 158 [handler_delegate_ canvasSizeChanged:CGSizeMake(width, height)]; |
159 })); | 159 })); |
160 } | 160 } |
161 | 161 |
162 void Core::Stop() { | 162 void Core::Stop() { |
163 DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread()); | 163 DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread()); |
164 | 164 |
165 eagl_context_ = nil; | 165 eagl_context_ = nil; |
166 // demo_screen_ = nil; | 166 // demo_screen_ = nil; |
167 } | 167 } |
168 | 168 |
169 void Core::SurfaceCreated(GLKView* view) { | 169 void Core::SurfaceCreated(GLKView* view) { |
170 DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread()); | 170 DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread()); |
171 gl_view_ = view; | 171 |
| 172 // Bind the view's framebuffer object to OpenGL. |
| 173 [view bindDrawable]; |
172 | 174 |
173 renderer_->OnSurfaceCreated( | 175 renderer_->OnSurfaceCreated( |
174 base::MakeUnique<GlCanvas>(static_cast<int>([eagl_context_ API]))); | 176 base::MakeUnique<GlCanvas>(static_cast<int>([eagl_context_ API]))); |
175 | 177 |
176 renderer_->RequestCanvasSize(); | 178 renderer_->RequestCanvasSize(); |
177 | 179 |
178 runtime_->network_task_runner()->PostTask( | 180 runtime_->network_task_runner()->PostTask( |
179 FROM_HERE, base::Bind(&DualBufferFrameConsumer::RequestFullDesktopFrame, | 181 FROM_HERE, base::Bind(&DualBufferFrameConsumer::RequestFullDesktopFrame, |
180 frame_consumer_)); | 182 frame_consumer_)); |
181 } | 183 } |
(...skipping 13 matching lines...) Expand all Loading... |
195 } | 197 } |
196 | 198 |
197 base::WeakPtr<remoting::GlDisplayHandler::Core> Core::GetWeakPtr() { | 199 base::WeakPtr<remoting::GlDisplayHandler::Core> Core::GetWeakPtr() { |
198 return weak_ptr_; | 200 return weak_ptr_; |
199 } | 201 } |
200 | 202 |
201 } // namespace GlDisplayHandler | 203 } // namespace GlDisplayHandler |
202 } // namespace remoting | 204 } // namespace remoting |
203 | 205 |
204 @interface GlDisplayHandler () { | 206 @interface GlDisplayHandler () { |
205 remoting::GlDisplayHandler::Core* _core; | 207 std::unique_ptr<remoting::GlDisplayHandler::Core> _core; |
206 remoting::ChromotingClientRuntime* _runtime; | 208 remoting::ChromotingClientRuntime* _runtime; |
207 std::unique_ptr<remoting::QueuedTaskPoster> _uiTaskPoster; | 209 std::unique_ptr<remoting::QueuedTaskPoster> _uiTaskPoster; |
208 } | 210 } |
209 @end | 211 @end |
210 | 212 |
211 @implementation GlDisplayHandler | 213 @implementation GlDisplayHandler |
212 | 214 |
213 - (id)init { | 215 - (id)init { |
214 self = [super init]; | 216 self = [super init]; |
215 if (self) { | 217 if (self) { |
216 _runtime = remoting::ChromotingClientRuntime::GetInstance(); | 218 _runtime = remoting::ChromotingClientRuntime::GetInstance(); |
217 _core = new remoting::GlDisplayHandler::Core(); | 219 _core.reset(new remoting::GlDisplayHandler::Core()); |
218 _uiTaskPoster.reset( | 220 _uiTaskPoster.reset( |
219 new remoting::QueuedTaskPoster(_runtime->display_task_runner())); | 221 new remoting::QueuedTaskPoster(_runtime->display_task_runner())); |
220 } | 222 } |
221 return self; | 223 return self; |
222 } | 224 } |
223 | 225 |
| 226 - (void)dealloc { |
| 227 _runtime->display_task_runner()->DeleteSoon(FROM_HERE, _core.release()); |
| 228 } |
| 229 |
224 #pragma mark - Public | 230 #pragma mark - Public |
225 | 231 |
226 - (void)stop { | 232 - (void)stop { |
227 _runtime->display_task_runner()->PostTask( | 233 _runtime->display_task_runner()->PostTask( |
228 FROM_HERE, | 234 FROM_HERE, |
229 base::Bind(&remoting::GlDisplayHandler::Core::Stop, _core->GetWeakPtr())); | 235 base::Bind(&remoting::GlDisplayHandler::Core::Stop, _core->GetWeakPtr())); |
230 } | 236 } |
231 | 237 |
232 - (std::unique_ptr<remoting::protocol::VideoRenderer>)CreateVideoRenderer { | 238 - (std::unique_ptr<remoting::protocol::VideoRenderer>)CreateVideoRenderer { |
233 return base::MakeUnique<remoting::SoftwareVideoRenderer>( | 239 return base::MakeUnique<remoting::SoftwareVideoRenderer>( |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
271 _core->GetWeakPtr(), delegate)); | 277 _core->GetWeakPtr(), delegate)); |
272 } | 278 } |
273 | 279 |
274 - (id<GlDisplayHandlerDelegate>)delegate { | 280 - (id<GlDisplayHandlerDelegate>)delegate { |
275 // Implementation is still required for UNAVAILABLE_ATTRIBUTE. | 281 // Implementation is still required for UNAVAILABLE_ATTRIBUTE. |
276 NOTREACHED(); | 282 NOTREACHED(); |
277 return nil; | 283 return nil; |
278 } | 284 } |
279 | 285 |
280 @end | 286 @end |
OLD | NEW |