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 { |