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

Side by Side Diff: remoting/client/display/gl_renderer.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
« no previous file with comments | « remoting/client/display/gl_renderer.h ('k') | remoting/client/display/gl_renderer_unittest.cc » ('j') | 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/display/gl_renderer.h" 5 #include "remoting/client/display/gl_renderer.h"
6 6
7 #include <algorithm>
8
7 #include "base/bind.h" 9 #include "base/bind.h"
8 #include "base/logging.h" 10 #include "base/logging.h"
9 #include "base/threading/thread_task_runner_handle.h" 11 #include "base/threading/thread_task_runner_handle.h"
12 #include "remoting/client/display/drawable.h"
10 #include "remoting/client/display/gl_canvas.h" 13 #include "remoting/client/display/gl_canvas.h"
11 #include "remoting/client/display/gl_math.h" 14 #include "remoting/client/display/gl_math.h"
12 #include "remoting/client/display/gl_renderer_delegate.h" 15 #include "remoting/client/display/gl_renderer_delegate.h"
13 #include "remoting/client/display/sys_opengl.h" 16 #include "remoting/client/display/sys_opengl.h"
14 #include "third_party/webrtc/modules/desktop_capture/desktop_frame.h" 17 #include "third_party/webrtc/modules/desktop_capture/desktop_frame.h"
15 18
16 namespace remoting { 19 namespace remoting {
17 20
21 namespace {
22
23 bool CompareDrawableZOrder(base::WeakPtr<Drawable> a,
24 base::WeakPtr<Drawable> b) {
25 return a->GetZIndex() < b->GetZIndex();
26 }
27
28 } // namespace
29
18 GlRenderer::GlRenderer() : 30 GlRenderer::GlRenderer() :
19 weak_factory_(this) { 31 weak_factory_(this) {
20 weak_ptr_ = weak_factory_.GetWeakPtr(); 32 weak_ptr_ = weak_factory_.GetWeakPtr();
21 thread_checker_.DetachFromThread(); 33 thread_checker_.DetachFromThread();
22 } 34 }
23 35
24 GlRenderer::~GlRenderer() { 36 GlRenderer::~GlRenderer() {}
25 }
26 37
27 void GlRenderer::SetDelegate(base::WeakPtr<GlRendererDelegate> delegate) { 38 void GlRenderer::SetDelegate(base::WeakPtr<GlRendererDelegate> delegate) {
28 DCHECK(!delegate_); 39 DCHECK(!delegate_);
29 delegate_ = delegate; 40 delegate_ = delegate;
30 } 41 }
31 42
32 void GlRenderer::RequestCanvasSize() { 43 void GlRenderer::RequestCanvasSize() {
33 DCHECK(thread_checker_.CalledOnValidThread()); 44 DCHECK(thread_checker_.CalledOnValidThread());
34 if (delegate_) { 45 if (delegate_) {
35 delegate_->OnSizeChanged(canvas_width_, canvas_height_); 46 delegate_->OnSizeChanged(canvas_width_, canvas_height_);
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
83 pending_done_callbacks_.push(done); 94 pending_done_callbacks_.push(done);
84 RequestRender(); 95 RequestRender();
85 } 96 }
86 97
87 void GlRenderer::OnCursorShapeChanged(const protocol::CursorShapeInfo& shape) { 98 void GlRenderer::OnCursorShapeChanged(const protocol::CursorShapeInfo& shape) {
88 DCHECK(thread_checker_.CalledOnValidThread()); 99 DCHECK(thread_checker_.CalledOnValidThread());
89 cursor_.SetCursorShape(shape); 100 cursor_.SetCursorShape(shape);
90 RequestRender(); 101 RequestRender();
91 } 102 }
92 103
93 void GlRenderer::OnSurfaceCreated(int gl_version) { 104 void GlRenderer::OnSurfaceCreated(std::unique_ptr<Canvas> canvas) {
94 DCHECK(thread_checker_.CalledOnValidThread()); 105 DCHECK(thread_checker_.CalledOnValidThread());
95 #ifndef NDEBUG 106 canvas_ = std::move(canvas);
96 // Set the background clear color to bright green for debugging purposes. 107 for (auto& drawable : drawables_) {
97 glClearColor(0.0f, 1.0f, 0.0f, 1.0f); 108 drawable->SetCanvas(canvas_->GetWeakPtr());
98 #else 109 }
99 // Set the background clear color to black.
100 glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
101 #endif
102 canvas_.reset(new GlCanvas(gl_version));
103 desktop_.SetCanvas(canvas_.get());
104 cursor_.SetCanvas(canvas_.get());
105 cursor_feedback_.SetCanvas(canvas_.get());
106 } 110 }
107 111
108 void GlRenderer::OnSurfaceChanged(int view_width, int view_height) { 112 void GlRenderer::OnSurfaceChanged(int view_width, int view_height) {
109 DCHECK(thread_checker_.CalledOnValidThread()); 113 DCHECK(thread_checker_.CalledOnValidThread());
110 if (!canvas_) { 114 if (!canvas_) {
111 LOG(WARNING) << "Trying to set the view size when the canvas is not ready."; 115 LOG(WARNING) << "Trying to set the view size when the canvas is not ready.";
112 return; 116 return;
113 } 117 }
114 canvas_->SetViewSize(view_width, view_height); 118 canvas_->SetViewSize(view_width, view_height);
115 RequestRender(); 119 RequestRender();
(...skipping 14 matching lines...) Expand all
130 void GlRenderer::RequestRender() { 134 void GlRenderer::RequestRender() {
131 DCHECK(thread_checker_.CalledOnValidThread()); 135 DCHECK(thread_checker_.CalledOnValidThread());
132 if (render_scheduled_) { 136 if (render_scheduled_) {
133 return; 137 return;
134 } 138 }
135 base::ThreadTaskRunnerHandle::Get()->PostTask( 139 base::ThreadTaskRunnerHandle::Get()->PostTask(
136 FROM_HERE, base::Bind(&GlRenderer::OnRender, weak_ptr_)); 140 FROM_HERE, base::Bind(&GlRenderer::OnRender, weak_ptr_));
137 render_scheduled_ = true; 141 render_scheduled_ = true;
138 } 142 }
139 143
144 void GlRenderer::AddDrawable(base::WeakPtr<Drawable> drawable) {
145 drawable->SetCanvas(canvas_ ? canvas_->GetWeakPtr() : nullptr);
146 drawables_.push_back(drawable);
147 std::sort(drawables_.begin(), drawables_.end(), CompareDrawableZOrder);
148 }
149
140 void GlRenderer::OnRender() { 150 void GlRenderer::OnRender() {
141 DCHECK(thread_checker_.CalledOnValidThread()); 151 DCHECK(thread_checker_.CalledOnValidThread());
142 render_scheduled_ = false; 152 render_scheduled_ = false;
143 if (!delegate_ || !delegate_->CanRenderFrame()) { 153 if (!delegate_ || !delegate_->CanRenderFrame()) {
144 return; 154 return;
145 } 155 }
146 156
147 if (canvas_) { 157 if (canvas_) {
148 glClear(GL_COLOR_BUFFER_BIT); 158 canvas_->Clear();
149 159 // Draw each drawable in order.
150 // Layers will be drawn from bottom to top. 160 for (auto& drawable : drawables_) {
151 desktop_.Draw(); 161 if (drawable->Draw()) {
152 162 RequestRender();
153 // |cursor_feedback_| should be drawn before |cursor_| so that the cursor 163 }
154 // won't be covered by the feedback animation.
155 if (cursor_feedback_.Draw()) {
156 RequestRender();
157 } 164 }
158
159 cursor_.Draw();
160 } 165 }
161 166
162 delegate_->OnFrameRendered(); 167 delegate_->OnFrameRendered();
163 168
164 while (!pending_done_callbacks_.empty()) { 169 while (!pending_done_callbacks_.empty()) {
165 pending_done_callbacks_.front().Run(); 170 pending_done_callbacks_.front().Run();
166 pending_done_callbacks_.pop(); 171 pending_done_callbacks_.pop();
167 } 172 }
168 } 173 }
169 174
175 std::unique_ptr<GlRenderer> GlRenderer::CreateGlRendererWithDesktop() {
176 std::unique_ptr<GlRenderer> renderer(new GlRenderer());
177 renderer->AddDrawable(renderer->desktop_.GetWeakPtr());
Yuwei 2017/01/12 23:23:17 Sorry that I haven't spied the bug here. The threa
joedow 2017/01/13 15:49:44 The thread checkers of the drawables will be initi
178 renderer->AddDrawable(renderer->cursor_.GetWeakPtr());
179 renderer->AddDrawable(renderer->cursor_feedback_.GetWeakPtr());
180 return renderer;
181 }
182
170 } // namespace remoting 183 } // namespace remoting
OLDNEW
« no previous file with comments | « remoting/client/display/gl_renderer.h ('k') | remoting/client/display/gl_renderer_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698