Index: remoting/client/ios/display/gl_display_handler.mm |
diff --git a/remoting/client/ios/display/gl_display_handler.mm b/remoting/client/ios/display/gl_display_handler.mm |
deleted file mode 100644 |
index 4f7ef51d4bccf210a5a507c3830bf499120cf367..0000000000000000000000000000000000000000 |
--- a/remoting/client/ios/display/gl_display_handler.mm |
+++ /dev/null |
@@ -1,280 +0,0 @@ |
-// Copyright 2017 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#if !defined(__has_feature) || !__has_feature(objc_arc) |
-#error "This file requires ARC support." |
-#endif |
- |
-#include <array> |
- |
-#import "remoting/client/ios/display/gl_display_handler.h" |
- |
-#import "base/mac/bind_objc_block.h" |
-#import "remoting/client/display/sys_opengl.h" |
-#import "remoting/client/ios/display/gl_demo_screen.h" |
- |
-#include "base/bind.h" |
-#include "base/macros.h" |
-#include "base/memory/ptr_util.h" |
-#include "base/memory/weak_ptr.h" |
-#include "remoting/client/chromoting_client_runtime.h" |
-#include "remoting/client/cursor_shape_stub_proxy.h" |
-#include "remoting/client/display/gl_canvas.h" |
-#include "remoting/client/display/gl_renderer.h" |
-#include "remoting/client/display/gl_renderer_delegate.h" |
-#include "remoting/client/dual_buffer_frame_consumer.h" |
-#include "remoting/client/queued_task_poster.h" |
-#include "remoting/client/software_video_renderer.h" |
- |
-namespace remoting { |
-namespace GlDisplayHandler { |
- |
-// The core that lives on the display thread. |
-class Core : public protocol::CursorShapeStub, public GlRendererDelegate { |
- public: |
- Core(); |
- ~Core() override; |
- |
- void Initialize(); |
- |
- void SetHandlerDelegate(id<GlDisplayHandlerDelegate> delegate); |
- |
- // CursorShapeStub interface. |
- void SetCursorShape(const protocol::CursorShapeInfo& cursor_shape) override; |
- |
- // GlRendererDelegate interface. |
- bool CanRenderFrame() override; |
- void OnFrameRendered() override; |
- void OnSizeChanged(int width, int height) override; |
- |
- void OnFrameReceived(std::unique_ptr<webrtc::DesktopFrame> frame, |
- const base::Closure& done); |
- void Stop(); |
- void SurfaceCreated(GLKView* view); |
- void SurfaceChanged(int width, int height); |
- void SetTransformation(const remoting::ViewMatrix& matrix); |
- std::unique_ptr<protocol::FrameConsumer> GrabFrameConsumer(); |
- EAGLContext* GetEAGLContext(); |
- base::WeakPtr<Core> GetWeakPtr(); |
- |
- private: |
- remoting::ChromotingClientRuntime* runtime_; |
- |
- // Will be std::move'd when GrabFrameConsumer() is called. |
- std::unique_ptr<DualBufferFrameConsumer> owned_frame_consumer_; |
- base::WeakPtr<DualBufferFrameConsumer> frame_consumer_; |
- |
- // TODO(yuweih): Release references once the surface is destroyed. |
- GLKView* gl_view_; |
- EAGLContext* eagl_context_; |
- std::unique_ptr<GlRenderer> renderer_; |
- // GlDemoScreen *demo_screen_; |
- id<GlDisplayHandlerDelegate> handler_delegate_; |
- |
- // Used on display thread. |
- base::WeakPtr<Core> weak_ptr_; |
- base::WeakPtrFactory<Core> weak_factory_; |
- |
- DISALLOW_COPY_AND_ASSIGN(Core); |
-}; |
- |
-Core::Core() : weak_factory_(this) { |
- runtime_ = ChromotingClientRuntime::GetInstance(); |
- DCHECK(!runtime_->display_task_runner()->BelongsToCurrentThread()); |
- |
- weak_ptr_ = weak_factory_.GetWeakPtr(); |
- |
- runtime_->display_task_runner()->PostTask( |
- FROM_HERE, base::Bind(&Core::Initialize, base::Unretained(this))); |
- |
- // Do not bind GlRenderer::OnFrameReceived. |renderer_| is not ready yet. |
- owned_frame_consumer_.reset(new remoting::DualBufferFrameConsumer( |
- base::Bind(&Core::OnFrameReceived, weak_ptr_), |
- runtime_->display_task_runner(), |
- protocol::FrameConsumer::PixelFormat::FORMAT_RGBA)); |
- frame_consumer_ = owned_frame_consumer_->GetWeakPtr(); |
-} |
- |
-Core::~Core() { |
- DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread()); |
-} |
- |
-void Core::Initialize() { |
- DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread()); |
- |
- eagl_context_ = [EAGLContext currentContext]; |
- if (!eagl_context_) { |
- // TODO(nicholss): For prod code, make sure to check for ES3 support and |
- // fall back to ES2 if needed. |
- eagl_context_ = |
- [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES3]; |
- [EAGLContext setCurrentContext:eagl_context_]; |
- } |
- |
- renderer_ = remoting::GlRenderer::CreateGlRendererWithDesktop(); |
- |
- // renderer_.RequestCanvasSize(); |
- |
- // demo_screen_ = new GlDemoScreen(); |
- // renderer_->AddDrawable(demo_screen_->GetWeakPtr()); |
- renderer_->SetDelegate(weak_ptr_); |
-} |
- |
-void Core::SetHandlerDelegate(id<GlDisplayHandlerDelegate> delegate) { |
- DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread()); |
- handler_delegate_ = delegate; |
-} |
- |
-void Core::SetCursorShape(const protocol::CursorShapeInfo& cursor_shape) { |
- DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread()); |
- renderer_->OnCursorShapeChanged(cursor_shape); |
-} |
- |
-bool Core::CanRenderFrame() { |
- DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread()); |
- return gl_view_ != NULL && eagl_context_ != NULL; |
-} |
- |
-std::unique_ptr<protocol::FrameConsumer> Core::GrabFrameConsumer() { |
- DCHECK(owned_frame_consumer_) << "The frame consumer is already grabbed."; |
- return std::move(owned_frame_consumer_); |
-} |
- |
-void Core::OnFrameReceived(std::unique_ptr<webrtc::DesktopFrame> frame, |
- const base::Closure& done) { |
- DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread()); |
- renderer_->OnFrameReceived(std::move(frame), done); |
-} |
- |
-void Core::OnFrameRendered() { |
- [gl_view_ display]; |
-} |
- |
-void Core::OnSizeChanged(int width, int height) { |
- DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread()); |
- runtime_->ui_task_runner()->PostTask( |
- FROM_HERE, base::BindBlockArc(^() { |
- [handler_delegate_ canvasSizeChanged:CGSizeMake(width, height)]; |
- })); |
-} |
- |
-void Core::Stop() { |
- DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread()); |
- |
- eagl_context_ = nil; |
- // demo_screen_ = nil; |
-} |
- |
-void Core::SurfaceCreated(GLKView* view) { |
- DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread()); |
- gl_view_ = view; |
- |
- renderer_->OnSurfaceCreated( |
- base::MakeUnique<GlCanvas>(static_cast<int>([eagl_context_ API]))); |
- |
- renderer_->RequestCanvasSize(); |
- |
- runtime_->network_task_runner()->PostTask( |
- FROM_HERE, base::Bind(&DualBufferFrameConsumer::RequestFullDesktopFrame, |
- frame_consumer_)); |
-} |
- |
-void Core::SurfaceChanged(int width, int height) { |
- DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread()); |
- renderer_->OnSurfaceChanged(width, height); |
-} |
- |
-void Core::SetTransformation(const remoting::ViewMatrix& matrix) { |
- DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread()); |
- renderer_->OnPixelTransformationChanged(matrix.ToMatrixArray()); |
-} |
- |
-EAGLContext* Core::GetEAGLContext() { |
- return eagl_context_; |
-} |
- |
-base::WeakPtr<remoting::GlDisplayHandler::Core> Core::GetWeakPtr() { |
- return weak_ptr_; |
-} |
- |
-} // namespace GlDisplayHandler |
-} // namespace remoting |
- |
-@interface GlDisplayHandler () { |
- remoting::GlDisplayHandler::Core* _core; |
- remoting::ChromotingClientRuntime* _runtime; |
- std::unique_ptr<remoting::QueuedTaskPoster> _uiTaskPoster; |
-} |
-@end |
- |
-@implementation GlDisplayHandler |
- |
-- (id)init { |
- self = [super init]; |
- if (self) { |
- _runtime = remoting::ChromotingClientRuntime::GetInstance(); |
- _core = new remoting::GlDisplayHandler::Core(); |
- _uiTaskPoster.reset( |
- new remoting::QueuedTaskPoster(_runtime->display_task_runner())); |
- } |
- return self; |
-} |
- |
-#pragma mark - Public |
- |
-- (void)stop { |
- _runtime->display_task_runner()->PostTask( |
- FROM_HERE, |
- base::Bind(&remoting::GlDisplayHandler::Core::Stop, _core->GetWeakPtr())); |
-} |
- |
-- (std::unique_ptr<remoting::protocol::VideoRenderer>)CreateVideoRenderer { |
- return base::MakeUnique<remoting::SoftwareVideoRenderer>( |
- _core->GrabFrameConsumer()); |
-} |
- |
-- (std::unique_ptr<remoting::protocol::CursorShapeStub>)CreateCursorShapeStub { |
- return base::MakeUnique<remoting::CursorShapeStubProxy>( |
- _core->GetWeakPtr(), _runtime->display_task_runner()); |
-} |
- |
-- (EAGLContext*)GetEAGLContext { |
- return _core->GetEAGLContext(); |
-} |
- |
-- (void)onSurfaceCreated:(GLKView*)view { |
- _runtime->display_task_runner()->PostTask( |
- FROM_HERE, base::Bind(&remoting::GlDisplayHandler::Core::SurfaceCreated, |
- _core->GetWeakPtr(), view)); |
-} |
- |
-- (void)onSurfaceChanged:(const CGRect&)frame { |
- _runtime->display_task_runner()->PostTask( |
- FROM_HERE, |
- base::Bind(&remoting::GlDisplayHandler::Core::SurfaceChanged, |
- _core->GetWeakPtr(), frame.size.width, frame.size.height)); |
-} |
- |
-- (void)onPixelTransformationChanged:(const remoting::ViewMatrix&)matrix { |
- _uiTaskPoster->AddTask( |
- base::Bind(&remoting::GlDisplayHandler::Core::SetTransformation, |
- _core->GetWeakPtr(), matrix)); |
-} |
- |
-#pragma mark - Properties |
- |
-- (void)setDelegate:(id<GlDisplayHandlerDelegate>)delegate { |
- _runtime->display_task_runner()->PostTask( |
- FROM_HERE, |
- base::Bind(&remoting::GlDisplayHandler::Core::SetHandlerDelegate, |
- _core->GetWeakPtr(), delegate)); |
-} |
- |
-- (id<GlDisplayHandlerDelegate>)delegate { |
- // Implementation is still required for UNAVAILABLE_ATTRIBUTE. |
- NOTREACHED(); |
- return nil; |
-} |
- |
-@end |