| 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 |