Chromium Code Reviews| Index: remoting/client/gl_renderer.cc |
| diff --git a/remoting/client/gl_renderer.cc b/remoting/client/gl_renderer.cc |
| index 64ce7d31d537b0db9870ebe1a8a77bcb631153f5..c422f33a7a0bad0d7e82c32f3e51387b353770e9 100644 |
| --- a/remoting/client/gl_renderer.cc |
| +++ b/remoting/client/gl_renderer.cc |
| @@ -17,13 +17,20 @@ namespace remoting { |
| GlRenderer::GlRenderer() : |
| weak_factory_(this) { |
| - weak_ptr_ = weak_factory_.GetWeakPtr(); |
| thread_checker_.DetachFromThread(); |
| } |
| GlRenderer::~GlRenderer() { |
| } |
| +GlRenderer* GlRenderer::CreateGlRendererWithDesktop() { |
|
Yuwei
2016/12/21 23:41:59
I think it makes more sense to create a new class
nicholss
2017/01/09 18:50:24
I think that makes sense but not required for this
|
| + GlRenderer* renderer = new GlRenderer(); |
| + renderer->AddDrawable(renderer->desktop_.GetWeakPtr()); |
| + renderer->AddDrawable(renderer->cursor_.GetWeakPtr()); |
| + renderer->AddDrawable(renderer->cursor_feedback_.GetWeakPtr()); |
| + return renderer; |
| +} |
| + |
| void GlRenderer::SetDelegate(base::WeakPtr<GlRendererDelegate> delegate) { |
| DCHECK(!delegate_); |
| delegate_ = delegate; |
| @@ -48,24 +55,28 @@ void GlRenderer::OnPixelTransformationChanged( |
| RequestRender(); |
| } |
| +// TODO(nicholss): This method seems like it should not be in this class. |
| void GlRenderer::OnCursorMoved(float x, float y) { |
| DCHECK(thread_checker_.CalledOnValidThread()); |
| cursor_.SetCursorPosition(x, y); |
| RequestRender(); |
| } |
| +// TODO(nicholss): This method seems like it should not be in this class. |
| void GlRenderer::OnCursorInputFeedback(float x, float y, float diameter) { |
| DCHECK(thread_checker_.CalledOnValidThread()); |
| cursor_feedback_.StartAnimation(x, y, diameter); |
| RequestRender(); |
| } |
| +// TODO(nicholss): This method seems like it should not be in this class. |
| void GlRenderer::OnCursorVisibilityChanged(bool visible) { |
| DCHECK(thread_checker_.CalledOnValidThread()); |
| cursor_.SetCursorVisible(visible); |
| RequestRender(); |
| } |
| +// TODO(nicholss): This method seems like it should not be in this class. |
| void GlRenderer::OnFrameReceived(std::unique_ptr<webrtc::DesktopFrame> frame, |
| const base::Closure& done) { |
| DCHECK(thread_checker_.CalledOnValidThread()); |
| @@ -84,6 +95,7 @@ void GlRenderer::OnFrameReceived(std::unique_ptr<webrtc::DesktopFrame> frame, |
| RequestRender(); |
| } |
| +// TODO(nicholss): This method seems like it should not be in this class. |
| void GlRenderer::OnCursorShapeChanged(const protocol::CursorShapeInfo& shape) { |
| DCHECK(thread_checker_.CalledOnValidThread()); |
| cursor_.SetCursorShape(shape); |
| @@ -92,17 +104,10 @@ void GlRenderer::OnCursorShapeChanged(const protocol::CursorShapeInfo& shape) { |
| void GlRenderer::OnSurfaceCreated(int gl_version) { |
| DCHECK(thread_checker_.CalledOnValidThread()); |
| -#ifndef NDEBUG |
| - // Set the background clear color to bright green for debugging purposes. |
| - glClearColor(0.0f, 1.0f, 0.0f, 1.0f); |
| -#else |
| - // Set the background clear color to black. |
| - glClearColor(0.0f, 0.0f, 0.0f, 1.0f); |
| -#endif |
| - canvas_.reset(new GlCanvas(gl_version)); |
| - desktop_.SetCanvas(canvas_.get()); |
| - cursor_.SetCanvas(canvas_.get()); |
| - cursor_feedback_.SetCanvas(canvas_.get()); |
| + canvas_.reset(GlCanvas::CreateGlCanvas(gl_version)); |
| + for (auto& drawable : drawables_) { |
| + drawable->SetCanvas(canvas_.get()); |
| + } |
| } |
| void GlRenderer::OnSurfaceChanged(int view_width, int view_height) { |
| @@ -117,14 +122,14 @@ void GlRenderer::OnSurfaceChanged(int view_width, int view_height) { |
| void GlRenderer::OnSurfaceDestroyed() { |
| DCHECK(thread_checker_.CalledOnValidThread()); |
| - cursor_feedback_.SetCanvas(nullptr); |
| - cursor_.SetCanvas(nullptr); |
| - desktop_.SetCanvas(nullptr); |
| + for (auto& drawable : drawables_) { |
| + drawable->SetCanvas(nullptr); |
| + } |
| canvas_.reset(); |
| } |
| base::WeakPtr<GlRenderer> GlRenderer::GetWeakPtr() { |
| - return weak_ptr_; |
| + return weak_factory_.GetWeakPtr(); |
|
Yuwei
2016/12/21 23:41:59
Why removing |weak_ptr_|? We used |weak_ptr_| sinc
nicholss
2016/12/22 16:21:41
Nothing in the documentation says this call is thr
Yuwei
2016/12/22 19:01:10
Yep, this is an undocumented bug("feature"?). See
joedow
2016/12/22 19:18:09
Thanks for pointing that out Yuwei! That is a goo
Sergey Ulanov
2016/12/27 21:00:19
weak ptrs get bound to a thread when they are dere
nicholss
2017/01/09 18:50:24
reverted;
|
| } |
| void GlRenderer::RequestRender() { |
| @@ -133,32 +138,32 @@ void GlRenderer::RequestRender() { |
| return; |
| } |
| base::ThreadTaskRunnerHandle::Get()->PostTask( |
| - FROM_HERE, base::Bind(&GlRenderer::OnRender, weak_ptr_)); |
| + FROM_HERE, base::Bind(&GlRenderer::OnRender, GetWeakPtr())); |
| render_scheduled_ = true; |
| } |
| +void GlRenderer::AddDrawable(base::WeakPtr<GlDrawable> drawable) { |
| + drawable->SetCanvas(canvas_.get()); |
| + drawables_.push_back(drawable); |
| + std::sort(drawables_.begin(), drawables_.end(), |
| + drawable::SortDrawablesZOrder); |
| +} |
| + |
| void GlRenderer::OnRender() { |
| DCHECK(thread_checker_.CalledOnValidThread()); |
| render_scheduled_ = false; |
| if (!delegate_ || !delegate_->CanRenderFrame()) { |
| return; |
| } |
| - |
| if (canvas_) { |
| - glClear(GL_COLOR_BUFFER_BIT); |
| - |
| - // Layers will be drawn from bottom to top. |
| - desktop_.Draw(); |
| - |
| - // |cursor_feedback_| should be drawn before |cursor_| so that the cursor |
| - // won't be covered by the feedback animation. |
| - if (cursor_feedback_.Draw()) { |
| - RequestRender(); |
| + canvas_->Clear(); |
| + // Draw each drawable in order. |
| + for (auto& drawable : drawables_) { |
| + if (drawable->Draw()) { |
| + RequestRender(); |
|
joedow
2016/12/22 00:29:03
Can you break out of the loop once a drawable indi
nicholss
2016/12/22 16:21:41
No, request render means: next draw loop, I have s
Yuwei
2016/12/22 19:01:10
I think it worth it to add a comment about the ret
joedow
2016/12/22 19:18:09
Ah yeah, I misread that. As long as RequestRender
|
| + } |
| } |
| - |
| - cursor_.Draw(); |
| } |
| - |
| delegate_->OnFrameRendered(); |
| while (!pending_done_callbacks_.empty()) { |