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

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

Issue 2614443003: Moving the GL implementation details into a sub folder for client display. (Closed)
Patch Set: Updating the include define for the new path. 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_delegate.h » ('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/gl_renderer.h" 5 #include "remoting/client/display/gl_renderer.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/logging.h" 8 #include "base/logging.h"
9 #include "base/threading/thread_task_runner_handle.h" 9 #include "base/threading/thread_task_runner_handle.h"
10 #include "remoting/client/gl_canvas.h" 10 #include "remoting/client/display/gl_canvas.h"
11 #include "remoting/client/gl_math.h" 11 #include "remoting/client/display/gl_math.h"
12 #include "remoting/client/gl_renderer_delegate.h" 12 #include "remoting/client/display/gl_renderer_delegate.h"
13 #include "remoting/client/sys_opengl.h" 13 #include "remoting/client/sys_opengl.h"
14 #include "third_party/webrtc/modules/desktop_capture/desktop_frame.h" 14 #include "third_party/webrtc/modules/desktop_capture/desktop_frame.h"
15 15
16 namespace remoting { 16 namespace remoting {
17 17
18 GlRenderer::GlRenderer() : 18 GlRenderer::GlRenderer() : weak_factory_(this) {
19 weak_factory_(this) {
20 weak_ptr_ = weak_factory_.GetWeakPtr();
21 thread_checker_.DetachFromThread(); 19 thread_checker_.DetachFromThread();
22 } 20 }
23 21
24 GlRenderer::~GlRenderer() { 22 GlRenderer::~GlRenderer() {}
nicholss 2017/01/03 23:14:34 This change leaked into this CL, this was not inte
23
24 GlRenderer* GlRenderer::CreateGlRendererWithDesktop() {
25 GlRenderer* renderer = new GlRenderer();
26 renderer->AddDrawable(renderer->desktop_.GetWeakPtr());
27 renderer->AddDrawable(renderer->cursor_.GetWeakPtr());
28 renderer->AddDrawable(renderer->cursor_feedback_.GetWeakPtr());
29 return renderer;
25 } 30 }
26 31
27 void GlRenderer::SetDelegate(base::WeakPtr<GlRendererDelegate> delegate) { 32 void GlRenderer::SetDelegate(base::WeakPtr<GlRendererDelegate> delegate) {
28 DCHECK(!delegate_); 33 DCHECK(!delegate_);
29 delegate_ = delegate; 34 delegate_ = delegate;
30 } 35 }
31 36
32 void GlRenderer::RequestCanvasSize() { 37 void GlRenderer::RequestCanvasSize() {
33 DCHECK(thread_checker_.CalledOnValidThread()); 38 DCHECK(thread_checker_.CalledOnValidThread());
34 if (delegate_) { 39 if (delegate_) {
35 delegate_->OnSizeChanged(canvas_width_, canvas_height_); 40 delegate_->OnSizeChanged(canvas_width_, canvas_height_);
36 } 41 }
37 } 42 }
38 43
39 void GlRenderer::OnPixelTransformationChanged( 44 void GlRenderer::OnPixelTransformationChanged(
40 const std::array<float, 9>& matrix) { 45 const std::array<float, 9>& matrix) {
41 DCHECK(thread_checker_.CalledOnValidThread()); 46 DCHECK(thread_checker_.CalledOnValidThread());
42 if (!canvas_) { 47 if (!canvas_) {
43 LOG(WARNING) << "Trying to set transformation matrix when the canvas is " 48 LOG(WARNING) << "Trying to set transformation matrix when the canvas is "
44 "not ready."; 49 "not ready.";
45 return; 50 return;
46 } 51 }
47 canvas_->SetTransformationMatrix(matrix); 52 canvas_->SetTransformationMatrix(matrix);
48 RequestRender(); 53 RequestRender();
49 } 54 }
50 55
56 // TODO(nicholss): This method seems like it should not be in this class.
51 void GlRenderer::OnCursorMoved(float x, float y) { 57 void GlRenderer::OnCursorMoved(float x, float y) {
52 DCHECK(thread_checker_.CalledOnValidThread()); 58 DCHECK(thread_checker_.CalledOnValidThread());
53 cursor_.SetCursorPosition(x, y); 59 cursor_.SetCursorPosition(x, y);
54 RequestRender(); 60 RequestRender();
55 } 61 }
56 62
63 // TODO(nicholss): This method seems like it should not be in this class.
57 void GlRenderer::OnCursorInputFeedback(float x, float y, float diameter) { 64 void GlRenderer::OnCursorInputFeedback(float x, float y, float diameter) {
58 DCHECK(thread_checker_.CalledOnValidThread()); 65 DCHECK(thread_checker_.CalledOnValidThread());
59 cursor_feedback_.StartAnimation(x, y, diameter); 66 cursor_feedback_.StartAnimation(x, y, diameter);
60 RequestRender(); 67 RequestRender();
61 } 68 }
62 69
70 // TODO(nicholss): This method seems like it should not be in this class.
63 void GlRenderer::OnCursorVisibilityChanged(bool visible) { 71 void GlRenderer::OnCursorVisibilityChanged(bool visible) {
64 DCHECK(thread_checker_.CalledOnValidThread()); 72 DCHECK(thread_checker_.CalledOnValidThread());
65 cursor_.SetCursorVisible(visible); 73 cursor_.SetCursorVisible(visible);
66 RequestRender(); 74 RequestRender();
67 } 75 }
68 76
77 // TODO(nicholss): This method seems like it should not be in this class.
69 void GlRenderer::OnFrameReceived(std::unique_ptr<webrtc::DesktopFrame> frame, 78 void GlRenderer::OnFrameReceived(std::unique_ptr<webrtc::DesktopFrame> frame,
70 const base::Closure& done) { 79 const base::Closure& done) {
71 DCHECK(thread_checker_.CalledOnValidThread()); 80 DCHECK(thread_checker_.CalledOnValidThread());
72 DCHECK(frame->size().width() > 0 && frame->size().height() > 0); 81 DCHECK(frame->size().width() > 0 && frame->size().height() > 0);
73 if (canvas_width_ != frame->size().width() || 82 if (canvas_width_ != frame->size().width() ||
74 canvas_height_ != frame->size().height()) { 83 canvas_height_ != frame->size().height()) {
75 if (delegate_) { 84 if (delegate_) {
76 delegate_->OnSizeChanged(frame->size().width(), frame->size().height()); 85 delegate_->OnSizeChanged(frame->size().width(), frame->size().height());
77 } 86 }
78 canvas_width_ = frame->size().width(); 87 canvas_width_ = frame->size().width();
79 canvas_height_ = frame->size().height(); 88 canvas_height_ = frame->size().height();
80 } 89 }
81 90
82 desktop_.SetVideoFrame(*frame); 91 desktop_.SetVideoFrame(*frame);
83 pending_done_callbacks_.push(done); 92 pending_done_callbacks_.push(done);
84 RequestRender(); 93 RequestRender();
85 } 94 }
86 95
96 // TODO(nicholss): This method seems like it should not be in this class.
87 void GlRenderer::OnCursorShapeChanged(const protocol::CursorShapeInfo& shape) { 97 void GlRenderer::OnCursorShapeChanged(const protocol::CursorShapeInfo& shape) {
88 DCHECK(thread_checker_.CalledOnValidThread()); 98 DCHECK(thread_checker_.CalledOnValidThread());
89 cursor_.SetCursorShape(shape); 99 cursor_.SetCursorShape(shape);
90 RequestRender(); 100 RequestRender();
91 } 101 }
92 102
93 void GlRenderer::OnSurfaceCreated(int gl_version) { 103 void GlRenderer::OnSurfaceCreated(int gl_version) {
94 DCHECK(thread_checker_.CalledOnValidThread()); 104 DCHECK(thread_checker_.CalledOnValidThread());
95 #ifndef NDEBUG 105 canvas_.reset(GlCanvas::CreateGlCanvas(gl_version));
96 // Set the background clear color to bright green for debugging purposes. 106 for (auto& drawable : drawables_) {
97 glClearColor(0.0f, 1.0f, 0.0f, 1.0f); 107 drawable->SetCanvas(canvas_.get());
98 #else 108 }
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 } 109 }
107 110
108 void GlRenderer::OnSurfaceChanged(int view_width, int view_height) { 111 void GlRenderer::OnSurfaceChanged(int view_width, int view_height) {
109 DCHECK(thread_checker_.CalledOnValidThread()); 112 DCHECK(thread_checker_.CalledOnValidThread());
110 if (!canvas_) { 113 if (!canvas_) {
111 LOG(WARNING) << "Trying to set the view size when the canvas is not ready."; 114 LOG(WARNING) << "Trying to set the view size when the canvas is not ready.";
112 return; 115 return;
113 } 116 }
114 canvas_->SetViewSize(view_width, view_height); 117 canvas_->SetViewSize(view_width, view_height);
115 RequestRender(); 118 RequestRender();
116 } 119 }
117 120
118 void GlRenderer::OnSurfaceDestroyed() { 121 void GlRenderer::OnSurfaceDestroyed() {
119 DCHECK(thread_checker_.CalledOnValidThread()); 122 DCHECK(thread_checker_.CalledOnValidThread());
120 cursor_feedback_.SetCanvas(nullptr); 123 for (auto& drawable : drawables_) {
121 cursor_.SetCanvas(nullptr); 124 drawable->SetCanvas(nullptr);
122 desktop_.SetCanvas(nullptr); 125 }
123 canvas_.reset(); 126 canvas_.reset();
124 } 127 }
125 128
126 base::WeakPtr<GlRenderer> GlRenderer::GetWeakPtr() { 129 base::WeakPtr<GlRenderer> GlRenderer::GetWeakPtr() {
127 return weak_ptr_; 130 return weak_factory_.GetWeakPtr();
128 } 131 }
129 132
130 void GlRenderer::RequestRender() { 133 void GlRenderer::RequestRender() {
131 DCHECK(thread_checker_.CalledOnValidThread()); 134 DCHECK(thread_checker_.CalledOnValidThread());
132 if (render_scheduled_) { 135 if (render_scheduled_) {
133 return; 136 return;
134 } 137 }
135 base::ThreadTaskRunnerHandle::Get()->PostTask( 138 base::ThreadTaskRunnerHandle::Get()->PostTask(
136 FROM_HERE, base::Bind(&GlRenderer::OnRender, weak_ptr_)); 139 FROM_HERE, base::Bind(&GlRenderer::OnRender, GetWeakPtr()));
137 render_scheduled_ = true; 140 render_scheduled_ = true;
138 } 141 }
139 142
143 void GlRenderer::AddDrawable(base::WeakPtr<GlDrawable> drawable) {
144 drawable->SetCanvas(canvas_.get());
145 drawables_.push_back(drawable);
146 std::sort(drawables_.begin(), drawables_.end(),
147 drawable::DrawablesZOrderComparator);
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
147 if (canvas_) { 156 if (canvas_) {
148 glClear(GL_COLOR_BUFFER_BIT); 157 canvas_->Clear();
149 158 // Draw each drawable in order.
150 // Layers will be drawn from bottom to top. 159 for (auto& drawable : drawables_) {
151 desktop_.Draw(); 160 if (drawable->Draw()) {
152 161 RequestRender();
153 // |cursor_feedback_| should be drawn before |cursor_| so that the cursor 162 }
154 // won't be covered by the feedback animation.
155 if (cursor_feedback_.Draw()) {
156 RequestRender();
157 } 163 }
158
159 cursor_.Draw();
160 } 164 }
161
162 delegate_->OnFrameRendered(); 165 delegate_->OnFrameRendered();
163 166
164 while (!pending_done_callbacks_.empty()) { 167 while (!pending_done_callbacks_.empty()) {
165 pending_done_callbacks_.front().Run(); 168 pending_done_callbacks_.front().Run();
166 pending_done_callbacks_.pop(); 169 pending_done_callbacks_.pop();
167 } 170 }
168 } 171 }
169 172
170 } // namespace remoting 173 } // namespace remoting
OLDNEW
« no previous file with comments | « remoting/client/display/gl_renderer.h ('k') | remoting/client/display/gl_renderer_delegate.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698