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

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: s/Native callbacks/Callbacks by native counterpart/ 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
« no previous file with comments | « remoting/client/jni/jni_gl_display_handler.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 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();
Yuwei 2016/09/12 21:34:44 Releasing |ui_task_poster_| here may not be very s
Yuwei 2016/09/13 19:06:18 I think it's better to just null-check before usin
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 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
135 JNIEnv* env, 143 JNIEnv* env,
136 const base::android::JavaParamRef<jobject>& caller, 144 const base::android::JavaParamRef<jobject>& caller,
137 float x, 145 float x,
138 float y, 146 float y,
139 float diameter) { 147 float diameter) {
140 DCHECK(runtime_->ui_task_runner()->BelongsToCurrentThread()); 148 DCHECK(runtime_->ui_task_runner()->BelongsToCurrentThread());
141 ui_task_poster_->AddTask(base::Bind(&GlRenderer::OnCursorInputFeedback, 149 ui_task_poster_->AddTask(base::Bind(&GlRenderer::OnCursorInputFeedback,
142 renderer_.GetWeakPtr(), x, y, diameter)); 150 renderer_.GetWeakPtr(), x, y, diameter));
143 } 151 }
144 152
153 void JniGlDisplayHandler::DeleteOnDisplayThread() {
154 delete this;
155 }
156
145 bool JniGlDisplayHandler::CanRenderFrame() { 157 bool JniGlDisplayHandler::CanRenderFrame() {
146 DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread()); 158 DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread());
147 return egl_context_ && egl_context_->IsWindowBound(); 159 return egl_context_ && egl_context_->IsWindowBound();
148 } 160 }
149 161
150 void JniGlDisplayHandler::OnFrameRendered() { 162 void JniGlDisplayHandler::OnFrameRendered() {
151 DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread()); 163 DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread());
152 egl_context_->SwapBuffers(); 164 egl_context_->SwapBuffers();
153 runtime_->ui_task_runner()->PostTask( 165 runtime_->ui_task_runner()->PostTask(
154 FROM_HERE, base::Bind(&JniGlDisplayHandler::NotifyRenderDoneOnUiThread, 166 FROM_HERE, base::Bind(&JniGlDisplayHandler::NotifyRenderDoneOnUiThread,
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
199 // static 211 // static
200 void JniGlDisplayHandler::ChangeCanvasSizeOnUiThread( 212 void JniGlDisplayHandler::ChangeCanvasSizeOnUiThread(
201 base::android::ScopedJavaGlobalRef<jobject> java_display, 213 base::android::ScopedJavaGlobalRef<jobject> java_display,
202 int width, 214 int width,
203 int height) { 215 int height) {
204 JNIEnv* env = base::android::AttachCurrentThread(); 216 JNIEnv* env = base::android::AttachCurrentThread();
205 Java_GlDisplay_changeCanvasSize(env, java_display, width, height); 217 Java_GlDisplay_changeCanvasSize(env, java_display, width, height);
206 } 218 }
207 219
208 } // namespace remoting 220 } // namespace remoting
OLDNEW
« no previous file with comments | « 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