56
56
57
57
void OnFrameReceived (std::unique_ptr<webrtc::DesktopFrame> frame,
58
58
const base::Closure& done);
59
- void Stop ( );
60
- void SurfaceCreated (EAGLView* view );
61
- void SurfaceChanged (int width, int height);
59
+ void CreateRendererContext (EAGLView* view );
60
+ void DestroyRendererContext ( );
61
+ void SetSurfaceSize (int width, int height);
62
62
63
63
std::unique_ptr<protocol::FrameConsumer> GrabFrameConsumer ();
64
64
@@ -76,12 +76,13 @@ void OnFrameReceived(std::unique_ptr<webrtc::DesktopFrame> frame,
76
76
std::unique_ptr<DualBufferFrameConsumer> owned_frame_consumer_;
77
77
base::WeakPtr<DualBufferFrameConsumer> frame_consumer_;
78
78
79
- // TODO(yuweih): Release references once the surface is destroyed.
80
79
EAGLContext* eagl_context_;
81
80
std::unique_ptr<GlRenderer> renderer_;
82
- // GlDemoScreen *demo_screen_;
83
81
__weak id <GlDisplayHandlerDelegate> handler_delegate_;
84
82
83
+ // Valid only when the surface is created.
84
+ __weak EAGLView* view_;
85
+
85
86
// Used on display thread.
86
87
base::WeakPtr<Core> weak_ptr_;
87
88
base::WeakPtrFactory<Core> weak_factory_;
@@ -190,21 +191,20 @@ void OnFrameReceived(std::unique_ptr<webrtc::DesktopFrame> frame,
190
191
}));
191
192
}
192
193
193
- void Core::Stop () {
194
- DCHECK (runtime_->display_task_runner ()->BelongsToCurrentThread ());
195
-
196
- eagl_context_ = nil ;
197
- // demo_screen_ = nil;
198
- }
199
-
200
- void Core::SurfaceCreated (EAGLView* view) {
194
+ void Core::CreateRendererContext (EAGLView* view) {
201
195
DCHECK (runtime_->display_task_runner ()->BelongsToCurrentThread ());
202
196
DCHECK (eagl_context_);
203
197
198
+ if (view_) {
199
+ return ;
200
+ }
201
+ view_ = view;
202
+
204
203
runtime_->ui_task_runner ()->PostTask (FROM_HERE, base::BindBlockArc (^() {
205
204
[view startWithContext: eagl_context_];
206
205
}));
207
206
207
+ // TODO(yuweih): Rename methods in GlRenderer.
208
208
renderer_->OnSurfaceCreated (
209
209
std::make_unique<GlCanvas>(static_cast <int >([eagl_context_ API ])));
210
210
@@ -215,7 +215,22 @@ void OnFrameReceived(std::unique_ptr<webrtc::DesktopFrame> frame,
215
215
frame_consumer_));
216
216
}
217
217
218
- void Core::SurfaceChanged (int width, int height) {
218
+ void Core::DestroyRendererContext () {
219
+ DCHECK (runtime_->display_task_runner ()->BelongsToCurrentThread ());
220
+
221
+ if (!view_) {
222
+ return ;
223
+ }
224
+
225
+ renderer_->OnSurfaceDestroyed ();
226
+ __weak EAGLView* view = view_;
227
+ runtime_->ui_task_runner ()->PostTask (FROM_HERE, base::BindBlockArc (^() {
228
+ [view stop ];
229
+ }));
230
+ view_ = nil ;
231
+ }
232
+
233
+ void Core::SetSurfaceSize (int width, int height) {
219
234
DCHECK (runtime_->display_task_runner ()->BelongsToCurrentThread ());
220
235
renderer_->OnSurfaceChanged (width, height);
221
236
}
@@ -250,12 +265,6 @@ - (void)dealloc {
250
265
251
266
#pragma mark - Public
252
267
253
- - (void )stop {
254
- _runtime->display_task_runner ()->PostTask (
255
- FROM_HERE,
256
- base::Bind (&remoting::GlDisplayHandler::Core::Stop, _core->GetWeakPtr ()));
257
- }
258
-
259
268
- (std::unique_ptr<remoting::RendererProxy>)CreateRendererProxy {
260
269
return _core->GrabRendererProxy ();
261
270
}
@@ -270,17 +279,25 @@ - (void)stop {
270
279
_core->GetWeakPtr (), _runtime->display_task_runner ());
271
280
}
272
281
273
- - (void )onSurfaceCreated : (EAGLView*)view {
282
+ - (void )createRendererContext : (EAGLView*)view {
283
+ _runtime->display_task_runner ()->PostTask (
284
+ FROM_HERE,
285
+ base::BindOnce (&remoting::GlDisplayHandler::Core::CreateRendererContext,
286
+ _core->GetWeakPtr (), view));
287
+ }
288
+
289
+ - (void )destroyRendererContext {
274
290
_runtime->display_task_runner ()->PostTask (
275
- FROM_HERE, base::Bind (&remoting::GlDisplayHandler::Core::SurfaceCreated,
276
- _core->GetWeakPtr (), view));
291
+ FROM_HERE,
292
+ base::BindOnce (&remoting::GlDisplayHandler::Core::DestroyRendererContext,
293
+ _core->GetWeakPtr ()));
277
294
}
278
295
279
- - (void )onSurfaceChanged : (const CGRect&)frame {
296
+ - (void )setSurfaceSize : (const CGRect&)frame {
280
297
_runtime->display_task_runner ()->PostTask (
281
298
FROM_HERE,
282
- base::Bind (&remoting::GlDisplayHandler::Core::SurfaceChanged ,
283
- _core->GetWeakPtr (), frame.size .width , frame.size .height ));
299
+ base::BindOnce (&remoting::GlDisplayHandler::Core::SetSurfaceSize ,
300
+ _core->GetWeakPtr (), frame.size .width , frame.size .height ));
284
301
}
285
302
286
303
#pragma mark - Properties
0 commit comments