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

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

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

Powered by Google App Engine
This is Rietveld 408576698