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

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

Issue 2175963002: [Chromoting] Implement GlRenderer (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Implements full transpose Created 4 years, 4 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 std::array<float, 9> normalized_matrix = matrix;
43 NormalizeTransformationMatrix(view_width_, view_height_, canvas_width_,
44 canvas_height_, &normalized_matrix);
45 canvas_->SetNormalizedTransformation(normalized_matrix);
46 RequestRender();
47 }
48
49 void GlRenderer::OnCursorMoved(int x, int y) {
50 DCHECK(thread_checker_.CalledOnValidThread());
51 cursor_.SetCursorPosition(x, y);
52 RequestRender();
53 }
54
55 void GlRenderer::OnCursorInputFeedback(int x, int y, float diameter) {
56 DCHECK(thread_checker_.CalledOnValidThread());
57 cursor_feedback_.StartAnimation(static_cast<float>(x) / canvas_width_,
58 static_cast<float>(y) / canvas_height_,
59 diameter / canvas_width_,
60 diameter / canvas_height_);
61 RequestRender();
62 }
63
64 void GlRenderer::OnCursorVisibilityChanged(bool visible) {
65 DCHECK(thread_checker_.CalledOnValidThread());
66 cursor_.SetCursorVisible(visible);
67 RequestRender();
68 }
69
70 void GlRenderer::OnFrameReceived(std::unique_ptr<webrtc::DesktopFrame> frame,
71 const base::Closure& done) {
72 DCHECK(thread_checker_.CalledOnValidThread());
73 DCHECK(frame->size().width() > 0 && frame->size().height() > 0);
74 if (canvas_width_ != frame->size().width() ||
75 canvas_height_ != frame->size().height()) {
76 if (delegate_) {
77 delegate_->OnSizeChanged(frame->size().width(), frame->size().height());
78 }
79 canvas_width_ = frame->size().width();
80 canvas_height_ = frame->size().height();
81 cursor_.SetCanvasSize(canvas_width_, canvas_height_);
82 }
83
84 desktop_.SetVideoFrame(std::move(frame));
85 pending_done_callbacks_.push(done);
86 RequestRender();
87 }
88
89 void GlRenderer::OnCursorShapeChanged(const protocol::CursorShapeInfo& shape) {
90 DCHECK(thread_checker_.CalledOnValidThread());
91 cursor_.SetCursorShape(shape);
92 RequestRender();
93 }
94
95 void GlRenderer::OnSurfaceCreated(int gl_version) {
96 DCHECK(thread_checker_.CalledOnValidThread());
97 // Set the background clear color to black.
98 glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
99 canvas_.reset(new GlCanvas(gl_version));
100 desktop_.SetCanvas(canvas_.get());
101 cursor_.SetCanvas(canvas_.get());
102 cursor_feedback_.SetCanvas(canvas_.get());
103 }
104
105 void GlRenderer::OnSurfaceChanged(int view_width, int view_height) {
106 DCHECK(thread_checker_.CalledOnValidThread());
107 DCHECK(view_width > 0 && view_height > 0);
108 glViewport(0, 0, view_width, view_height);
109 view_width_ = view_width;
110 view_height_ = view_height;
111 RequestRender();
112 }
113
114 void GlRenderer::OnSurfaceDestroyed() {
115 DCHECK(thread_checker_.CalledOnValidThread());
116 cursor_feedback_.SetCanvas(nullptr);
117 cursor_.SetCanvas(nullptr);
118 desktop_.SetCanvas(nullptr);
119 canvas_.reset();
120 }
121
122 base::WeakPtr<GlRenderer> GlRenderer::GetWeakPtr() {
123 return weak_ptr_;
124 }
125
126 void GlRenderer::RequestRender() {
127 if (render_scheduled_) {
128 return;
129 }
130 base::ThreadTaskRunnerHandle::Get()->PostTask(
131 FROM_HERE, base::Bind(&GlRenderer::OnRender, weak_ptr_));
132 render_scheduled_ = true;
133 }
134
135 void GlRenderer::OnRender() {
136 DCHECK(thread_checker_.CalledOnValidThread());
137 render_scheduled_ = false;
138 if (!delegate_ || !delegate_->CanRenderFrame()) {
139 return;
140 }
141
142 glClear(GL_COLOR_BUFFER_BIT);
143 desktop_.Draw();
144 cursor_.Draw();
145 if (cursor_feedback_.Draw()) {
146 RequestRender();
147 }
148
149 delegate_->OnFrameRendered();
150
151 while (!pending_done_callbacks_.empty()) {
152 pending_done_callbacks_.front().Run();
153 pending_done_callbacks_.pop();
154 }
155 }
156
157 } // 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