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

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

Issue 2591363002: Adding drawable to CRD andorid and iOS gl rendering pipeline. (Closed)
Patch Set: More like GetZIndex. 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 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"
11 #include "base/bind.h" 11 #include "base/bind.h"
12 #include "base/logging.h" 12 #include "base/logging.h"
13 #include "base/memory/ptr_util.h" 13 #include "base/memory/ptr_util.h"
14 #include "jni/GlDisplay_jni.h" 14 #include "jni/GlDisplay_jni.h"
15 #include "remoting/client/cursor_shape_stub_proxy.h" 15 #include "remoting/client/cursor_shape_stub_proxy.h"
16 #include "remoting/client/display/gl_canvas.h"
16 #include "remoting/client/dual_buffer_frame_consumer.h" 17 #include "remoting/client/dual_buffer_frame_consumer.h"
17 #include "remoting/client/jni/chromoting_jni_runtime.h" 18 #include "remoting/client/jni/chromoting_jni_runtime.h"
18 #include "remoting/client/jni/egl_thread_context.h" 19 #include "remoting/client/jni/egl_thread_context.h"
19 #include "remoting/client/software_video_renderer.h" 20 #include "remoting/client/software_video_renderer.h"
20 #include "remoting/protocol/frame_consumer.h" 21 #include "remoting/protocol/frame_consumer.h"
21 22
22 namespace remoting { 23 namespace remoting {
23 24
24 // The core that lives on the display thread. 25 // The core that lives on the display thread.
25 class JniGlDisplayHandler::Core : public protocol::CursorShapeStub, 26 class JniGlDisplayHandler::Core : public protocol::CursorShapeStub,
(...skipping 29 matching lines...) Expand all
55 ChromotingJniRuntime* runtime_; 56 ChromotingJniRuntime* runtime_;
56 base::WeakPtr<JniGlDisplayHandler> shell_; 57 base::WeakPtr<JniGlDisplayHandler> shell_;
57 58
58 // Will be std::move'd when GrabFrameConsumer() is called. 59 // Will be std::move'd when GrabFrameConsumer() is called.
59 std::unique_ptr<DualBufferFrameConsumer> owned_frame_consumer_; 60 std::unique_ptr<DualBufferFrameConsumer> owned_frame_consumer_;
60 61
61 base::WeakPtr<DualBufferFrameConsumer> frame_consumer_; 62 base::WeakPtr<DualBufferFrameConsumer> frame_consumer_;
62 63
63 ANativeWindow* window_ = nullptr; 64 ANativeWindow* window_ = nullptr;
64 std::unique_ptr<EglThreadContext> egl_context_; 65 std::unique_ptr<EglThreadContext> egl_context_;
65 GlRenderer renderer_; 66 std::unique_ptr<GlRenderer> renderer_;
66 67
67 // Used on display thread. 68 // Used on display thread.
68 base::WeakPtr<Core> weak_ptr_; 69 base::WeakPtr<Core> weak_ptr_;
69 base::WeakPtrFactory<Core> weak_factory_; 70 base::WeakPtrFactory<Core> weak_factory_;
70 71
71 DISALLOW_COPY_AND_ASSIGN(Core); 72 DISALLOW_COPY_AND_ASSIGN(Core);
72 }; 73 };
73 74
74 JniGlDisplayHandler::Core::Core(ChromotingJniRuntime* runtime, 75 JniGlDisplayHandler::Core::Core(ChromotingJniRuntime* runtime,
75 base::WeakPtr<JniGlDisplayHandler> shell) 76 base::WeakPtr<JniGlDisplayHandler> shell)
76 : runtime_(runtime), shell_(shell), weak_factory_(this) { 77 : runtime_(runtime), shell_(shell), weak_factory_(this) {
78 renderer_ = GlRenderer::CreateGlRendererWithDesktop();
77 weak_ptr_ = weak_factory_.GetWeakPtr(); 79 weak_ptr_ = weak_factory_.GetWeakPtr();
78 renderer_.SetDelegate(weak_ptr_); 80 renderer_->SetDelegate(weak_ptr_);
79 owned_frame_consumer_.reset(new DualBufferFrameConsumer( 81 owned_frame_consumer_.reset(new DualBufferFrameConsumer(
80 base::Bind(&GlRenderer::OnFrameReceived, renderer_.GetWeakPtr()), 82 base::Bind(&GlRenderer::OnFrameReceived, renderer_->GetWeakPtr()),
81 runtime_->display_task_runner(), 83 runtime_->display_task_runner(),
82 protocol::FrameConsumer::PixelFormat::FORMAT_RGBA)); 84 protocol::FrameConsumer::PixelFormat::FORMAT_RGBA));
83 frame_consumer_ = owned_frame_consumer_->GetWeakPtr(); 85 frame_consumer_ = owned_frame_consumer_->GetWeakPtr();
84 } 86 }
85 87
86 JniGlDisplayHandler::Core::~Core() {} 88 JniGlDisplayHandler::Core::~Core() {}
87 89
88 bool JniGlDisplayHandler::Core::CanRenderFrame() { 90 bool JniGlDisplayHandler::Core::CanRenderFrame() {
89 DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread()); 91 DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread());
90 return egl_context_ && egl_context_->IsWindowBound(); 92 return egl_context_ && egl_context_->IsWindowBound();
91 } 93 }
92 94
93 void JniGlDisplayHandler::Core::OnFrameRendered() { 95 void JniGlDisplayHandler::Core::OnFrameRendered() {
94 DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread()); 96 DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread());
95 egl_context_->SwapBuffers(); 97 egl_context_->SwapBuffers();
96 runtime_->ui_task_runner()->PostTask( 98 runtime_->ui_task_runner()->PostTask(
97 FROM_HERE, base::Bind(&JniGlDisplayHandler::OnRenderDone, shell_)); 99 FROM_HERE, base::Bind(&JniGlDisplayHandler::OnRenderDone, shell_));
98 } 100 }
99 101
100 void JniGlDisplayHandler::Core::OnSizeChanged(int width, int height) { 102 void JniGlDisplayHandler::Core::OnSizeChanged(int width, int height) {
101 DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread()); 103 DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread());
102 runtime_->ui_task_runner()->PostTask( 104 runtime_->ui_task_runner()->PostTask(
103 FROM_HERE, base::Bind(&JniGlDisplayHandler::OnCanvasSizeChanged, shell_, 105 FROM_HERE, base::Bind(&JniGlDisplayHandler::OnCanvasSizeChanged, shell_,
104 width, height)); 106 width, height));
105 } 107 }
106 108
107 void JniGlDisplayHandler::Core::SetCursorShape( 109 void JniGlDisplayHandler::Core::SetCursorShape(
108 const protocol::CursorShapeInfo& cursor_shape) { 110 const protocol::CursorShapeInfo& cursor_shape) {
109 DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread()); 111 DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread());
110 renderer_.OnCursorShapeChanged(cursor_shape); 112 renderer_->OnCursorShapeChanged(cursor_shape);
111 } 113 }
112 114
113 std::unique_ptr<protocol::FrameConsumer> 115 std::unique_ptr<protocol::FrameConsumer>
114 JniGlDisplayHandler::Core::GrabFrameConsumer() { 116 JniGlDisplayHandler::Core::GrabFrameConsumer() {
115 DCHECK(owned_frame_consumer_) << "The frame consumer is already grabbed."; 117 DCHECK(owned_frame_consumer_) << "The frame consumer is already grabbed.";
116 return std::move(owned_frame_consumer_); 118 return std::move(owned_frame_consumer_);
117 } 119 }
118 120
119 void JniGlDisplayHandler::Core::SurfaceCreated( 121 void JniGlDisplayHandler::Core::SurfaceCreated(
120 base::android::ScopedJavaGlobalRef<jobject> surface) { 122 base::android::ScopedJavaGlobalRef<jobject> surface) {
121 DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread()); 123 DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread());
122 DCHECK(!egl_context_); 124 DCHECK(!egl_context_);
123 DCHECK(!window_); 125 DCHECK(!window_);
124 renderer_.RequestCanvasSize(); 126 renderer_->RequestCanvasSize();
125 window_ = ANativeWindow_fromSurface(base::android::AttachCurrentThread(), 127 window_ = ANativeWindow_fromSurface(base::android::AttachCurrentThread(),
126 surface.obj()); 128 surface.obj());
127 egl_context_.reset(new EglThreadContext()); 129 egl_context_.reset(new EglThreadContext());
128 egl_context_->BindToWindow(window_); 130 egl_context_->BindToWindow(window_);
129 renderer_.OnSurfaceCreated(static_cast<int>(egl_context_->client_version())); 131
132 renderer_->OnSurfaceCreated(base::MakeUnique<GlCanvas>(
133 static_cast<int>(egl_context_->client_version())));
134
130 runtime_->network_task_runner()->PostTask( 135 runtime_->network_task_runner()->PostTask(
131 FROM_HERE, base::Bind(&DualBufferFrameConsumer::RequestFullDesktopFrame, 136 FROM_HERE, base::Bind(&DualBufferFrameConsumer::RequestFullDesktopFrame,
132 frame_consumer_)); 137 frame_consumer_));
133 } 138 }
134 139
135 void JniGlDisplayHandler::Core::SurfaceChanged(int width, int height) { 140 void JniGlDisplayHandler::Core::SurfaceChanged(int width, int height) {
136 DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread()); 141 DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread());
137 renderer_.OnSurfaceChanged(width, height); 142 renderer_->OnSurfaceChanged(width, height);
138 } 143 }
139 144
140 void JniGlDisplayHandler::Core::SurfaceDestroyed() { 145 void JniGlDisplayHandler::Core::SurfaceDestroyed() {
141 DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread()); 146 DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread());
142 DCHECK(egl_context_); 147 DCHECK(egl_context_);
143 DCHECK(window_); 148 DCHECK(window_);
144 renderer_.OnSurfaceDestroyed(); 149 renderer_->OnSurfaceDestroyed();
145 egl_context_.reset(); 150 egl_context_.reset();
146 ANativeWindow_release(window_); 151 ANativeWindow_release(window_);
147 window_ = nullptr; 152 window_ = nullptr;
148 } 153 }
149 154
150 void JniGlDisplayHandler::Core::SetTransformation( 155 void JniGlDisplayHandler::Core::SetTransformation(
151 const std::array<float, 9>& matrix) { 156 const std::array<float, 9>& matrix) {
152 DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread()); 157 DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread());
153 renderer_.OnPixelTransformationChanged(matrix); 158 renderer_->OnPixelTransformationChanged(matrix);
154 } 159 }
155 160
156 void JniGlDisplayHandler::Core::MoveCursor(float x, float y) { 161 void JniGlDisplayHandler::Core::MoveCursor(float x, float y) {
157 DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread()); 162 DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread());
158 renderer_.OnCursorMoved(x, y); 163 renderer_->OnCursorMoved(x, y);
159 } 164 }
160 165
161 void JniGlDisplayHandler::Core::SetCursorVisibility(bool visible) { 166 void JniGlDisplayHandler::Core::SetCursorVisibility(bool visible) {
162 DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread()); 167 DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread());
163 renderer_.OnCursorVisibilityChanged(visible); 168 renderer_->OnCursorVisibilityChanged(visible);
164 } 169 }
165 170
166 void JniGlDisplayHandler::Core::StartInputFeedback(float x, 171 void JniGlDisplayHandler::Core::StartInputFeedback(float x,
167 float y, 172 float y,
168 float diameter) { 173 float diameter) {
169 DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread()); 174 DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread());
170 renderer_.OnCursorInputFeedback(x, y, diameter); 175 renderer_->OnCursorInputFeedback(x, y, diameter);
171 } 176 }
172 177
173 base::WeakPtr<JniGlDisplayHandler::Core> 178 base::WeakPtr<JniGlDisplayHandler::Core>
174 JniGlDisplayHandler::Core::GetWeakPtr() { 179 JniGlDisplayHandler::Core::GetWeakPtr() {
175 return weak_ptr_; 180 return weak_ptr_;
176 } 181 }
177 182
178 // Shell implementations. 183 // Shell implementations.
179 184
180 JniGlDisplayHandler::JniGlDisplayHandler( 185 JniGlDisplayHandler::JniGlDisplayHandler(
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after
291 java_display_); 296 java_display_);
292 } 297 }
293 298
294 void JniGlDisplayHandler::OnCanvasSizeChanged(int width, int height) { 299 void JniGlDisplayHandler::OnCanvasSizeChanged(int width, int height) {
295 DCHECK(runtime_->ui_task_runner()->BelongsToCurrentThread()); 300 DCHECK(runtime_->ui_task_runner()->BelongsToCurrentThread());
296 Java_GlDisplay_changeCanvasSize(base::android::AttachCurrentThread(), 301 Java_GlDisplay_changeCanvasSize(base::android::AttachCurrentThread(),
297 java_display_, width, height); 302 java_display_, width, height);
298 } 303 }
299 304
300 } // namespace remoting 305 } // namespace remoting
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698