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

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

Issue 2389463002: [Remoting Android] Separate the display core from JniGlDisplayHandler (Closed)
Patch Set: Lint Created 4 years, 2 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"
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/dual_buffer_frame_consumer.h" 16 #include "remoting/client/dual_buffer_frame_consumer.h"
17 #include "remoting/client/jni/chromoting_jni_runtime.h" 17 #include "remoting/client/jni/chromoting_jni_runtime.h"
18 #include "remoting/client/jni/egl_thread_context.h" 18 #include "remoting/client/jni/egl_thread_context.h"
19 #include "remoting/client/queued_task_poster.h"
20 #include "remoting/client/software_video_renderer.h" 19 #include "remoting/client/software_video_renderer.h"
21 #include "remoting/protocol/frame_consumer.h" 20 #include "remoting/protocol/frame_consumer.h"
22 21
23 namespace remoting { 22 namespace remoting {
24 23
25 JniGlDisplayHandler::JniGlDisplayHandler(ChromotingJniRuntime* runtime) 24 // The core that lives on the display thread.
26 : runtime_(runtime), weak_factory_(this) { 25 class JniGlDisplayHandler::Core : public protocol::CursorShapeStub,
26 public GlRendererDelegate {
27 public:
28 Core(ChromotingJniRuntime* runtime, base::WeakPtr<JniGlDisplayHandler> shell);
29 ~Core();
30
31 // GlRendererDelegate interface.
32 bool CanRenderFrame() override;
33 void OnFrameRendered() override;
34 void OnSizeChanged(int width, int height) override;
35
36 // CursorShapeStub interface.
37 void SetCursorShape(const protocol::CursorShapeInfo& cursor_shape) override;
38
39 // Creates the frame consumer for updating desktop frame. Should be called
40 // exactly once.
41 std::unique_ptr<protocol::FrameConsumer> CreateFrameConsumer();
42
43 void SurfaceCreated(base::android::ScopedJavaGlobalRef<jobject> surface);
44 void SurfaceChanged(int width, int height);
45 void SurfaceDestroyed();
46
47 void SetTransformation(const std::array<float, 9>& matrix);
48 void MoveCursor(float x, float y);
49 void SetCursorVisibility(bool visible);
50 void StartInputFeedback(float x, float y, float diameter);
51
52 base::WeakPtr<Core> GetWeakPtr();
53
54 private:
55 ChromotingJniRuntime* runtime_;
56 base::WeakPtr<JniGlDisplayHandler> shell_;
57 base::WeakPtr<DualBufferFrameConsumer> frame_consumer_;
58
59 ANativeWindow* window_ = nullptr;
60 std::unique_ptr<EglThreadContext> egl_context_;
61 GlRenderer renderer_;
62
63 // Used on display thread.
64 base::WeakPtr<Core> weak_ptr_;
65 base::WeakPtrFactory<Core> weak_factory_;
66
67 DISALLOW_COPY_AND_ASSIGN(Core);
68 };
69
70 JniGlDisplayHandler::Core::Core(ChromotingJniRuntime* runtime,
71 base::WeakPtr<JniGlDisplayHandler> shell)
72 : runtime_(runtime), shell_(shell), weak_factory_(this) {
27 weak_ptr_ = weak_factory_.GetWeakPtr(); 73 weak_ptr_ = weak_factory_.GetWeakPtr();
28 java_display_.Reset(Java_GlDisplay_createJavaDisplayObject(
29 base::android::AttachCurrentThread(), reinterpret_cast<intptr_t>(this)));
30 renderer_.SetDelegate(weak_ptr_); 74 renderer_.SetDelegate(weak_ptr_);
31 ui_task_poster_.reset(new QueuedTaskPoster(runtime->display_task_runner()));
32 } 75 }
33 76
34 JniGlDisplayHandler::~JniGlDisplayHandler() { 77 JniGlDisplayHandler::Core::~Core() {}
78
79 bool JniGlDisplayHandler::Core::CanRenderFrame() {
35 DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread()); 80 DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread());
36 DCHECK(!ui_task_poster_) << "Invalidate() must be called on the UI thread " 81 return egl_context_ && egl_context_->IsWindowBound();
37 "before deleting this object.";
38 } 82 }
39 83
40 void JniGlDisplayHandler::Initialize( 84 void JniGlDisplayHandler::Core::OnFrameRendered() {
41 const base::android::JavaRef<jobject>& java_client) { 85 DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread());
42 Java_GlDisplay_initializeClient(base::android::AttachCurrentThread(), 86 egl_context_->SwapBuffers();
43 java_display_, java_client); 87 runtime_->ui_task_runner()->PostTask(
88 FROM_HERE, base::Bind(&JniGlDisplayHandler::OnRenderDone, shell_));
44 } 89 }
45 90
46 void JniGlDisplayHandler::Invalidate() { 91 void JniGlDisplayHandler::Core::OnSizeChanged(int width, int height) {
47 DCHECK(runtime_->ui_task_runner()->BelongsToCurrentThread()); 92 DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread());
48 Java_GlDisplay_invalidate(base::android::AttachCurrentThread(), 93 runtime_->ui_task_runner()->PostTask(
49 java_display_); 94 FROM_HERE, base::Bind(&JniGlDisplayHandler::OnCanvasSizeChanged, shell_,
50 ui_task_poster_.reset(); 95 width, height));
51 } 96 }
52 97
53 std::unique_ptr<protocol::CursorShapeStub> 98 void JniGlDisplayHandler::Core::SetCursorShape(
54 JniGlDisplayHandler::CreateCursorShapeStub() { 99 const protocol::CursorShapeInfo& cursor_shape) {
55 return base::MakeUnique<CursorShapeStubProxy>( 100 DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread());
56 weak_ptr_, runtime_->display_task_runner()); 101 renderer_.OnCursorShapeChanged(cursor_shape);
57 } 102 }
58 103
59 std::unique_ptr<protocol::VideoRenderer> 104 std::unique_ptr<protocol::FrameConsumer>
60 JniGlDisplayHandler::CreateVideoRenderer() { 105 JniGlDisplayHandler::Core::CreateFrameConsumer() {
61 DCHECK(runtime_->ui_task_runner()->BelongsToCurrentThread());
62 DCHECK(!frame_consumer_); 106 DCHECK(!frame_consumer_);
Sergey Ulanov 2016/10/03 17:33:44 DCHECK here that this function is called on UI thr
Yuwei 2016/10/03 19:03:39 I think calling on any thread may be fine as long
Yuwei 2016/10/03 20:33:04 Added comment about threading.
63 std::unique_ptr<DualBufferFrameConsumer> consumer = 107 std::unique_ptr<DualBufferFrameConsumer> consumer =
64 base::MakeUnique<DualBufferFrameConsumer>( 108 base::MakeUnique<DualBufferFrameConsumer>(
65 base::Bind(&GlRenderer::OnFrameReceived, renderer_.GetWeakPtr()), 109 base::Bind(&GlRenderer::OnFrameReceived, renderer_.GetWeakPtr()),
66 runtime_->display_task_runner(), 110 runtime_->display_task_runner(),
67 protocol::FrameConsumer::PixelFormat::FORMAT_RGBA); 111 protocol::FrameConsumer::PixelFormat::FORMAT_RGBA);
68 frame_consumer_ = consumer->GetWeakPtr(); 112 frame_consumer_ = consumer->GetWeakPtr();
Sergey Ulanov 2016/10/03 17:33:44 frame_consumer_ is set on UI thread, but then it's
Yuwei 2016/10/03 19:03:39 I think it's mostly fine since it is only called o
Sergey Ulanov 2016/10/03 19:42:10 Problem is that there is nothing in this class to
Yuwei 2016/10/03 20:33:04 Acknowledged.
69 return base::MakeUnique<SoftwareVideoRenderer>(std::move(consumer)); 113 return std::move(consumer);
114 }
115
116 void JniGlDisplayHandler::Core::SurfaceCreated(
117 base::android::ScopedJavaGlobalRef<jobject> surface) {
118 DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread());
119 DCHECK(!egl_context_);
120 DCHECK(!window_);
121 renderer_.RequestCanvasSize();
122 window_ = ANativeWindow_fromSurface(base::android::AttachCurrentThread(),
123 surface.obj());
124 egl_context_.reset(new EglThreadContext());
125 egl_context_->BindToWindow(window_);
126 renderer_.OnSurfaceCreated(static_cast<int>(egl_context_->client_version()));
127 runtime_->network_task_runner()->PostTask(
128 FROM_HERE, base::Bind(&DualBufferFrameConsumer::RequestFullDesktopFrame,
129 frame_consumer_));
130 }
131
132 void JniGlDisplayHandler::Core::SurfaceChanged(int width, int height) {
133 DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread());
134 renderer_.OnSurfaceChanged(width, height);
135 }
136
137 void JniGlDisplayHandler::Core::SurfaceDestroyed() {
138 DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread());
139 DCHECK(egl_context_);
140 DCHECK(window_);
141 renderer_.OnSurfaceDestroyed();
142 egl_context_.reset();
143 ANativeWindow_release(window_);
Sergey Ulanov 2016/10/03 17:33:44 previously window was released in SurfaceCreatedOn
Yuwei 2016/10/03 19:03:39 Looks likes releasing window_ right after eglCreat
144 window_ = nullptr;
145 }
146
147 void JniGlDisplayHandler::Core::SetTransformation(
148 const std::array<float, 9>& matrix) {
149 DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread());
150 renderer_.OnPixelTransformationChanged(matrix);
151 }
152
153 void JniGlDisplayHandler::Core::MoveCursor(float x, float y) {
154 DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread());
155 renderer_.OnCursorMoved(x, y);
156 }
157
158 void JniGlDisplayHandler::Core::SetCursorVisibility(bool visible) {
159 DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread());
160 renderer_.OnCursorVisibilityChanged(visible);
161 }
162
163 void JniGlDisplayHandler::Core::StartInputFeedback(float x,
164 float y,
165 float diameter) {
166 DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread());
167 renderer_.OnCursorInputFeedback(x, y, diameter);
168 }
169
170 base::WeakPtr<JniGlDisplayHandler::Core>
171 JniGlDisplayHandler::Core::GetWeakPtr() {
172 return weak_ptr_;
173 }
174
175 // Shell implementations.
176
177 JniGlDisplayHandler::JniGlDisplayHandler(
178 ChromotingJniRuntime* runtime,
179 const base::android::JavaRef<jobject>& java_client)
180 : runtime_(runtime),
181 ui_task_poster_(runtime->display_task_runner()),
182 weak_factory_(this) {
183 core_.reset(new Core(runtime_, weak_factory_.GetWeakPtr()));
184 JNIEnv* env = base::android::AttachCurrentThread();
185 java_display_.Reset(Java_GlDisplay_createJavaDisplayObject(
186 env, reinterpret_cast<intptr_t>(this)));
187 Java_GlDisplay_initializeClient(env, java_display_, java_client);
188 }
189
190 JniGlDisplayHandler::~JniGlDisplayHandler() {
191 DCHECK(runtime_->ui_task_runner()->BelongsToCurrentThread());
192 Java_GlDisplay_invalidate(base::android::AttachCurrentThread(),
193 java_display_);
194 runtime_->display_task_runner()->DeleteSoon(FROM_HERE, core_.release());
195 }
196
197 std::unique_ptr<protocol::CursorShapeStub>
198 JniGlDisplayHandler::CreateCursorShapeStub() {
199 return base::MakeUnique<CursorShapeStubProxy>(
200 core_->GetWeakPtr(), runtime_->display_task_runner());
201 }
202
203 std::unique_ptr<protocol::VideoRenderer>
204 JniGlDisplayHandler::CreateVideoRenderer() {
205 return base::MakeUnique<SoftwareVideoRenderer>(core_->CreateFrameConsumer());
70 } 206 }
71 207
72 // static 208 // static
73 bool JniGlDisplayHandler::RegisterJni(JNIEnv* env) { 209 bool JniGlDisplayHandler::RegisterJni(JNIEnv* env) {
74 return RegisterNativesImpl(env); 210 return RegisterNativesImpl(env);
75 } 211 }
76 212
77 void JniGlDisplayHandler::OnSurfaceCreated( 213 void JniGlDisplayHandler::OnSurfaceCreated(
78 JNIEnv* env, 214 JNIEnv* env,
79 const base::android::JavaParamRef<jobject>& caller, 215 const base::android::JavaParamRef<jobject>& caller,
80 const base::android::JavaParamRef<jobject>& surface) { 216 const base::android::JavaParamRef<jobject>& surface) {
81 DCHECK(runtime_->ui_task_runner()->BelongsToCurrentThread()); 217 DCHECK(runtime_->ui_task_runner()->BelongsToCurrentThread());
82 runtime_->display_task_runner()->PostTask( 218 runtime_->display_task_runner()->PostTask(
83 FROM_HERE, 219 FROM_HERE,
84 base::Bind(&JniGlDisplayHandler::SurfaceCreatedOnDisplayThread, weak_ptr_, 220 base::Bind(&Core::SurfaceCreated, core_->GetWeakPtr(),
85 base::android::ScopedJavaGlobalRef<jobject>(env, surface))); 221 base::android::ScopedJavaGlobalRef<jobject>(env, surface)));
86 } 222 }
87 223
88 void JniGlDisplayHandler::OnSurfaceChanged( 224 void JniGlDisplayHandler::OnSurfaceChanged(
89 JNIEnv* env, 225 JNIEnv* env,
90 const base::android::JavaParamRef<jobject>& caller, 226 const base::android::JavaParamRef<jobject>& caller,
91 int width, 227 int width,
92 int height) { 228 int height) {
93 DCHECK(runtime_->ui_task_runner()->BelongsToCurrentThread()); 229 DCHECK(runtime_->ui_task_runner()->BelongsToCurrentThread());
94 runtime_->display_task_runner()->PostTask( 230 runtime_->display_task_runner()->PostTask(
95 FROM_HERE, base::Bind(&GlRenderer::OnSurfaceChanged, 231 FROM_HERE,
96 renderer_.GetWeakPtr(), width, height)); 232 base::Bind(&Core::SurfaceChanged, core_->GetWeakPtr(), width, height));
97 } 233 }
98 234
99 void JniGlDisplayHandler::OnSurfaceDestroyed( 235 void JniGlDisplayHandler::OnSurfaceDestroyed(
100 JNIEnv* env, 236 JNIEnv* env,
101 const base::android::JavaParamRef<jobject>& caller) { 237 const base::android::JavaParamRef<jobject>& caller) {
102 DCHECK(runtime_->ui_task_runner()->BelongsToCurrentThread()); 238 DCHECK(runtime_->ui_task_runner()->BelongsToCurrentThread());
103 runtime_->display_task_runner()->PostTask( 239 runtime_->display_task_runner()->PostTask(
104 FROM_HERE, 240 FROM_HERE, base::Bind(&Core::SurfaceDestroyed, core_->GetWeakPtr()));
105 base::Bind(&JniGlDisplayHandler::SurfaceDestroyedOnDisplayThread,
106 weak_ptr_));
107 } 241 }
108 242
109 void JniGlDisplayHandler::OnPixelTransformationChanged( 243 void JniGlDisplayHandler::OnPixelTransformationChanged(
110 JNIEnv* env, 244 JNIEnv* env,
111 const base::android::JavaParamRef<jobject>& caller, 245 const base::android::JavaParamRef<jobject>& caller,
112 const base::android::JavaParamRef<jfloatArray>& jmatrix) { 246 const base::android::JavaParamRef<jfloatArray>& jmatrix) {
113 DCHECK(runtime_->ui_task_runner()->BelongsToCurrentThread()); 247 DCHECK(runtime_->ui_task_runner()->BelongsToCurrentThread());
114 DCHECK(env->GetArrayLength(jmatrix.obj()) == 9); 248 DCHECK(env->GetArrayLength(jmatrix.obj()) == 9);
115 std::array<float, 9> matrix; 249 std::array<float, 9> matrix;
116 env->GetFloatArrayRegion(jmatrix.obj(), 0, 9, matrix.data()); 250 env->GetFloatArrayRegion(jmatrix.obj(), 0, 9, matrix.data());
117 PostSequentialTaskOnDisplayThread( 251 ui_task_poster_.AddTask(
118 base::Bind(&GlRenderer::OnPixelTransformationChanged, 252 base::Bind(&Core::SetTransformation, core_->GetWeakPtr(), matrix));
119 renderer_.GetWeakPtr(), matrix));
120 } 253 }
121 254
122 void JniGlDisplayHandler::OnCursorPixelPositionChanged( 255 void JniGlDisplayHandler::OnCursorPixelPositionChanged(
123 JNIEnv* env, 256 JNIEnv* env,
124 const base::android::JavaParamRef<jobject>& caller, 257 const base::android::JavaParamRef<jobject>& caller,
125 float x, 258 float x,
126 float y) { 259 float y) {
127 DCHECK(runtime_->ui_task_runner()->BelongsToCurrentThread()); 260 DCHECK(runtime_->ui_task_runner()->BelongsToCurrentThread());
128 PostSequentialTaskOnDisplayThread( 261 ui_task_poster_.AddTask(
129 base::Bind(&GlRenderer::OnCursorMoved, renderer_.GetWeakPtr(), x, y)); 262 base::Bind(&Core::MoveCursor, core_->GetWeakPtr(), x, y));
130 } 263 }
131 264
132 void JniGlDisplayHandler::OnCursorVisibilityChanged( 265 void JniGlDisplayHandler::OnCursorVisibilityChanged(
133 JNIEnv* env, 266 JNIEnv* env,
134 const base::android::JavaParamRef<jobject>& caller, 267 const base::android::JavaParamRef<jobject>& caller,
135 bool visible) { 268 bool visible) {
136 DCHECK(runtime_->ui_task_runner()->BelongsToCurrentThread()); 269 DCHECK(runtime_->ui_task_runner()->BelongsToCurrentThread());
137 PostSequentialTaskOnDisplayThread(base::Bind( 270 ui_task_poster_.AddTask(
138 &GlRenderer::OnCursorVisibilityChanged, renderer_.GetWeakPtr(), visible)); 271 base::Bind(&Core::SetCursorVisibility, core_->GetWeakPtr(), visible));
139 } 272 }
140 273
141 void JniGlDisplayHandler::OnCursorInputFeedback( 274 void JniGlDisplayHandler::OnCursorInputFeedback(
142 JNIEnv* env, 275 JNIEnv* env,
143 const base::android::JavaParamRef<jobject>& caller, 276 const base::android::JavaParamRef<jobject>& caller,
144 float x, 277 float x,
145 float y, 278 float y,
146 float diameter) { 279 float diameter) {
147 DCHECK(runtime_->ui_task_runner()->BelongsToCurrentThread()); 280 DCHECK(runtime_->ui_task_runner()->BelongsToCurrentThread());
148 PostSequentialTaskOnDisplayThread( 281 ui_task_poster_.AddTask(base::Bind(&Core::StartInputFeedback,
149 base::Bind(&GlRenderer::OnCursorInputFeedback, renderer_.GetWeakPtr(), x, 282 core_->GetWeakPtr(), x, y, diameter));
150 y, diameter));
151 } 283 }
152 284
153 void JniGlDisplayHandler::PostSequentialTaskOnDisplayThread( 285 void JniGlDisplayHandler::OnRenderDone() {
154 const base::Closure& task) { 286 DCHECK(runtime_->ui_task_runner()->BelongsToCurrentThread());
155 if (!ui_task_poster_) { 287 Java_GlDisplay_canvasRendered(base::android::AttachCurrentThread(),
156 return; 288 java_display_);
157 }
158 ui_task_poster_->AddTask(task);
159 } 289 }
160 290
161 bool JniGlDisplayHandler::CanRenderFrame() { 291 void JniGlDisplayHandler::OnCanvasSizeChanged(int width, int height) {
162 DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread()); 292 DCHECK(runtime_->ui_task_runner()->BelongsToCurrentThread());
163 return egl_context_ && egl_context_->IsWindowBound(); 293 Java_GlDisplay_changeCanvasSize(base::android::AttachCurrentThread(),
164 } 294 java_display_, width, height);
165
166 void JniGlDisplayHandler::OnFrameRendered() {
167 DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread());
168 egl_context_->SwapBuffers();
169 runtime_->ui_task_runner()->PostTask(
170 FROM_HERE, base::Bind(&JniGlDisplayHandler::NotifyRenderDoneOnUiThread,
171 java_display_));
172 }
173
174 void JniGlDisplayHandler::OnSizeChanged(int width, int height) {
175 DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread());
176 runtime_->ui_task_runner()->PostTask(
177 FROM_HERE, base::Bind(&JniGlDisplayHandler::ChangeCanvasSizeOnUiThread,
178 java_display_, width, height));
179 }
180
181 void JniGlDisplayHandler::SetCursorShape(
182 const protocol::CursorShapeInfo& cursor_shape) {
183 DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread());
184 renderer_.OnCursorShapeChanged(cursor_shape);
185 }
186
187 // static
188 void JniGlDisplayHandler::NotifyRenderDoneOnUiThread(
189 base::android::ScopedJavaGlobalRef<jobject> java_display) {
190 Java_GlDisplay_canvasRendered(base::android::AttachCurrentThread(),
191 java_display);
192 }
193
194 void JniGlDisplayHandler::SurfaceCreatedOnDisplayThread(
195 base::android::ScopedJavaGlobalRef<jobject> surface) {
196 DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread());
197 renderer_.RequestCanvasSize();
198 ANativeWindow* window = ANativeWindow_fromSurface(
199 base::android::AttachCurrentThread(), surface.obj());
200 egl_context_.reset(new EglThreadContext());
201 egl_context_->BindToWindow(window);
202 ANativeWindow_release(window);
203 renderer_.OnSurfaceCreated(static_cast<int>(egl_context_->client_version()));
204 runtime_->network_task_runner()->PostTask(
205 FROM_HERE, base::Bind(&DualBufferFrameConsumer::RequestFullDesktopFrame,
206 frame_consumer_));
207 }
208
209 void JniGlDisplayHandler::SurfaceDestroyedOnDisplayThread() {
210 DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread());
211 renderer_.OnSurfaceDestroyed();
212 egl_context_.reset();
213 }
214
215 // static
216 void JniGlDisplayHandler::ChangeCanvasSizeOnUiThread(
217 base::android::ScopedJavaGlobalRef<jobject> java_display,
218 int width,
219 int height) {
220 JNIEnv* env = base::android::AttachCurrentThread();
221 Java_GlDisplay_changeCanvasSize(env, java_display, width, height);
222 } 295 }
223 296
224 } // namespace remoting 297 } // 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