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

Unified Diff: remoting/client/jni/jni_gl_display_handler.cc

Issue 2623413004: [Remoting Android] Fix thread issue with OpenGL drawable (Closed)
Patch Set: Reviewer's Feedback 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « remoting/client/display/gl_renderer.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: remoting/client/jni/jni_gl_display_handler.cc
diff --git a/remoting/client/jni/jni_gl_display_handler.cc b/remoting/client/jni/jni_gl_display_handler.cc
index 85c0641e79384e73e8776fcb1caf67fcd38e4d66..742c088c144698720839840f1d8537adc31df12a 100644
--- a/remoting/client/jni/jni_gl_display_handler.cc
+++ b/remoting/client/jni/jni_gl_display_handler.cc
@@ -22,7 +22,8 @@
namespace remoting {
-// The core that lives on the display thread.
+// The core that lives on the display thread. Must not be created on the display
+// thread.
class JniGlDisplayHandler::Core : public protocol::CursorShapeStub,
public GlRendererDelegate {
public:
@@ -41,6 +42,9 @@ class JniGlDisplayHandler::Core : public protocol::CursorShapeStub,
// thread but no more than once.
std::unique_ptr<protocol::FrameConsumer> GrabFrameConsumer();
+ void OnFrameReceived(std::unique_ptr<webrtc::DesktopFrame> frame,
+ const base::Closure& done);
+
void SurfaceCreated(base::android::ScopedJavaGlobalRef<jobject> surface);
void SurfaceChanged(int width, int height);
void SurfaceDestroyed();
@@ -53,6 +57,9 @@ class JniGlDisplayHandler::Core : public protocol::CursorShapeStub,
base::WeakPtr<Core> GetWeakPtr();
private:
+ // Initializes the core on the display thread.
+ void Initialize();
+
ChromotingJniRuntime* runtime_;
base::WeakPtr<JniGlDisplayHandler> shell_;
@@ -75,11 +82,16 @@ class JniGlDisplayHandler::Core : public protocol::CursorShapeStub,
JniGlDisplayHandler::Core::Core(ChromotingJniRuntime* runtime,
base::WeakPtr<JniGlDisplayHandler> shell)
: runtime_(runtime), shell_(shell), weak_factory_(this) {
- renderer_ = GlRenderer::CreateGlRendererWithDesktop();
+ DCHECK(!runtime_->display_task_runner()->BelongsToCurrentThread());
+ runtime_->display_task_runner()->PostTask(
+ FROM_HERE, base::Bind(&JniGlDisplayHandler::Core::Initialize,
+ base::Unretained(this)));
+
weak_ptr_ = weak_factory_.GetWeakPtr();
- renderer_->SetDelegate(weak_ptr_);
+
+ // Do not bind GlRenderer::OnFrameReceived. |renderer_| is not ready yet.
owned_frame_consumer_.reset(new DualBufferFrameConsumer(
- base::Bind(&GlRenderer::OnFrameReceived, renderer_->GetWeakPtr()),
+ base::Bind(&JniGlDisplayHandler::Core::OnFrameReceived, weak_ptr_),
runtime_->display_task_runner(),
protocol::FrameConsumer::PixelFormat::FORMAT_RGBA));
frame_consumer_ = owned_frame_consumer_->GetWeakPtr();
@@ -118,6 +130,13 @@ JniGlDisplayHandler::Core::GrabFrameConsumer() {
return std::move(owned_frame_consumer_);
}
+void JniGlDisplayHandler::Core::OnFrameReceived(
+ std::unique_ptr<webrtc::DesktopFrame> frame,
+ const base::Closure& done) {
+ DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread());
+ renderer_->OnFrameReceived(std::move(frame), done);
+}
+
void JniGlDisplayHandler::Core::SurfaceCreated(
base::android::ScopedJavaGlobalRef<jobject> surface) {
DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread());
@@ -180,6 +199,13 @@ JniGlDisplayHandler::Core::GetWeakPtr() {
return weak_ptr_;
}
+void JniGlDisplayHandler::Core::Initialize() {
+ DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread());
+
+ renderer_ = GlRenderer::CreateGlRendererWithDesktop();
+ renderer_->SetDelegate(weak_ptr_);
+}
+
// Shell implementations.
JniGlDisplayHandler::JniGlDisplayHandler(
« 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