Index: remoting/client/display/gl_renderer.cc |
diff --git a/remoting/client/gl_renderer.cc b/remoting/client/display/gl_renderer.cc |
similarity index 67% |
rename from remoting/client/gl_renderer.cc |
rename to remoting/client/display/gl_renderer.cc |
index 64ce7d31d537b0db9870ebe1a8a77bcb631153f5..c2bfc4096fc209a57c3dbc200d863b55cdbe8d9f 100644 |
--- a/remoting/client/gl_renderer.cc |
+++ b/remoting/client/display/gl_renderer.cc |
@@ -2,26 +2,31 @@ |
// Use of this source code is governed by a BSD-style license that can be |
// found in the LICENSE file. |
-#include "remoting/client/gl_renderer.h" |
+#include "remoting/client/display/gl_renderer.h" |
#include "base/bind.h" |
#include "base/logging.h" |
#include "base/threading/thread_task_runner_handle.h" |
-#include "remoting/client/gl_canvas.h" |
-#include "remoting/client/gl_math.h" |
-#include "remoting/client/gl_renderer_delegate.h" |
+#include "remoting/client/display/gl_canvas.h" |
+#include "remoting/client/display/gl_math.h" |
+#include "remoting/client/display/gl_renderer_delegate.h" |
#include "remoting/client/sys_opengl.h" |
#include "third_party/webrtc/modules/desktop_capture/desktop_frame.h" |
namespace remoting { |
-GlRenderer::GlRenderer() : |
- weak_factory_(this) { |
- weak_ptr_ = weak_factory_.GetWeakPtr(); |
+GlRenderer::GlRenderer() : weak_factory_(this) { |
thread_checker_.DetachFromThread(); |
} |
-GlRenderer::~GlRenderer() { |
+GlRenderer::~GlRenderer() {} |
nicholss
2017/01/03 23:14:34
This change leaked into this CL, this was not inte
|
+ |
+GlRenderer* GlRenderer::CreateGlRendererWithDesktop() { |
+ GlRenderer* renderer = new GlRenderer(); |
+ renderer->AddDrawable(renderer->desktop_.GetWeakPtr()); |
+ renderer->AddDrawable(renderer->cursor_.GetWeakPtr()); |
+ renderer->AddDrawable(renderer->cursor_feedback_.GetWeakPtr()); |
+ return renderer; |
} |
void GlRenderer::SetDelegate(base::WeakPtr<GlRendererDelegate> delegate) { |
@@ -41,31 +46,35 @@ void GlRenderer::OnPixelTransformationChanged( |
DCHECK(thread_checker_.CalledOnValidThread()); |
if (!canvas_) { |
LOG(WARNING) << "Trying to set transformation matrix when the canvas is " |
- "not ready."; |
+ "not ready."; |
return; |
} |
canvas_->SetTransformationMatrix(matrix); |
RequestRender(); |
} |
+// TODO(nicholss): This method seems like it should not be in this class. |
void GlRenderer::OnCursorMoved(float x, float y) { |
DCHECK(thread_checker_.CalledOnValidThread()); |
cursor_.SetCursorPosition(x, y); |
RequestRender(); |
} |
+// TODO(nicholss): This method seems like it should not be in this class. |
void GlRenderer::OnCursorInputFeedback(float x, float y, float diameter) { |
DCHECK(thread_checker_.CalledOnValidThread()); |
cursor_feedback_.StartAnimation(x, y, diameter); |
RequestRender(); |
} |
+// TODO(nicholss): This method seems like it should not be in this class. |
void GlRenderer::OnCursorVisibilityChanged(bool visible) { |
DCHECK(thread_checker_.CalledOnValidThread()); |
cursor_.SetCursorVisible(visible); |
RequestRender(); |
} |
+// TODO(nicholss): This method seems like it should not be in this class. |
void GlRenderer::OnFrameReceived(std::unique_ptr<webrtc::DesktopFrame> frame, |
const base::Closure& done) { |
DCHECK(thread_checker_.CalledOnValidThread()); |
@@ -84,6 +93,7 @@ void GlRenderer::OnFrameReceived(std::unique_ptr<webrtc::DesktopFrame> frame, |
RequestRender(); |
} |
+// TODO(nicholss): This method seems like it should not be in this class. |
void GlRenderer::OnCursorShapeChanged(const protocol::CursorShapeInfo& shape) { |
DCHECK(thread_checker_.CalledOnValidThread()); |
cursor_.SetCursorShape(shape); |
@@ -92,17 +102,10 @@ void GlRenderer::OnCursorShapeChanged(const protocol::CursorShapeInfo& shape) { |
void GlRenderer::OnSurfaceCreated(int gl_version) { |
DCHECK(thread_checker_.CalledOnValidThread()); |
-#ifndef NDEBUG |
- // Set the background clear color to bright green for debugging purposes. |
- glClearColor(0.0f, 1.0f, 0.0f, 1.0f); |
-#else |
- // Set the background clear color to black. |
- glClearColor(0.0f, 0.0f, 0.0f, 1.0f); |
-#endif |
- canvas_.reset(new GlCanvas(gl_version)); |
- desktop_.SetCanvas(canvas_.get()); |
- cursor_.SetCanvas(canvas_.get()); |
- cursor_feedback_.SetCanvas(canvas_.get()); |
+ canvas_.reset(GlCanvas::CreateGlCanvas(gl_version)); |
+ for (auto& drawable : drawables_) { |
+ drawable->SetCanvas(canvas_.get()); |
+ } |
} |
void GlRenderer::OnSurfaceChanged(int view_width, int view_height) { |
@@ -117,14 +120,14 @@ void GlRenderer::OnSurfaceChanged(int view_width, int view_height) { |
void GlRenderer::OnSurfaceDestroyed() { |
DCHECK(thread_checker_.CalledOnValidThread()); |
- cursor_feedback_.SetCanvas(nullptr); |
- cursor_.SetCanvas(nullptr); |
- desktop_.SetCanvas(nullptr); |
+ for (auto& drawable : drawables_) { |
+ drawable->SetCanvas(nullptr); |
+ } |
canvas_.reset(); |
} |
base::WeakPtr<GlRenderer> GlRenderer::GetWeakPtr() { |
- return weak_ptr_; |
+ return weak_factory_.GetWeakPtr(); |
} |
void GlRenderer::RequestRender() { |
@@ -133,32 +136,32 @@ void GlRenderer::RequestRender() { |
return; |
} |
base::ThreadTaskRunnerHandle::Get()->PostTask( |
- FROM_HERE, base::Bind(&GlRenderer::OnRender, weak_ptr_)); |
+ FROM_HERE, base::Bind(&GlRenderer::OnRender, GetWeakPtr())); |
render_scheduled_ = true; |
} |
+void GlRenderer::AddDrawable(base::WeakPtr<GlDrawable> drawable) { |
+ drawable->SetCanvas(canvas_.get()); |
+ drawables_.push_back(drawable); |
+ std::sort(drawables_.begin(), drawables_.end(), |
+ drawable::DrawablesZOrderComparator); |
+} |
+ |
void GlRenderer::OnRender() { |
DCHECK(thread_checker_.CalledOnValidThread()); |
render_scheduled_ = false; |
if (!delegate_ || !delegate_->CanRenderFrame()) { |
return; |
} |
- |
if (canvas_) { |
- glClear(GL_COLOR_BUFFER_BIT); |
- |
- // Layers will be drawn from bottom to top. |
- desktop_.Draw(); |
- |
- // |cursor_feedback_| should be drawn before |cursor_| so that the cursor |
- // won't be covered by the feedback animation. |
- if (cursor_feedback_.Draw()) { |
- RequestRender(); |
+ canvas_->Clear(); |
+ // Draw each drawable in order. |
+ for (auto& drawable : drawables_) { |
+ if (drawable->Draw()) { |
+ RequestRender(); |
+ } |
} |
- |
- cursor_.Draw(); |
} |
- |
delegate_->OnFrameRendered(); |
while (!pending_done_callbacks_.empty()) { |