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

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

Issue 2196493002: [Chromoting] Unit Tests for GlRenderer (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Add unittest 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
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/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/memory/ptr_util.h"
9 #include "base/threading/thread_task_runner_handle.h" 10 #include "base/threading/thread_task_runner_handle.h"
10 #include "remoting/client/gl_canvas.h" 11 #include "remoting/client/gl_renderer_core.h"
11 #include "remoting/client/gl_math.h"
12 #include "remoting/client/gl_renderer_delegate.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" 13 #include "third_party/webrtc/modules/desktop_capture/desktop_frame.h"
15 14
16 namespace remoting { 15 namespace remoting {
17 16
18 GlRenderer::GlRenderer() : 17 GlRenderer::GlRenderer() :
18 core_(GlRendererCore::CreateCore()),
19 weak_factory_(this) { 19 weak_factory_(this) {
20 weak_ptr_ = weak_factory_.GetWeakPtr(); 20 weak_ptr_ = weak_factory_.GetWeakPtr();
21 thread_checker_.DetachFromThread(); 21 thread_checker_.DetachFromThread();
22 } 22 }
23 23
24 GlRenderer::~GlRenderer() { 24 GlRenderer::~GlRenderer() {
25 } 25 }
26 26
27 void GlRenderer::SetDelegate(base::WeakPtr<GlRendererDelegate> delegate) { 27 void GlRenderer::SetDelegate(base::WeakPtr<GlRendererDelegate> delegate) {
28 DCHECK(!delegate_); 28 DCHECK(!delegate_);
29 delegate_ = delegate; 29 delegate_ = delegate;
30 } 30 }
31 31
32 void GlRenderer::RequestCanvasSize() { 32 void GlRenderer::RequestCanvasSize() {
33 DCHECK(thread_checker_.CalledOnValidThread()); 33 DCHECK(thread_checker_.CalledOnValidThread());
34 if (delegate_) { 34 if (delegate_) {
35 delegate_->OnSizeChanged(canvas_width_, canvas_height_); 35 delegate_->OnSizeChanged(core_->GetCanvasWidth(), core_->GetCanvasHeight());
36 } 36 }
37 } 37 }
38 38
39 void GlRenderer::RequestRender() {
40 if (render_scheduled_) {
41 return;
42 }
43 base::ThreadTaskRunnerHandle::Get()->PostTask(
44 FROM_HERE, base::Bind(&GlRenderer::OnRender, weak_ptr_));
45 render_scheduled_ = true;
46 }
47
39 void GlRenderer::OnPixelTransformationChanged( 48 void GlRenderer::OnPixelTransformationChanged(
40 const std::array<float, 9>& matrix) { 49 const std::array<float, 9>& matrix) {
41 DCHECK(thread_checker_.CalledOnValidThread()); 50 DCHECK(thread_checker_.CalledOnValidThread());
42 std::array<float, 9> normalized_matrix = matrix; 51 core_->SetPixelTransformation(matrix);
43 NormalizeTransformationMatrix(view_width_, view_height_, canvas_width_,
44 canvas_height_, &normalized_matrix);
45 canvas_->SetNormalizedTransformation(normalized_matrix);
46 RequestRender(); 52 RequestRender();
47 } 53 }
48 54
49 void GlRenderer::OnCursorMoved(int x, int y) { 55 void GlRenderer::OnCursorMoved(int x, int y) {
50 DCHECK(thread_checker_.CalledOnValidThread()); 56 DCHECK(thread_checker_.CalledOnValidThread());
51 cursor_.SetCursorPosition(x, y); 57 core_->MoveCursor(x, y);
52 RequestRender(); 58 RequestRender();
53 } 59 }
54 60
55 void GlRenderer::OnCursorInputFeedback(int x, int y, float diameter) { 61 void GlRenderer::OnCursorInputFeedback(int x, int y, float diameter) {
56 DCHECK(thread_checker_.CalledOnValidThread()); 62 DCHECK(thread_checker_.CalledOnValidThread());
57 cursor_feedback_.StartAnimation(static_cast<float>(x) / canvas_width_, 63 core_->StartFeedbackAnimation(x, y, diameter);
58 static_cast<float>(y) / canvas_height_,
59 diameter / canvas_width_,
60 diameter / canvas_height_);
61 RequestRender(); 64 RequestRender();
62 } 65 }
63 66
64 void GlRenderer::OnCursorVisibilityChanged(bool visible) { 67 void GlRenderer::OnCursorVisibilityChanged(bool visible) {
65 DCHECK(thread_checker_.CalledOnValidThread()); 68 DCHECK(thread_checker_.CalledOnValidThread());
66 cursor_.SetCursorVisible(visible); 69 core_->SetCursorVisibility(visible);
67 RequestRender(); 70 RequestRender();
68 } 71 }
69 72
70 void GlRenderer::OnFrameReceived(std::unique_ptr<webrtc::DesktopFrame> frame, 73 void GlRenderer::OnFrameReceived(std::unique_ptr<webrtc::DesktopFrame> frame,
71 const base::Closure& done) { 74 const base::Closure& done) {
72 DCHECK(thread_checker_.CalledOnValidThread()); 75 DCHECK(thread_checker_.CalledOnValidThread());
73 DCHECK(frame->size().width() > 0 && frame->size().height() > 0); 76 DCHECK(frame->size().width() > 0 && frame->size().height() > 0);
74 if (canvas_width_ != frame->size().width() || 77 if (core_->GetCanvasWidth() != frame->size().width() ||
75 canvas_height_ != frame->size().height()) { 78 core_->GetCanvasHeight() != frame->size().height()) {
76 if (delegate_) { 79 if (delegate_) {
77 delegate_->OnSizeChanged(frame->size().width(), frame->size().height()); 80 delegate_->OnSizeChanged(frame->size().width(), frame->size().height());
78 } 81 }
79 canvas_width_ = frame->size().width(); 82 core_->SetCanvasSize(frame->size().width(), frame->size().height());
80 canvas_height_ = frame->size().height();
81 cursor_.SetCanvasSize(canvas_width_, canvas_height_);
82 } 83 }
83 84
84 desktop_.SetVideoFrame(std::move(frame)); 85 core_->SetDesktopFrame(*frame);
85 pending_done_callbacks_.push(done); 86 pending_done_callbacks_.push(done);
86 RequestRender(); 87 RequestRender();
87 } 88 }
88 89
89 void GlRenderer::OnCursorShapeChanged(const protocol::CursorShapeInfo& shape) { 90 void GlRenderer::OnCursorShapeChanged(const protocol::CursorShapeInfo& shape) {
90 DCHECK(thread_checker_.CalledOnValidThread()); 91 DCHECK(thread_checker_.CalledOnValidThread());
91 cursor_.SetCursorShape(shape); 92 core_->SetCursorShape(shape);
92 RequestRender(); 93 RequestRender();
93 } 94 }
94 95
95 void GlRenderer::OnSurfaceCreated(int gl_version) { 96 void GlRenderer::OnSurfaceCreated(int gl_version) {
96 DCHECK(thread_checker_.CalledOnValidThread()); 97 DCHECK(thread_checker_.CalledOnValidThread());
97 // Set the background clear color to black. 98 core_->CreateCanvas(gl_version);
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 } 99 }
104 100
105 void GlRenderer::OnSurfaceChanged(int view_width, int view_height) { 101 void GlRenderer::OnSurfaceChanged(int view_width, int view_height) {
106 DCHECK(thread_checker_.CalledOnValidThread()); 102 DCHECK(thread_checker_.CalledOnValidThread());
107 DCHECK(view_width > 0 && view_height > 0); 103 core_->SetViewSize(view_width, view_height);
108 glViewport(0, 0, view_width, view_height);
109 view_width_ = view_width;
110 view_height_ = view_height;
111 RequestRender(); 104 RequestRender();
112 } 105 }
113 106
114 void GlRenderer::OnSurfaceDestroyed() { 107 void GlRenderer::OnSurfaceDestroyed() {
115 DCHECK(thread_checker_.CalledOnValidThread()); 108 DCHECK(thread_checker_.CalledOnValidThread());
116 cursor_feedback_.SetCanvas(nullptr); 109 core_->DestroyCanvas();
117 cursor_.SetCanvas(nullptr);
118 desktop_.SetCanvas(nullptr);
119 canvas_.reset();
120 } 110 }
121 111
122 base::WeakPtr<GlRenderer> GlRenderer::GetWeakPtr() { 112 base::WeakPtr<GlRenderer> GlRenderer::GetWeakPtr() {
123 return weak_ptr_; 113 return weak_ptr_;
124 } 114 }
125 115
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() { 116 void GlRenderer::OnRender() {
136 DCHECK(thread_checker_.CalledOnValidThread()); 117 DCHECK(thread_checker_.CalledOnValidThread());
137 render_scheduled_ = false; 118 render_scheduled_ = false;
138 if (!delegate_ || !delegate_->CanRenderFrame()) { 119 if (!delegate_ || !delegate_->CanRenderFrame()) {
139 return; 120 return;
140 } 121 }
141 122
142 glClear(GL_COLOR_BUFFER_BIT); 123 if (core_->DrawFrame()) {
143 desktop_.Draw();
144 cursor_.Draw();
145 if (cursor_feedback_.Draw()) {
146 RequestRender(); 124 RequestRender();
147 } 125 }
148 126
149 delegate_->OnFrameRendered(); 127 delegate_->OnFrameRendered();
150 128
151 while (!pending_done_callbacks_.empty()) { 129 while (!pending_done_callbacks_.empty()) {
152 pending_done_callbacks_.front().Run(); 130 pending_done_callbacks_.front().Run();
153 pending_done_callbacks_.pop(); 131 pending_done_callbacks_.pop();
154 } 132 }
155 } 133 }
156 134
157 } // namespace remoting 135 } // namespace remoting
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698