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

Side by Side Diff: remoting/client/jni/jni_gl_display_handler.cc

Issue 2623413004: [Remoting Android] Fix thread issue with OpenGL drawable (Closed)
Patch Set: PTAL / Rewrite Created 3 years, 11 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/client/display/gl_renderer.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 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 #include "remoting/client/jni/jni_gl_display_handler.h" 5 #include "remoting/client/jni/jni_gl_display_handler.h"
6 6
7 #include <android/native_window_jni.h> 7 #include <android/native_window_jni.h>
8 #include <array> 8 #include <array>
9 9
10 #include "base/android/jni_android.h" 10 #include "base/android/jni_android.h"
(...skipping 23 matching lines...) Expand all
34 void OnFrameRendered() override; 34 void OnFrameRendered() override;
35 void OnSizeChanged(int width, int height) override; 35 void OnSizeChanged(int width, int height) override;
36 36
37 // CursorShapeStub interface. 37 // CursorShapeStub interface.
38 void SetCursorShape(const protocol::CursorShapeInfo& cursor_shape) override; 38 void SetCursorShape(const protocol::CursorShapeInfo& cursor_shape) override;
39 39
40 // Returns the frame consumer for updating desktop frame. Can be called on any 40 // Returns the frame consumer for updating desktop frame. Can be called on any
41 // thread but no more than once. 41 // thread but no more than once.
42 std::unique_ptr<protocol::FrameConsumer> GrabFrameConsumer(); 42 std::unique_ptr<protocol::FrameConsumer> GrabFrameConsumer();
43 43
44 void OnFrameReceived(std::unique_ptr<webrtc::DesktopFrame> frame,
45 const base::Closure& done);
46
44 void SurfaceCreated(base::android::ScopedJavaGlobalRef<jobject> surface); 47 void SurfaceCreated(base::android::ScopedJavaGlobalRef<jobject> surface);
45 void SurfaceChanged(int width, int height); 48 void SurfaceChanged(int width, int height);
46 void SurfaceDestroyed(); 49 void SurfaceDestroyed();
47 50
48 void SetTransformation(const std::array<float, 9>& matrix); 51 void SetTransformation(const std::array<float, 9>& matrix);
49 void MoveCursor(float x, float y); 52 void MoveCursor(float x, float y);
50 void SetCursorVisibility(bool visible); 53 void SetCursorVisibility(bool visible);
51 void StartInputFeedback(float x, float y, float diameter); 54 void StartInputFeedback(float x, float y, float diameter);
52 55
53 base::WeakPtr<Core> GetWeakPtr(); 56 base::WeakPtr<Core> GetWeakPtr();
54 57
55 private: 58 private:
59 // Initializes the core on the display thread. Can be called on any thread.
60 void Initialize();
61
56 ChromotingJniRuntime* runtime_; 62 ChromotingJniRuntime* runtime_;
57 base::WeakPtr<JniGlDisplayHandler> shell_; 63 base::WeakPtr<JniGlDisplayHandler> shell_;
58 64
59 // Will be std::move'd when GrabFrameConsumer() is called. 65 // Will be std::move'd when GrabFrameConsumer() is called.
60 std::unique_ptr<DualBufferFrameConsumer> owned_frame_consumer_; 66 std::unique_ptr<DualBufferFrameConsumer> owned_frame_consumer_;
61 67
62 base::WeakPtr<DualBufferFrameConsumer> frame_consumer_; 68 base::WeakPtr<DualBufferFrameConsumer> frame_consumer_;
63 69
64 ANativeWindow* window_ = nullptr; 70 ANativeWindow* window_ = nullptr;
65 std::unique_ptr<EglThreadContext> egl_context_; 71 std::unique_ptr<EglThreadContext> egl_context_;
66 std::unique_ptr<GlRenderer> renderer_; 72 std::unique_ptr<GlRenderer> renderer_;
67 73
68 // Used on display thread. 74 // Used on display thread.
69 base::WeakPtr<Core> weak_ptr_; 75 base::WeakPtr<Core> weak_ptr_;
70 base::WeakPtrFactory<Core> weak_factory_; 76 base::WeakPtrFactory<Core> weak_factory_;
71 77
72 DISALLOW_COPY_AND_ASSIGN(Core); 78 DISALLOW_COPY_AND_ASSIGN(Core);
73 }; 79 };
74 80
75 JniGlDisplayHandler::Core::Core(ChromotingJniRuntime* runtime, 81 JniGlDisplayHandler::Core::Core(ChromotingJniRuntime* runtime,
76 base::WeakPtr<JniGlDisplayHandler> shell) 82 base::WeakPtr<JniGlDisplayHandler> shell)
77 : runtime_(runtime), shell_(shell), weak_factory_(this) { 83 : runtime_(runtime), shell_(shell), weak_factory_(this) {
78 renderer_ = GlRenderer::CreateGlRendererWithDesktop();
79 weak_ptr_ = weak_factory_.GetWeakPtr(); 84 weak_ptr_ = weak_factory_.GetWeakPtr();
80 renderer_->SetDelegate(weak_ptr_); 85 Initialize();
Sergey Ulanov 2017/01/18 22:33:40 runtime_->display_task_runner()->PostTask(
Yuwei 2017/01/18 23:11:56 Since we still need the weak pointer for other pur
Sergey Ulanov 2017/01/18 23:32:43 The "Core" class used here to switch to a differen
Yuwei 2017/01/19 00:27:33 Acknowledged. Done.
86 // Do not bind GlRenderer::OnFrameReceived. |renderer_| is not ready yet.
81 owned_frame_consumer_.reset(new DualBufferFrameConsumer( 87 owned_frame_consumer_.reset(new DualBufferFrameConsumer(
82 base::Bind(&GlRenderer::OnFrameReceived, renderer_->GetWeakPtr()), 88 base::Bind(&JniGlDisplayHandler::Core::OnFrameReceived, weak_ptr_),
83 runtime_->display_task_runner(), 89 runtime_->display_task_runner(),
84 protocol::FrameConsumer::PixelFormat::FORMAT_RGBA)); 90 protocol::FrameConsumer::PixelFormat::FORMAT_RGBA));
85 frame_consumer_ = owned_frame_consumer_->GetWeakPtr(); 91 frame_consumer_ = owned_frame_consumer_->GetWeakPtr();
86 } 92 }
87 93
88 JniGlDisplayHandler::Core::~Core() {} 94 JniGlDisplayHandler::Core::~Core() {}
89 95
90 bool JniGlDisplayHandler::Core::CanRenderFrame() { 96 bool JniGlDisplayHandler::Core::CanRenderFrame() {
91 DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread()); 97 DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread());
92 return egl_context_ && egl_context_->IsWindowBound(); 98 return egl_context_ && egl_context_->IsWindowBound();
(...skipping 18 matching lines...) Expand all
111 DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread()); 117 DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread());
112 renderer_->OnCursorShapeChanged(cursor_shape); 118 renderer_->OnCursorShapeChanged(cursor_shape);
113 } 119 }
114 120
115 std::unique_ptr<protocol::FrameConsumer> 121 std::unique_ptr<protocol::FrameConsumer>
116 JniGlDisplayHandler::Core::GrabFrameConsumer() { 122 JniGlDisplayHandler::Core::GrabFrameConsumer() {
117 DCHECK(owned_frame_consumer_) << "The frame consumer is already grabbed."; 123 DCHECK(owned_frame_consumer_) << "The frame consumer is already grabbed.";
118 return std::move(owned_frame_consumer_); 124 return std::move(owned_frame_consumer_);
119 } 125 }
120 126
127 void JniGlDisplayHandler::Core::OnFrameReceived(
128 std::unique_ptr<webrtc::DesktopFrame> frame,
129 const base::Closure& done) {
130 DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread());
131 renderer_->OnFrameReceived(std::move(frame), done);
132 }
133
121 void JniGlDisplayHandler::Core::SurfaceCreated( 134 void JniGlDisplayHandler::Core::SurfaceCreated(
122 base::android::ScopedJavaGlobalRef<jobject> surface) { 135 base::android::ScopedJavaGlobalRef<jobject> surface) {
123 DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread()); 136 DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread());
124 DCHECK(!egl_context_); 137 DCHECK(!egl_context_);
125 DCHECK(!window_); 138 DCHECK(!window_);
126 renderer_->RequestCanvasSize(); 139 renderer_->RequestCanvasSize();
127 window_ = ANativeWindow_fromSurface(base::android::AttachCurrentThread(), 140 window_ = ANativeWindow_fromSurface(base::android::AttachCurrentThread(),
128 surface.obj()); 141 surface.obj());
129 egl_context_.reset(new EglThreadContext()); 142 egl_context_.reset(new EglThreadContext());
130 egl_context_->BindToWindow(window_); 143 egl_context_->BindToWindow(window_);
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
173 float diameter) { 186 float diameter) {
174 DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread()); 187 DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread());
175 renderer_->OnCursorInputFeedback(x, y, diameter); 188 renderer_->OnCursorInputFeedback(x, y, diameter);
176 } 189 }
177 190
178 base::WeakPtr<JniGlDisplayHandler::Core> 191 base::WeakPtr<JniGlDisplayHandler::Core>
179 JniGlDisplayHandler::Core::GetWeakPtr() { 192 JniGlDisplayHandler::Core::GetWeakPtr() {
180 return weak_ptr_; 193 return weak_ptr_;
181 } 194 }
182 195
196 void JniGlDisplayHandler::Core::Initialize() {
197 if (!runtime_->display_task_runner()->BelongsToCurrentThread()) {
Sergey Ulanov 2017/01/18 22:33:40 PostTask in the constructor and replace this code
Yuwei 2017/01/19 00:27:33 Done.
198 runtime_->display_task_runner()->PostTask(
199 FROM_HERE, base::Bind(&JniGlDisplayHandler::Core::Initialize,
200 weak_ptr_));
Sergey Ulanov 2017/01/18 22:33:40 Don't need to use weak pointer here because Core i
Yuwei 2017/01/19 00:27:33 Done.
201 return;
202 }
203
204 renderer_ = GlRenderer::CreateGlRendererWithDesktop();
205 renderer_->SetDelegate(weak_ptr_);
206 }
207
183 // Shell implementations. 208 // Shell implementations.
184 209
185 JniGlDisplayHandler::JniGlDisplayHandler( 210 JniGlDisplayHandler::JniGlDisplayHandler(
186 ChromotingJniRuntime* runtime, 211 ChromotingJniRuntime* runtime,
187 const base::android::JavaRef<jobject>& java_client) 212 const base::android::JavaRef<jobject>& java_client)
188 : runtime_(runtime), 213 : runtime_(runtime),
189 ui_task_poster_(runtime->display_task_runner()), 214 ui_task_poster_(runtime->display_task_runner()),
190 weak_factory_(this) { 215 weak_factory_(this) {
191 core_.reset(new Core(runtime_, weak_factory_.GetWeakPtr())); 216 core_.reset(new Core(runtime_, weak_factory_.GetWeakPtr()));
192 JNIEnv* env = base::android::AttachCurrentThread(); 217 JNIEnv* env = base::android::AttachCurrentThread();
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
296 java_display_); 321 java_display_);
297 } 322 }
298 323
299 void JniGlDisplayHandler::OnCanvasSizeChanged(int width, int height) { 324 void JniGlDisplayHandler::OnCanvasSizeChanged(int width, int height) {
300 DCHECK(runtime_->ui_task_runner()->BelongsToCurrentThread()); 325 DCHECK(runtime_->ui_task_runner()->BelongsToCurrentThread());
301 Java_GlDisplay_changeCanvasSize(base::android::AttachCurrentThread(), 326 Java_GlDisplay_changeCanvasSize(base::android::AttachCurrentThread(),
302 java_display_, width, height); 327 java_display_, width, height);
303 } 328 }
304 329
305 } // namespace remoting 330 } // namespace remoting
OLDNEW
« no previous file with comments | « remoting/client/display/gl_renderer.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698