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

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

Issue 2848143002: [Remoting iOS] Fix screen tearing and screen dimensions (Closed)
Patch Set: Request first frame 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
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 30 matching lines...) Expand all
41 void SetCursorShape(const protocol::CursorShapeInfo& cursor_shape) override; 41 void SetCursorShape(const protocol::CursorShapeInfo& cursor_shape) override;
42 42
43 // GlRendererDelegate interface. 43 // GlRendererDelegate interface.
44 bool CanRenderFrame() override; 44 bool CanRenderFrame() override;
45 void OnFrameRendered() override; 45 void OnFrameRendered() override;
46 void OnSizeChanged(int width, int height) override; 46 void OnSizeChanged(int width, int height) override;
47 47
48 void OnFrameReceived(std::unique_ptr<webrtc::DesktopFrame> frame, 48 void OnFrameReceived(std::unique_ptr<webrtc::DesktopFrame> frame,
49 const base::Closure& done); 49 const base::Closure& done);
50 void Stop(); 50 void Stop();
51 void SurfaceCreated(GLKView* view);
51 void SurfaceChanged(int width, int height); 52 void SurfaceChanged(int width, int height);
52 std::unique_ptr<protocol::FrameConsumer> GrabFrameConsumer(); 53 std::unique_ptr<protocol::FrameConsumer> GrabFrameConsumer();
53 EAGLContext* GetEAGLContext(); 54 EAGLContext* GetEAGLContext();
54 base::WeakPtr<Core> GetWeakPtr(); 55 base::WeakPtr<Core> GetWeakPtr();
55 56
56 private: 57 private:
57 remoting::ChromotingClientRuntime* runtime_; 58 remoting::ChromotingClientRuntime* runtime_;
58 59
59 // Will be std::move'd when GrabFrameConsumer() is called. 60 // Will be std::move'd when GrabFrameConsumer() is called.
60 std::unique_ptr<DualBufferFrameConsumer> owned_frame_consumer_; 61 std::unique_ptr<DualBufferFrameConsumer> owned_frame_consumer_;
61 base::WeakPtr<DualBufferFrameConsumer> frame_consumer_; 62 base::WeakPtr<DualBufferFrameConsumer> frame_consumer_;
62 63
64 GLKView* gl_view_;
nicholss 2017/05/01 16:20:14 Note, gl_view_ here is correct because this is Obj
Yuwei 2017/05/01 20:58:08 Acknowledged. I've also noticed that ARC will sti
63 EAGLContext* eagl_context_; 65 EAGLContext* eagl_context_;
64 std::unique_ptr<GlRenderer> renderer_; 66 std::unique_ptr<GlRenderer> renderer_;
65 // GlDemoScreen *demo_screen_; 67 // GlDemoScreen *demo_screen_;
66 68
67 // Used on display thread. 69 // Used on display thread.
68 base::WeakPtr<Core> weak_ptr_; 70 base::WeakPtr<Core> weak_ptr_;
69 base::WeakPtrFactory<Core> weak_factory_; 71 base::WeakPtrFactory<Core> weak_factory_;
70 72
71 DISALLOW_COPY_AND_ASSIGN(Core); 73 DISALLOW_COPY_AND_ASSIGN(Core);
72 }; 74 };
(...skipping 28 matching lines...) Expand all
101 // fall back to ES2 if needed. 103 // fall back to ES2 if needed.
102 eagl_context_ = 104 eagl_context_ =
103 [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES3]; 105 [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES3];
104 [EAGLContext setCurrentContext:eagl_context_]; 106 [EAGLContext setCurrentContext:eagl_context_];
105 } 107 }
106 108
107 renderer_ = remoting::GlRenderer::CreateGlRendererWithDesktop(); 109 renderer_ = remoting::GlRenderer::CreateGlRendererWithDesktop();
108 110
109 // renderer_.RequestCanvasSize(); 111 // renderer_.RequestCanvasSize();
110 112
111 renderer_->OnSurfaceCreated(
112 base::MakeUnique<GlCanvas>(static_cast<int>([eagl_context_ API])));
113
114 SurfaceChanged(1024, 640); // TODO(nicholss): Where does this data comefrom?
115
116 // TODO(nicholss): This are wrong values but it lets us get something on the
117 // screen.
118 std::array<float, 9> matrix = {{1, 0, 0,
119 0, 1, 0,
120 0, 0, 1}};
121
122 renderer_->OnPixelTransformationChanged(matrix);
123
124 // demo_screen_ = new GlDemoScreen(); 113 // demo_screen_ = new GlDemoScreen();
125 // renderer_->AddDrawable(demo_screen_->GetWeakPtr()); 114 // renderer_->AddDrawable(demo_screen_->GetWeakPtr());
126 renderer_->SetDelegate(weak_ptr_); 115 renderer_->SetDelegate(weak_ptr_);
127 } 116 }
128 117
129 void Core::SetCursorShape(const protocol::CursorShapeInfo& cursor_shape) { 118 void Core::SetCursorShape(const protocol::CursorShapeInfo& cursor_shape) {
130 DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread()); 119 DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread());
131 renderer_->OnCursorShapeChanged(cursor_shape); 120 renderer_->OnCursorShapeChanged(cursor_shape);
132 } 121 }
133 122
134 bool Core::CanRenderFrame() { 123 bool Core::CanRenderFrame() {
135 DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread()); 124 DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread());
136 return eagl_context_ != NULL; 125 return gl_view_ != NULL && eagl_context_ != NULL;
137 } 126 }
138 127
139 std::unique_ptr<protocol::FrameConsumer> Core::GrabFrameConsumer() { 128 std::unique_ptr<protocol::FrameConsumer> Core::GrabFrameConsumer() {
140 DCHECK(owned_frame_consumer_) << "The frame consumer is already grabbed."; 129 DCHECK(owned_frame_consumer_) << "The frame consumer is already grabbed.";
141 return std::move(owned_frame_consumer_); 130 return std::move(owned_frame_consumer_);
142 } 131 }
143 132
144 void Core::OnFrameReceived(std::unique_ptr<webrtc::DesktopFrame> frame, 133 void Core::OnFrameReceived(std::unique_ptr<webrtc::DesktopFrame> frame,
145 const base::Closure& done) { 134 const base::Closure& done) {
146 DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread()); 135 DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread());
147 renderer_->OnFrameReceived(std::move(frame), done); 136 renderer_->OnFrameReceived(std::move(frame), done);
148 } 137 }
149 138
150 void Core::OnFrameRendered() { 139 void Core::OnFrameRendered() {
151 // Nothing to do. 140 [gl_view_ setNeedsDisplay];
152 } 141 }
153 142
154 void Core::OnSizeChanged(int width, int height) { 143 void Core::OnSizeChanged(int width, int height) {
155 // Nothing to do. 144 // Nothing to do.
156 } 145 }
157 146
158 void Core::Stop() { 147 void Core::Stop() {
159 DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread()); 148 DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread());
160 149
161 eagl_context_ = nil; 150 eagl_context_ = nil;
162 // demo_screen_ = nil; 151 // demo_screen_ = nil;
163 } 152 }
164 153
154 void Core::SurfaceCreated(GLKView* view) {
155 DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread());
156 gl_view_ = view;
157
158 renderer_->OnSurfaceCreated(
159 base::MakeUnique<GlCanvas>(static_cast<int>([eagl_context_ API])));
160
161 runtime_->network_task_runner()->PostTask(
162 FROM_HERE, base::Bind(&DualBufferFrameConsumer::RequestFullDesktopFrame,
163 frame_consumer_));
164 }
165
165 void Core::SurfaceChanged(int width, int height) { 166 void Core::SurfaceChanged(int width, int height) {
166 DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread()); 167 DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread());
167 renderer_->OnSurfaceChanged(width, height); 168 renderer_->OnSurfaceChanged(width, height);
169
170 // TODO(nicholss): This are wrong values but it lets us get something on the
171 // screen.
172 std::array<float, 9> matrix = {{1, 0, 0, // Row 1
Yuwei 2017/04/30 01:18:06 BTW this is a trick to stop git cl format by addin
nicholss 2017/05/01 16:20:14 nice!
173 0, 1, 0, // Row 2
174 0, 0, 1}};
175
176 renderer_->OnPixelTransformationChanged(matrix);
168 } 177 }
169 178
170 EAGLContext* Core::GetEAGLContext() { 179 EAGLContext* Core::GetEAGLContext() {
171 return eagl_context_; 180 return eagl_context_;
172 } 181 }
173 182
174 base::WeakPtr<remoting::GlDisplayHandler::Core> Core::GetWeakPtr() { 183 base::WeakPtr<remoting::GlDisplayHandler::Core> Core::GetWeakPtr() {
175 return weak_ptr_; 184 return weak_ptr_;
176 } 185 }
177 186
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
210 219
211 - (std::unique_ptr<remoting::protocol::CursorShapeStub>)CreateCursorShapeStub { 220 - (std::unique_ptr<remoting::protocol::CursorShapeStub>)CreateCursorShapeStub {
212 return base::MakeUnique<remoting::CursorShapeStubProxy>( 221 return base::MakeUnique<remoting::CursorShapeStubProxy>(
213 _core->GetWeakPtr(), _runtime->display_task_runner()); 222 _core->GetWeakPtr(), _runtime->display_task_runner());
214 } 223 }
215 224
216 - (EAGLContext*)GetEAGLContext { 225 - (EAGLContext*)GetEAGLContext {
217 return _core->GetEAGLContext(); 226 return _core->GetEAGLContext();
218 } 227 }
219 228
229 - (void)onSurfaceCreated:(GLKView*)view {
230 _runtime->display_task_runner()->PostTask(
231 FROM_HERE, base::Bind(&remoting::GlDisplayHandler::Core::SurfaceCreated,
232 _core->GetWeakPtr(), view));
233 }
234
235 - (void)onSurfaceChanged:(const CGRect&)frame {
236 _runtime->display_task_runner()->PostTask(
237 FROM_HERE,
238 base::Bind(&remoting::GlDisplayHandler::Core::SurfaceChanged,
239 _core->GetWeakPtr(), frame.size.width, frame.size.height));
240 }
241
220 // TODO(nicholss): Remove this function, it is not used in the final impl, 242 // TODO(nicholss): Remove this function, it is not used in the final impl,
221 // or it should call RequestRender. 243 // or it should call RequestRender.
222 - (void)glkView:(GLKView*)view drawInRect:(CGRect)rect { 244 - (void)glkView:(GLKView*)view drawInRect:(CGRect)rect {
223 if (_core) { 245 if (_core) {
224 _runtime->display_task_runner()->PostTask( 246 _runtime->display_task_runner()->PostTask(
225 FROM_HERE, 247 FROM_HERE,
226 base::Bind(&remoting::GlDisplayHandler::Core::SurfaceChanged, 248 base::Bind(&remoting::GlDisplayHandler::Core::SurfaceChanged,
227 _core->GetWeakPtr(), rect.size.width, rect.size.height)); 249 _core->GetWeakPtr(), rect.size.width, rect.size.height));
228 } 250 }
229 } 251 }
230 252
231 @end 253 @end
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698