Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 |
| OLD | NEW |