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

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

Issue 2874143002: [CRD iOS] Some fixes for rendering (Closed)
Patch Set: Just use presentRenderbuffer to swap buffers 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
« no previous file with comments | « remoting/ios/app/host_view_controller.mm ('k') | remoting/ios/session/remoting_client.mm » ('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 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
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
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
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
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
OLDNEW
« no previous file with comments | « remoting/ios/app/host_view_controller.mm ('k') | remoting/ios/session/remoting_client.mm » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698