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

Side by Side Diff: remoting/client/display/gl_renderer.cc

Issue 2623413004: [Remoting Android] Fix thread issue with OpenGL drawable (Closed)
Patch Set: PTAL Point 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/display/gl_renderer.h" 5 #include "remoting/client/display/gl_renderer.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/logging.h" 10 #include "base/logging.h"
11 #include "base/threading/thread_task_runner_handle.h" 11 #include "base/threading/thread_task_runner_handle.h"
12 #include "remoting/client/display/drawable.h" 12 #include "remoting/client/display/drawable.h"
13 #include "remoting/client/display/gl_canvas.h" 13 #include "remoting/client/display/gl_canvas.h"
14 #include "remoting/client/display/gl_math.h" 14 #include "remoting/client/display/gl_math.h"
15 #include "remoting/client/display/gl_renderer_delegate.h" 15 #include "remoting/client/display/gl_renderer_delegate.h"
16 #include "remoting/client/display/sys_opengl.h" 16 #include "remoting/client/display/sys_opengl.h"
17 #include "third_party/webrtc/modules/desktop_capture/desktop_frame.h" 17 #include "third_party/webrtc/modules/desktop_capture/desktop_frame.h"
18 18
19 namespace remoting { 19 namespace remoting {
20 20
21 namespace { 21 namespace {
22 22
23 bool CompareDrawableZOrder(base::WeakPtr<Drawable> a, 23 template <typename DrawablePtr>
nicholss 2017/01/13 16:45:01 I don't understand why this is better.
24 base::WeakPtr<Drawable> b) { 24 bool CompareDrawableZOrder(DrawablePtr a, DrawablePtr b) {
25 return a->GetZIndex() < b->GetZIndex(); 25 return a->GetZIndex() < b->GetZIndex();
26 } 26 }
27 27
28 } // namespace 28 } // namespace
29 29
30 GlRenderer::GlRenderer() : 30 GlRenderer::GlRenderer() :
31 weak_factory_(this) { 31 weak_factory_(this) {
32 weak_ptr_ = weak_factory_.GetWeakPtr(); 32 weak_ptr_ = weak_factory_.GetWeakPtr();
33 thread_checker_.DetachFromThread(); 33 thread_checker_.DetachFromThread();
34 } 34 }
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
124 cursor_feedback_.SetCanvas(nullptr); 124 cursor_feedback_.SetCanvas(nullptr);
125 cursor_.SetCanvas(nullptr); 125 cursor_.SetCanvas(nullptr);
126 desktop_.SetCanvas(nullptr); 126 desktop_.SetCanvas(nullptr);
127 canvas_.reset(); 127 canvas_.reset();
128 } 128 }
129 129
130 base::WeakPtr<GlRenderer> GlRenderer::GetWeakPtr() { 130 base::WeakPtr<GlRenderer> GlRenderer::GetWeakPtr() {
131 return weak_ptr_; 131 return weak_ptr_;
132 } 132 }
133 133
134 // static
135 std::unique_ptr<GlRenderer> GlRenderer::CreateGlRendererWithDesktop() {
Sergey Ulanov 2017/01/13 02:03:10 This code looks weird. If the GlRenderer owns all
Yuwei 2017/01/13 02:21:08 That's exactly what I plan to do.
joedow 2017/01/13 16:09:34 To my knowledge Scott is actively working on this
nicholss 2017/01/13 16:45:01 This is close to what the plan is. A single object
136 std::unique_ptr<GlRenderer> renderer(new GlRenderer());
137 std::vector<Drawable*> drawables{&renderer->desktop_, &renderer->cursor_,
138 &renderer->cursor_feedback_};
139 std::sort(drawables.begin(), drawables.end(),
Sergey Ulanov 2017/01/13 02:03:10 This is way more complicated than necessary. We ha
nicholss 2017/01/13 16:45:01 that is if you assume nothing can be added or remo
140 CompareDrawableZOrder<Drawable*>);
141 for (auto* drawable : drawables) {
nicholss 2017/01/13 16:45:01 Why would you sort them, they are going to be sort
142 renderer->drawables_.push_back(drawable->GetWeakPtr());
143 }
144 return renderer;
145 }
146
134 void GlRenderer::RequestRender() { 147 void GlRenderer::RequestRender() {
135 DCHECK(thread_checker_.CalledOnValidThread()); 148 DCHECK(thread_checker_.CalledOnValidThread());
136 if (render_scheduled_) { 149 if (render_scheduled_) {
137 return; 150 return;
138 } 151 }
139 base::ThreadTaskRunnerHandle::Get()->PostTask( 152 base::ThreadTaskRunnerHandle::Get()->PostTask(
140 FROM_HERE, base::Bind(&GlRenderer::OnRender, weak_ptr_)); 153 FROM_HERE, base::Bind(&GlRenderer::OnRender, weak_ptr_));
141 render_scheduled_ = true; 154 render_scheduled_ = true;
142 } 155 }
143 156
144 void GlRenderer::AddDrawable(base::WeakPtr<Drawable> drawable) { 157 void GlRenderer::AddDrawable(base::WeakPtr<Drawable> drawable) {
Sergey Ulanov 2017/01/13 02:03:10 Is this function still used anywhere?
Yuwei 2017/01/13 02:21:08 I think the unit test is still using it. Also IIRC
nicholss 2017/01/13 16:45:01 This method is the entire point of my last commit.
158 DCHECK(thread_checker_.CalledOnValidThread());
145 drawable->SetCanvas(canvas_ ? canvas_->GetWeakPtr() : nullptr); 159 drawable->SetCanvas(canvas_ ? canvas_->GetWeakPtr() : nullptr);
146 drawables_.push_back(drawable); 160 drawables_.push_back(drawable);
147 std::sort(drawables_.begin(), drawables_.end(), CompareDrawableZOrder); 161 std::sort(drawables_.begin(), drawables_.end(),
162 CompareDrawableZOrder<base::WeakPtr<Drawable>>);
148 } 163 }
149 164
150 void GlRenderer::OnRender() { 165 void GlRenderer::OnRender() {
151 DCHECK(thread_checker_.CalledOnValidThread()); 166 DCHECK(thread_checker_.CalledOnValidThread());
152 render_scheduled_ = false; 167 render_scheduled_ = false;
153 if (!delegate_ || !delegate_->CanRenderFrame()) { 168 if (!delegate_ || !delegate_->CanRenderFrame()) {
154 return; 169 return;
155 } 170 }
156 171
157 if (canvas_) { 172 if (canvas_) {
158 canvas_->Clear(); 173 canvas_->Clear();
159 // Draw each drawable in order. 174 // Draw each drawable in order.
160 for (auto& drawable : drawables_) { 175 for (auto& drawable : drawables_) {
161 if (drawable->Draw()) { 176 if (drawable->Draw()) {
162 RequestRender(); 177 RequestRender();
163 } 178 }
164 } 179 }
165 } 180 }
166 181
167 delegate_->OnFrameRendered(); 182 delegate_->OnFrameRendered();
168 183
169 while (!pending_done_callbacks_.empty()) { 184 while (!pending_done_callbacks_.empty()) {
170 pending_done_callbacks_.front().Run(); 185 pending_done_callbacks_.front().Run();
171 pending_done_callbacks_.pop(); 186 pending_done_callbacks_.pop();
172 } 187 }
173 } 188 }
174 189
175 std::unique_ptr<GlRenderer> GlRenderer::CreateGlRendererWithDesktop() {
nicholss 2017/01/13 16:45:01 I think it is a mistake to remove this and use the
176 std::unique_ptr<GlRenderer> renderer(new GlRenderer());
177 renderer->AddDrawable(renderer->desktop_.GetWeakPtr());
178 renderer->AddDrawable(renderer->cursor_.GetWeakPtr());
179 renderer->AddDrawable(renderer->cursor_feedback_.GetWeakPtr());
180 return renderer;
181 }
182
183 } // namespace remoting 190 } // namespace remoting
OLDNEW
« remoting/client/display/gl_cursor.cc ('K') | « remoting/client/display/gl_desktop.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698