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/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 Loading... | |
| 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 |
| OLD | NEW |