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

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

Issue 2555803002: Adding the iOS app and integration example with GlRenderer. (Closed)
Patch Set: cleaning up includes. Created 3 years, 10 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
(Empty)
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
3 // found in the LICENSE file.
4
5 #if !defined(__has_feature) || !__has_feature(objc_arc)
6 #error "This file requires ARC support."
7 #endif
8
9
10 #import <Foundation/Foundation.h>
11 #import <GLKit/GLKit.h>
12
13 #import "remoting/client/display/sys_opengl.h"
14 #import "remoting/client/ios/display/gl_demo_screen.h"
15 #import "remoting/client/ios/display/gl_display_handler.h"
16
17 #include "base/macros.h"
18 #include "base/memory/ptr_util.h"
19 #include "base/memory/weak_ptr.h"
20 #include "remoting/client/chromoting_client.h"
21 #include "remoting/client/display/gl_canvas.h"
22 #include "remoting/client/display/gl_renderer.h"
23 #include "remoting/client/display/gl_renderer_delegate.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"
27
28 namespace remoting {
29 namespace GlDisplayHandler {
30
31 // The core that lives on the display thread.
32 class Core : public GlRendererDelegate {
33 public:
34 Core(remoting::ios::AppRuntime* runtime);
Sergey Ulanov 2017/01/27 19:47:44 runtime_ is used only to get display_task_runner()
35 ~Core() override;
36
37 // GlRendererDelegate interface.
38 bool CanRenderFrame() override;
39 void OnFrameRendered() override;
40 void OnSizeChanged(int width, int height) override;
41
42 void Created();
43 void SurfaceChanged(int width, int height);
44 std::unique_ptr<protocol::FrameConsumer> GrabFrameConsumer();
45 base::WeakPtr<Core> GetWeakPtr();
46
47 private:
48 // Will be std::move'd when GrabFrameConsumer() is called.
Sergey Ulanov 2017/01/27 19:47:44 Is this comment about owned_frame_consumer_? If so
49 remoting::ios::AppRuntime* runtime_;
50 std::unique_ptr<DualBufferFrameConsumer> owned_frame_consumer_;
51
52 base::WeakPtr<DualBufferFrameConsumer> frame_consumer_;
53 EAGLContext* eagl_context_;
54 GlRenderer renderer_;
55 GlDemoScreen demo_screen_;
56
57 // Used on display thread.
58 base::WeakPtr<Core> weak_ptr_;
59 base::WeakPtrFactory<Core> weak_factory_;
60
61 DISALLOW_COPY_AND_ASSIGN(Core);
62 };
63
64 Core::Core(remoting::ios::AppRuntime* runtime)
65 : runtime_(runtime), weak_factory_(this) {
66 weak_ptr_ = weak_factory_.GetWeakPtr();
67 renderer_.SetDelegate(weak_ptr_);
68 owned_frame_consumer_.reset(new remoting::DualBufferFrameConsumer(
69 base::Bind(&remoting::GlRenderer::OnFrameReceived,
70 renderer_.GetWeakPtr()),
71 runtime_->display_task_runner(),
72 remoting::protocol::FrameConsumer::PixelFormat::FORMAT_RGBA));
73 frame_consumer_ = owned_frame_consumer_->GetWeakPtr();
74 renderer_.AddDrawable(demo_screen_.GetWeakPtr());
75 }
76
77 Core::~Core() {}
78
79 bool Core::CanRenderFrame() {
80 DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread());
81 return eagl_context_ != NULL;
82 }
83
84 std::unique_ptr<protocol::FrameConsumer> Core::GrabFrameConsumer() {
85 DCHECK(owned_frame_consumer_) << "The frame consumer is already grabbed.";
86 return std::move(owned_frame_consumer_);
87 }
88
89 void Core::OnFrameRendered() {
90 // Nothing to do.
91 }
92
93 void Core::OnSizeChanged(int width, int height) {
94 // Nothing to do.
95 }
96
97 void Core::Created() {
98 DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread());
99 DCHECK(!eagl_context_);
100
101 eagl_context_ = [EAGLContext currentContext];
102 renderer_.RequestCanvasSize();
103
104 renderer_.OnSurfaceCreated(base::MakeUnique<GlCanvas>(
105 static_cast<int>([eagl_context_ API])));
106 }
107
108 void Core::SurfaceChanged(int width, int height) {
109 DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread());
110 renderer_.OnSurfaceChanged(width, height);
111 }
112
113 base::WeakPtr<remoting::GlDisplayHandler::Core> Core::GetWeakPtr() {
114 return weak_ptr_;
115 }
116
117 } // namespace GlDisplayHandler
118 } // namespace remoting
119
120 @interface GlDisplayHandler ()
121 @property(nonatomic) remoting::GlDisplayHandler::Core* core_;
Sergey Ulanov 2017/01/27 19:47:44 does this need to be a property instead of an inte
122 @property(nonatomic) remoting::ios::AppRuntime* runtime_;
123 @end
124
125 @implementation GlDisplayHandler
126
127 @synthesize core_ = _core_;
128 @synthesize runtime_ = _runtime_;
129
130 - (id)initWithRuntime:(remoting::ios::AppRuntime*)runtime {
131 self.runtime_ = runtime;
132 return self;
133 }
134
135 - (void)created {
136 _core_ = new remoting::GlDisplayHandler::Core(self.runtime_);
137
138 self.runtime_->display_task_runner()->PostTask(
139 FROM_HERE, base::Bind(&remoting::GlDisplayHandler::Core::Created,
140 self.core_->GetWeakPtr()));
Sergey Ulanov 2017/01/27 19:47:44 Which thread is the core_ destroyed on? I assume i
141 }
142
143 - (std::unique_ptr<remoting::protocol::VideoRenderer>)CreateVideoRenderer {
144 return base::MakeUnique<remoting::SoftwareVideoRenderer>(
145 _core_->GrabFrameConsumer());
146 }
147
148 // In general, avoid expensive work in this function to maximize frame rate.
149 - (void)glkView:(GLKView*)view drawInRect:(CGRect)rect {
150 if (_core_) {
151 _core_->SurfaceChanged(rect.size.width, rect.size.height);
152 }
153 }
154
155 @end
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698