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

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: add null-check in deleter 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 13 matching lines...) Expand all
24 24
25 JniGlDisplayHandler::JniGlDisplayHandler(ChromotingJniRuntime* runtime) 25 JniGlDisplayHandler::JniGlDisplayHandler(ChromotingJniRuntime* runtime)
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());
36 Java_GlDisplay_invalidate(base::android::AttachCurrentThread(),
37 java_display_);
38 runtime_->ui_task_runner()->DeleteSoon(FROM_HERE, ui_task_poster_.release());
39 }
40 35
41 void JniGlDisplayHandler::InitializeClient( 36 void JniGlDisplayHandler::InitializeClient(
42 const base::android::JavaRef<jobject>& java_client) { 37 const base::android::JavaRef<jobject>& java_client) {
43 return Java_GlDisplay_initializeClient(base::android::AttachCurrentThread(), 38 return Java_GlDisplay_initializeClient(base::android::AttachCurrentThread(),
44 java_display_, java_client); 39 java_display_, java_client);
45 } 40 }
46 41
47 std::unique_ptr<protocol::CursorShapeStub> 42 std::unique_ptr<protocol::CursorShapeStub>
48 JniGlDisplayHandler::CreateCursorShapeStub() { 43 JniGlDisplayHandler::CreateCursorShapeStub() {
49 return base::MakeUnique<CursorShapeStubProxy>( 44 return base::MakeUnique<CursorShapeStubProxy>(
50 weak_ptr_, runtime_->display_task_runner()); 45 weak_ptr_, runtime_->display_task_runner());
51 } 46 }
52 47
53 std::unique_ptr<protocol::VideoRenderer> 48 std::unique_ptr<protocol::VideoRenderer>
54 JniGlDisplayHandler::CreateVideoRenderer() { 49 JniGlDisplayHandler::CreateVideoRenderer() {
55 DCHECK(runtime_->ui_task_runner()->BelongsToCurrentThread()); 50 DCHECK(runtime_->ui_task_runner()->BelongsToCurrentThread());
56 DCHECK(!frame_consumer_); 51 DCHECK(!frame_consumer_);
57 std::unique_ptr<DualBufferFrameConsumer> consumer = 52 std::unique_ptr<DualBufferFrameConsumer> consumer =
58 base::MakeUnique<DualBufferFrameConsumer>( 53 base::MakeUnique<DualBufferFrameConsumer>(
59 base::Bind(&GlRenderer::OnFrameReceived, renderer_.GetWeakPtr()), 54 base::Bind(&GlRenderer::OnFrameReceived, renderer_.GetWeakPtr()),
60 runtime_->display_task_runner(), 55 runtime_->display_task_runner(),
61 protocol::FrameConsumer::PixelFormat::FORMAT_RGBA); 56 protocol::FrameConsumer::PixelFormat::FORMAT_RGBA);
62 frame_consumer_ = consumer->GetWeakPtr(); 57 frame_consumer_ = consumer->GetWeakPtr();
63 return base::MakeUnique<SoftwareVideoRenderer>(std::move(consumer)); 58 return base::MakeUnique<SoftwareVideoRenderer>(std::move(consumer));
64 } 59 }
65 60
61 void JniGlDisplayHandler::Destroy() {
62 DCHECK(runtime_->ui_task_runner()->BelongsToCurrentThread());
63 Java_GlDisplay_invalidate(base::android::AttachCurrentThread(),
64 java_display_);
65 ui_task_poster_.reset();
66 runtime_->display_task_runner()->PostTask(
67 FROM_HERE, base::Bind(&JniGlDisplayHandler::DeleteOnDisplayThread,
68 weak_ptr_));
69 }
70
66 // static 71 // static
67 bool JniGlDisplayHandler::RegisterJni(JNIEnv* env) { 72 bool JniGlDisplayHandler::RegisterJni(JNIEnv* env) {
68 return RegisterNativesImpl(env); 73 return RegisterNativesImpl(env);
69 } 74 }
70 75
71 void JniGlDisplayHandler::OnSurfaceCreated( 76 void JniGlDisplayHandler::OnSurfaceCreated(
72 JNIEnv* env, 77 JNIEnv* env,
73 const base::android::JavaParamRef<jobject>& caller, 78 const base::android::JavaParamRef<jobject>& caller,
74 const base::android::JavaParamRef<jobject>& surface) { 79 const base::android::JavaParamRef<jobject>& surface) {
75 DCHECK(runtime_->ui_task_runner()->BelongsToCurrentThread()); 80 DCHECK(runtime_->ui_task_runner()->BelongsToCurrentThread());
(...skipping 25 matching lines...) Expand all
101 } 106 }
102 107
103 void JniGlDisplayHandler::OnPixelTransformationChanged( 108 void JniGlDisplayHandler::OnPixelTransformationChanged(
104 JNIEnv* env, 109 JNIEnv* env,
105 const base::android::JavaParamRef<jobject>& caller, 110 const base::android::JavaParamRef<jobject>& caller,
106 const base::android::JavaParamRef<jfloatArray>& jmatrix) { 111 const base::android::JavaParamRef<jfloatArray>& jmatrix) {
107 DCHECK(runtime_->ui_task_runner()->BelongsToCurrentThread()); 112 DCHECK(runtime_->ui_task_runner()->BelongsToCurrentThread());
108 DCHECK(env->GetArrayLength(jmatrix.obj()) == 9); 113 DCHECK(env->GetArrayLength(jmatrix.obj()) == 9);
109 std::array<float, 9> matrix; 114 std::array<float, 9> matrix;
110 env->GetFloatArrayRegion(jmatrix.obj(), 0, 9, matrix.data()); 115 env->GetFloatArrayRegion(jmatrix.obj(), 0, 9, matrix.data());
111 ui_task_poster_->AddTask(base::Bind(&GlRenderer::OnPixelTransformationChanged, 116 QueueTaskOnDisplayThread(base::Bind(&GlRenderer::OnPixelTransformationChanged,
112 renderer_.GetWeakPtr(), matrix)); 117 renderer_.GetWeakPtr(), matrix));
113 } 118 }
114 119
115 void JniGlDisplayHandler::OnCursorPixelPositionChanged( 120 void JniGlDisplayHandler::OnCursorPixelPositionChanged(
116 JNIEnv* env, 121 JNIEnv* env,
117 const base::android::JavaParamRef<jobject>& caller, 122 const base::android::JavaParamRef<jobject>& caller,
118 float x, 123 float x,
119 float y) { 124 float y) {
120 DCHECK(runtime_->ui_task_runner()->BelongsToCurrentThread()); 125 DCHECK(runtime_->ui_task_runner()->BelongsToCurrentThread());
121 ui_task_poster_->AddTask(base::Bind(&GlRenderer::OnCursorMoved, 126 QueueTaskOnDisplayThread(base::Bind(&GlRenderer::OnCursorMoved,
122 renderer_.GetWeakPtr(), x, y)); 127 renderer_.GetWeakPtr(), x, y));
123 } 128 }
124 129
125 void JniGlDisplayHandler::OnCursorVisibilityChanged( 130 void JniGlDisplayHandler::OnCursorVisibilityChanged(
126 JNIEnv* env, 131 JNIEnv* env,
127 const base::android::JavaParamRef<jobject>& caller, 132 const base::android::JavaParamRef<jobject>& caller,
128 bool visible) { 133 bool visible) {
129 DCHECK(runtime_->ui_task_runner()->BelongsToCurrentThread()); 134 DCHECK(runtime_->ui_task_runner()->BelongsToCurrentThread());
130 ui_task_poster_->AddTask(base::Bind(&GlRenderer::OnCursorVisibilityChanged, 135 QueueTaskOnDisplayThread(base::Bind(&GlRenderer::OnCursorVisibilityChanged,
131 renderer_.GetWeakPtr(), visible)); 136 renderer_.GetWeakPtr(), visible));
132 } 137 }
133 138
134 void JniGlDisplayHandler::OnCursorInputFeedback( 139 void JniGlDisplayHandler::OnCursorInputFeedback(
135 JNIEnv* env, 140 JNIEnv* env,
136 const base::android::JavaParamRef<jobject>& caller, 141 const base::android::JavaParamRef<jobject>& caller,
137 float x, 142 float x,
138 float y, 143 float y,
139 float diameter) { 144 float diameter) {
140 DCHECK(runtime_->ui_task_runner()->BelongsToCurrentThread()); 145 DCHECK(runtime_->ui_task_runner()->BelongsToCurrentThread());
141 ui_task_poster_->AddTask(base::Bind(&GlRenderer::OnCursorInputFeedback, 146 QueueTaskOnDisplayThread(base::Bind(&GlRenderer::OnCursorInputFeedback,
142 renderer_.GetWeakPtr(), x, y, diameter)); 147 renderer_.GetWeakPtr(), x, y, diameter));
143 } 148 }
144 149
150 void JniGlDisplayHandler::QueueTaskOnDisplayThread(const base::Closure& task) {
151 if (!ui_task_poster_) {
152 return;
153 }
154 ui_task_poster_->AddTask(task);
155 }
156
157 void JniGlDisplayHandler::DeleteOnDisplayThread() {
158 DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread());
159 DCHECK(!ui_task_poster_) << "Destroy() has not been called.";
160 delete this;
161 }
162
145 bool JniGlDisplayHandler::CanRenderFrame() { 163 bool JniGlDisplayHandler::CanRenderFrame() {
146 DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread()); 164 DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread());
147 return egl_context_ && egl_context_->IsWindowBound(); 165 return egl_context_ && egl_context_->IsWindowBound();
148 } 166 }
149 167
150 void JniGlDisplayHandler::OnFrameRendered() { 168 void JniGlDisplayHandler::OnFrameRendered() {
151 DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread()); 169 DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread());
152 egl_context_->SwapBuffers(); 170 egl_context_->SwapBuffers();
153 runtime_->ui_task_runner()->PostTask( 171 runtime_->ui_task_runner()->PostTask(
154 FROM_HERE, base::Bind(&JniGlDisplayHandler::NotifyRenderDoneOnUiThread, 172 FROM_HERE, base::Bind(&JniGlDisplayHandler::NotifyRenderDoneOnUiThread,
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
199 // static 217 // static
200 void JniGlDisplayHandler::ChangeCanvasSizeOnUiThread( 218 void JniGlDisplayHandler::ChangeCanvasSizeOnUiThread(
201 base::android::ScopedJavaGlobalRef<jobject> java_display, 219 base::android::ScopedJavaGlobalRef<jobject> java_display,
202 int width, 220 int width,
203 int height) { 221 int height) {
204 JNIEnv* env = base::android::AttachCurrentThread(); 222 JNIEnv* env = base::android::AttachCurrentThread();
205 Java_GlDisplay_changeCanvasSize(env, java_display, width, height); 223 Java_GlDisplay_changeCanvasSize(env, java_display, width, height);
206 } 224 }
207 225
208 } // namespace remoting 226 } // namespace remoting
OLDNEW
« remoting/client/jni/jni_gl_display_handler.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