Chromium Code Reviews| 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 |
| index 5b0b324df6125316638a190c0099193717591612..30b6da38631aa14a0ab2776c19d6bc8e3c700222 100644 |
| --- a/remoting/client/ios/display/gl_display_handler.mm |
| +++ b/remoting/client/ios/display/gl_display_handler.mm |
| @@ -24,6 +24,7 @@ |
| #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 { |
| @@ -37,6 +38,8 @@ class Core : public protocol::CursorShapeStub, public GlRendererDelegate { |
| void Initialize(); |
| + void SetHandlerDelegate(id<GlDisplayHandlerDelegate> delegate); |
| + |
| // CursorShapeStub interface. |
| void SetCursorShape(const protocol::CursorShapeInfo& cursor_shape) override; |
| @@ -50,6 +53,7 @@ class Core : public protocol::CursorShapeStub, public GlRendererDelegate { |
| 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(); |
| @@ -61,10 +65,12 @@ class Core : public protocol::CursorShapeStub, public GlRendererDelegate { |
| 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_; |
| @@ -115,6 +121,11 @@ void Core::Initialize() { |
| 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); |
| @@ -137,11 +148,15 @@ void Core::OnFrameReceived(std::unique_ptr<webrtc::DesktopFrame> frame, |
| } |
| void Core::OnFrameRendered() { |
| - [gl_view_ setNeedsDisplay]; |
| + [gl_view_ display]; |
|
Yuwei
2017/05/03 05:52:35
Turns out `setNeedsDisplay` is async and will thro
|
| } |
| void Core::OnSizeChanged(int width, int height) { |
| - // Nothing to do. |
| + DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread()); |
| + runtime_->ui_task_runner()->PostTask( |
| + FROM_HERE, base::BindBlockArc(^() { |
| + [handler_delegate_ canvasSizeChanged:CGSizeMake(width, height)]; |
| + })); |
| } |
| void Core::Stop() { |
| @@ -166,14 +181,11 @@ void Core::SurfaceCreated(GLKView* view) { |
| void Core::SurfaceChanged(int width, int height) { |
| DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread()); |
| renderer_->OnSurfaceChanged(width, height); |
| +} |
| - // TODO(nicholss): This are wrong values but it lets us get something on the |
| - // screen. |
| - std::array<float, 9> matrix = {{1, 0, 0, // Row 1 |
| - 0, 1, 0, // Row 2 |
| - 0, 0, 1}}; |
| - |
| - renderer_->OnPixelTransformationChanged(matrix); |
| +void Core::SetTransformation(const remoting::ViewMatrix& matrix) { |
| + DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread()); |
| + renderer_->OnPixelTransformationChanged(matrix.ToMatrixArray()); |
| } |
| EAGLContext* Core::GetEAGLContext() { |
| @@ -190,6 +202,7 @@ base::WeakPtr<remoting::GlDisplayHandler::Core> Core::GetWeakPtr() { |
| @interface GlDisplayHandler () { |
| remoting::GlDisplayHandler::Core* _core; |
| remoting::ChromotingClientRuntime* _runtime; |
| + std::unique_ptr<remoting::QueuedTaskPoster> _uiTaskPoster; |
|
Yuwei
2017/05/03 05:52:35
FYI this object is for input synchronization. Basi
|
| } |
| @end |
| @@ -200,6 +213,8 @@ base::WeakPtr<remoting::GlDisplayHandler::Core> Core::GetWeakPtr() { |
| if (self) { |
| _runtime = remoting::ChromotingClientRuntime::GetInstance(); |
| _core = new remoting::GlDisplayHandler::Core(); |
| + _uiTaskPoster.reset( |
| + new remoting::QueuedTaskPoster(_runtime->display_task_runner())); |
| } |
| return self; |
| } |
| @@ -212,6 +227,13 @@ base::WeakPtr<remoting::GlDisplayHandler::Core> Core::GetWeakPtr() { |
| base::Bind(&remoting::GlDisplayHandler::Core::Stop, _core->GetWeakPtr())); |
| } |
| +- (void)setDelegate:(id<GlDisplayHandlerDelegate>)delegate { |
| + _runtime->display_task_runner()->PostTask( |
| + FROM_HERE, |
| + base::Bind(&remoting::GlDisplayHandler::Core::SetHandlerDelegate, |
| + _core->GetWeakPtr(), delegate)); |
| +} |
| + |
| - (std::unique_ptr<remoting::protocol::VideoRenderer>)CreateVideoRenderer { |
| return base::MakeUnique<remoting::SoftwareVideoRenderer>( |
| _core->GrabFrameConsumer()); |
| @@ -239,6 +261,12 @@ base::WeakPtr<remoting::GlDisplayHandler::Core> Core::GetWeakPtr() { |
| _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)); |
| +} |
| + |
| // TODO(nicholss): Remove this function, it is not used in the final impl, |
| // or it should call RequestRender. |
| - (void)glkView:(GLKView*)view drawInRect:(CGRect)rect { |