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

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

Issue 2338473002: [Remoting Android] JniGlDisplayHandler calls invalidate() on UI thread (Closed)
Patch Set: null-check ui_task_poster_ before using it Created 4 years, 3 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 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 15 matching lines...) Expand all
26 : runtime_(runtime), weak_factory_(this) { 26 : runtime_(runtime), weak_factory_(this) {
27 weak_ptr_ = weak_factory_.GetWeakPtr(); 27 weak_ptr_ = weak_factory_.GetWeakPtr();
28 java_display_.Reset(Java_GlDisplay_createJavaDisplayObject( 28 java_display_.Reset(Java_GlDisplay_createJavaDisplayObject(
29 base::android::AttachCurrentThread(), reinterpret_cast<intptr_t>(this))); 29 base::android::AttachCurrentThread(), reinterpret_cast<intptr_t>(this)));
30 renderer_.SetDelegate(weak_ptr_); 30 renderer_.SetDelegate(weak_ptr_);
31 ui_task_poster_.reset(new QueuedTaskPoster(runtime->display_task_runner())); 31 ui_task_poster_.reset(new QueuedTaskPoster(runtime->display_task_runner()));
32 } 32 }
33 33
34 JniGlDisplayHandler::~JniGlDisplayHandler() { 34 JniGlDisplayHandler::~JniGlDisplayHandler() {
35 DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread()); 35 DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread());
36 Java_GlDisplay_invalidate(base::android::AttachCurrentThread(), 36 DCHECK(!ui_task_poster_) << "Destroy() has not been called.";
37 java_display_);
38 runtime_->ui_task_runner()->DeleteSoon(FROM_HERE, ui_task_poster_.release());
39 } 37 }
40 38
41 void JniGlDisplayHandler::InitializeClient( 39 void JniGlDisplayHandler::InitializeClient(
42 const base::android::JavaRef<jobject>& java_client) { 40 const base::android::JavaRef<jobject>& java_client) {
43 return Java_GlDisplay_initializeClient(base::android::AttachCurrentThread(), 41 return Java_GlDisplay_initializeClient(base::android::AttachCurrentThread(),
44 java_display_, java_client); 42 java_display_, java_client);
45 } 43 }
46 44
47 std::unique_ptr<protocol::CursorShapeStub> 45 std::unique_ptr<protocol::CursorShapeStub>
48 JniGlDisplayHandler::CreateCursorShapeStub() { 46 JniGlDisplayHandler::CreateCursorShapeStub() {
49 return base::MakeUnique<CursorShapeStubProxy>( 47 return base::MakeUnique<CursorShapeStubProxy>(
50 weak_ptr_, runtime_->display_task_runner()); 48 weak_ptr_, runtime_->display_task_runner());
51 } 49 }
52 50
53 std::unique_ptr<protocol::VideoRenderer> 51 std::unique_ptr<protocol::VideoRenderer>
54 JniGlDisplayHandler::CreateVideoRenderer() { 52 JniGlDisplayHandler::CreateVideoRenderer() {
55 DCHECK(runtime_->ui_task_runner()->BelongsToCurrentThread()); 53 DCHECK(runtime_->ui_task_runner()->BelongsToCurrentThread());
56 DCHECK(!frame_consumer_); 54 DCHECK(!frame_consumer_);
57 std::unique_ptr<DualBufferFrameConsumer> consumer = 55 std::unique_ptr<DualBufferFrameConsumer> consumer =
58 base::MakeUnique<DualBufferFrameConsumer>( 56 base::MakeUnique<DualBufferFrameConsumer>(
59 base::Bind(&GlRenderer::OnFrameReceived, renderer_.GetWeakPtr()), 57 base::Bind(&GlRenderer::OnFrameReceived, renderer_.GetWeakPtr()),
60 runtime_->display_task_runner(), 58 runtime_->display_task_runner(),
61 protocol::FrameConsumer::PixelFormat::FORMAT_RGBA); 59 protocol::FrameConsumer::PixelFormat::FORMAT_RGBA);
62 frame_consumer_ = consumer->GetWeakPtr(); 60 frame_consumer_ = consumer->GetWeakPtr();
63 return base::MakeUnique<SoftwareVideoRenderer>(std::move(consumer)); 61 return base::MakeUnique<SoftwareVideoRenderer>(std::move(consumer));
64 } 62 }
65 63
64 void JniGlDisplayHandler::Destroy() {
65 DCHECK(runtime_->ui_task_runner()->BelongsToCurrentThread());
66 Java_GlDisplay_invalidate(base::android::AttachCurrentThread(),
67 java_display_);
68 ui_task_poster_.reset();
69 runtime_->display_task_runner()->PostTask(
70 FROM_HERE, base::Bind(&JniGlDisplayHandler::DeleteOnDisplayThread,
71 weak_ptr_));
72 }
73
66 // static 74 // static
67 bool JniGlDisplayHandler::RegisterJni(JNIEnv* env) { 75 bool JniGlDisplayHandler::RegisterJni(JNIEnv* env) {
68 return RegisterNativesImpl(env); 76 return RegisterNativesImpl(env);
69 } 77 }
70 78
71 void JniGlDisplayHandler::OnSurfaceCreated( 79 void JniGlDisplayHandler::OnSurfaceCreated(
72 JNIEnv* env, 80 JNIEnv* env,
73 const base::android::JavaParamRef<jobject>& caller, 81 const base::android::JavaParamRef<jobject>& caller,
74 const base::android::JavaParamRef<jobject>& surface) { 82 const base::android::JavaParamRef<jobject>& surface) {
75 DCHECK(runtime_->ui_task_runner()->BelongsToCurrentThread()); 83 DCHECK(runtime_->ui_task_runner()->BelongsToCurrentThread());
(...skipping 22 matching lines...) Expand all
98 FROM_HERE, 106 FROM_HERE,
99 base::Bind(&JniGlDisplayHandler::SurfaceDestroyedOnDisplayThread, 107 base::Bind(&JniGlDisplayHandler::SurfaceDestroyedOnDisplayThread,
100 weak_ptr_)); 108 weak_ptr_));
101 } 109 }
102 110
103 void JniGlDisplayHandler::OnPixelTransformationChanged( 111 void JniGlDisplayHandler::OnPixelTransformationChanged(
104 JNIEnv* env, 112 JNIEnv* env,
105 const base::android::JavaParamRef<jobject>& caller, 113 const base::android::JavaParamRef<jobject>& caller,
106 const base::android::JavaParamRef<jfloatArray>& jmatrix) { 114 const base::android::JavaParamRef<jfloatArray>& jmatrix) {
107 DCHECK(runtime_->ui_task_runner()->BelongsToCurrentThread()); 115 DCHECK(runtime_->ui_task_runner()->BelongsToCurrentThread());
116 if (!ui_task_poster_) {
117 return;
Hzj_jie 2016/09/13 17:56:29 Suggest to add a PostTaskToDisplayThread(const bas
Yuwei 2016/09/13 19:06:18 Done. Slightly different name.
118 }
108 DCHECK(env->GetArrayLength(jmatrix.obj()) == 9); 119 DCHECK(env->GetArrayLength(jmatrix.obj()) == 9);
109 std::array<float, 9> matrix; 120 std::array<float, 9> matrix;
110 env->GetFloatArrayRegion(jmatrix.obj(), 0, 9, matrix.data()); 121 env->GetFloatArrayRegion(jmatrix.obj(), 0, 9, matrix.data());
111 ui_task_poster_->AddTask(base::Bind(&GlRenderer::OnPixelTransformationChanged, 122 ui_task_poster_->AddTask(base::Bind(&GlRenderer::OnPixelTransformationChanged,
112 renderer_.GetWeakPtr(), matrix)); 123 renderer_.GetWeakPtr(), matrix));
113 } 124 }
114 125
115 void JniGlDisplayHandler::OnCursorPixelPositionChanged( 126 void JniGlDisplayHandler::OnCursorPixelPositionChanged(
116 JNIEnv* env, 127 JNIEnv* env,
117 const base::android::JavaParamRef<jobject>& caller, 128 const base::android::JavaParamRef<jobject>& caller,
118 float x, 129 float x,
119 float y) { 130 float y) {
120 DCHECK(runtime_->ui_task_runner()->BelongsToCurrentThread()); 131 DCHECK(runtime_->ui_task_runner()->BelongsToCurrentThread());
132 if (!ui_task_poster_) {
133 return;
134 }
121 ui_task_poster_->AddTask(base::Bind(&GlRenderer::OnCursorMoved, 135 ui_task_poster_->AddTask(base::Bind(&GlRenderer::OnCursorMoved,
122 renderer_.GetWeakPtr(), x, y)); 136 renderer_.GetWeakPtr(), x, y));
123 } 137 }
124 138
125 void JniGlDisplayHandler::OnCursorVisibilityChanged( 139 void JniGlDisplayHandler::OnCursorVisibilityChanged(
126 JNIEnv* env, 140 JNIEnv* env,
127 const base::android::JavaParamRef<jobject>& caller, 141 const base::android::JavaParamRef<jobject>& caller,
128 bool visible) { 142 bool visible) {
129 DCHECK(runtime_->ui_task_runner()->BelongsToCurrentThread()); 143 DCHECK(runtime_->ui_task_runner()->BelongsToCurrentThread());
144 if (!ui_task_poster_) {
145 return;
146 }
130 ui_task_poster_->AddTask(base::Bind(&GlRenderer::OnCursorVisibilityChanged, 147 ui_task_poster_->AddTask(base::Bind(&GlRenderer::OnCursorVisibilityChanged,
131 renderer_.GetWeakPtr(), visible)); 148 renderer_.GetWeakPtr(), visible));
132 } 149 }
133 150
134 void JniGlDisplayHandler::OnCursorInputFeedback( 151 void JniGlDisplayHandler::OnCursorInputFeedback(
135 JNIEnv* env, 152 JNIEnv* env,
136 const base::android::JavaParamRef<jobject>& caller, 153 const base::android::JavaParamRef<jobject>& caller,
137 float x, 154 float x,
138 float y, 155 float y,
139 float diameter) { 156 float diameter) {
140 DCHECK(runtime_->ui_task_runner()->BelongsToCurrentThread()); 157 DCHECK(runtime_->ui_task_runner()->BelongsToCurrentThread());
158 if (!ui_task_poster_) {
159 return;
160 }
141 ui_task_poster_->AddTask(base::Bind(&GlRenderer::OnCursorInputFeedback, 161 ui_task_poster_->AddTask(base::Bind(&GlRenderer::OnCursorInputFeedback,
142 renderer_.GetWeakPtr(), x, y, diameter)); 162 renderer_.GetWeakPtr(), x, y, diameter));
143 } 163 }
144 164
165 void JniGlDisplayHandler::DeleteOnDisplayThread() {
166 delete this;
167 }
168
145 bool JniGlDisplayHandler::CanRenderFrame() { 169 bool JniGlDisplayHandler::CanRenderFrame() {
146 DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread()); 170 DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread());
147 return egl_context_ && egl_context_->IsWindowBound(); 171 return egl_context_ && egl_context_->IsWindowBound();
148 } 172 }
149 173
150 void JniGlDisplayHandler::OnFrameRendered() { 174 void JniGlDisplayHandler::OnFrameRendered() {
151 DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread()); 175 DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread());
152 egl_context_->SwapBuffers(); 176 egl_context_->SwapBuffers();
153 runtime_->ui_task_runner()->PostTask( 177 runtime_->ui_task_runner()->PostTask(
154 FROM_HERE, base::Bind(&JniGlDisplayHandler::NotifyRenderDoneOnUiThread, 178 FROM_HERE, base::Bind(&JniGlDisplayHandler::NotifyRenderDoneOnUiThread,
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
199 // static 223 // static
200 void JniGlDisplayHandler::ChangeCanvasSizeOnUiThread( 224 void JniGlDisplayHandler::ChangeCanvasSizeOnUiThread(
201 base::android::ScopedJavaGlobalRef<jobject> java_display, 225 base::android::ScopedJavaGlobalRef<jobject> java_display,
202 int width, 226 int width,
203 int height) { 227 int height) {
204 JNIEnv* env = base::android::AttachCurrentThread(); 228 JNIEnv* env = base::android::AttachCurrentThread();
205 Java_GlDisplay_changeCanvasSize(env, java_display, width, height); 229 Java_GlDisplay_changeCanvasSize(env, java_display, width, height);
206 } 230 }
207 231
208 } // namespace remoting 232 } // namespace remoting
OLDNEW
« remoting/client/jni/display_updater_factory.h ('K') | « remoting/client/jni/jni_gl_display_handler.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698