[4.0] Change to process events when the application is paused 84/157984/1
authorHeeyong Song <heeyong.song@samsung.com>
Mon, 25 Sep 2017 06:59:13 +0000 (15:59 +0900)
committerHeeyong Song <heeyong.song@samsung.com>
Fri, 27 Oct 2017 06:06:30 +0000 (15:06 +0900)
Change-Id: I1a798c461962ce34eed99d97971a85012e1e08b4

15 files changed:
automated-tests/src/dali-internal/utc-Dali-Internal-Core.cpp
automated-tests/src/dali/dali-test-suite-utils/test-render-controller.cpp
automated-tests/src/dali/dali-test-suite-utils/test-render-controller.h
dali/integration-api/core.cpp
dali/integration-api/core.h
dali/integration-api/render-controller.h
dali/internal/common/core-impl.cpp
dali/internal/common/core-impl.h
dali/internal/event/common/event-thread-services.h
dali/internal/event/common/stage-impl.cpp
dali/internal/event/common/stage-impl.h
dali/internal/event/events/gesture-event-processor.cpp
dali/internal/event/rendering/texture-impl.cpp
dali/internal/event/size-negotiation/relayout-controller-impl.cpp
dali/internal/update/queue/update-message-queue.cpp

index 77c7a1f..e12a27a 100644 (file)
@@ -37,6 +37,34 @@ void utc_dali_internal_core_cleanup()
   test_return_value = TET_PASS;
 }
 
+namespace
+{
+
+class RelayoutSignalHandler : public Dali::ConnectionTracker
+{
+public:
+
+  RelayoutSignalHandler( TestApplication& application )
+  : mApplication( application ),
+    mSignalCalled( false )
+  {
+  }
+
+  // callback to be connected to RelayoutSignal
+  void RelayoutCallback( Actor actor  )
+  {
+    tet_infoline("RelayoutCallback is called");
+
+    mSignalCalled = true;
+
+    mApplication.SendNotification();
+  }
+
+  TestApplication& mApplication;
+  bool   mSignalCalled;
+};
+
+} // anonymous namespace
 
 int UtcDaliCoreTopMargin(void)
 {
@@ -66,3 +94,30 @@ int UtcDaliCoreTopMargin(void)
 
   END_TEST;
 }
+
+int UtcDaliCoreProcessEvents(void)
+{
+  TestApplication application;
+  tet_infoline("Testing Dali::Integration::Core::ProcessEvents");
+
+  Vector3 size( 100.0f, 100.0f, 0.0f );
+  Vector3 position( 100.0f, 100.0f, 0.0f );
+
+  Actor actor = Actor::New();
+  actor.SetResizePolicy( ResizePolicy::FIXED, Dimension::ALL_DIMENSIONS );
+  actor.SetSize( size );
+  actor.SetPosition( position );
+  Stage::GetCurrent().Add( actor );
+
+  RelayoutSignalHandler relayoutSignal( application );
+  actor.OnRelayoutSignal().Connect( &relayoutSignal, &RelayoutSignalHandler::RelayoutCallback );
+
+  application.SendNotification();
+
+  DALI_TEST_EQUALS( relayoutSignal.mSignalCalled, true, TEST_LOCATION );
+
+  DALI_TEST_EQUALS( actor.GetProperty( Actor::Property::SIZE ).Get< Vector3 >(), size, TEST_LOCATION );
+  DALI_TEST_EQUALS( actor.GetProperty( Actor::Property::POSITION ).Get< Vector3 >(), position, TEST_LOCATION );
+
+  END_TEST;
+}
index f3b04ad..6f845d4 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2017 Samsung Electronics Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -29,12 +29,12 @@ TestRenderController::~TestRenderController()
 {
 }
 
-void TestRenderController::RequestUpdate()
+void TestRenderController::RequestUpdate( bool forceUpdate )
 {
   mRequestUpdateCalled = true;
 }
 
-void TestRenderController::RequestProcessEventsOnIdle()
+void TestRenderController::RequestProcessEventsOnIdle( bool forceProcess )
 {
   mRequestProcessEventsOnIdleCalled = true;
 }
index b00fbf0..3ad63d3 100644 (file)
@@ -2,7 +2,7 @@
 #define __TEST_RENDER_CONTROLLER_H__
 
 /*
- * Copyright (c) 2014 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2017 Samsung Electronics Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -31,8 +31,8 @@ public:
   TestRenderController();
   ~TestRenderController();
 
-  virtual void RequestUpdate();
-  virtual void RequestProcessEventsOnIdle();
+  virtual void RequestUpdate( bool forceUpdate );
+  virtual void RequestProcessEventsOnIdle( bool forceProcess );
 
   typedef enum
   {
index ca76112..0c6ef9b 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2017 Samsung Electronics Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -79,16 +79,6 @@ void Core::SetDpi(unsigned int dpiHorizontal, unsigned int dpiVertical)
   mImpl->SetDpi(dpiHorizontal, dpiVertical);
 }
 
-void Core::Suspend()
-{
-  mImpl->Suspend();
-}
-
-void Core::Resume()
-{
-  mImpl->Resume();
-}
-
 void Core::SceneCreated()
 {
   mImpl->SceneCreated();
index fed5246..2e41509 100644 (file)
@@ -186,12 +186,6 @@ private:
  *
  * 7) Provide an implementation of the GestureManager interface, used to register gestures provided by the platform.
  *
- * Suspend/Resume behaviour:
- *
- * The Core has no knowledge of the application lifecycle, but can be suspended.
- * In the suspended state, input events will not be processed, and animations will not progress any further.
- * The Core can still render in the suspended state; the same frame will be produced each time.
- *
  * Multi-threading notes:
  *
  * The Dali API methods are not reentrant.  If you access the API from multiple threads simultaneously, then the results
@@ -304,25 +298,6 @@ public:
   // Core Lifecycle
 
   /**
-   * Put Core into the suspended state.
-   * Any ongoing event processing will be cancelled, for example multi-touch sequences.
-   * The core expects the system has suspended us. Animation time will continue during the suspended
-   * state.
-   * Multi-threading note: this method should be called from the main thread
-   * @post The Core is in the suspended state.
-   */
-  void Suspend();
-
-  /**
-   * Resume the Core from the suspended state.
-   * At the first update, the elapsed time passed to the animations will be equal to the time spent
-   * suspended.
-   * Multi-threading note: this method should be called from the main thread
-   * @post The Core is not in the suspended state.
-   */
-  void Resume();
-
-  /**
    * Notify Core that the scene has been created.
    */
   void SceneCreated();
index 253c67e..3bdb112 100644 (file)
@@ -2,7 +2,7 @@
 #define __DALI_INTEGRATION_RENDER_CONTROLLER_H__
 
 /*
- * Copyright (c) 2014 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2017 Samsung Electronics Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -43,14 +43,16 @@ public:
    * Requests a future call to Dali::Integration::Core::Update().
    * This is called when Dali has new content, typically in response to Actors/Animations being added.
    * Multi-threading note: this method will be called from the main thread only.
+   * @param[in] forceUpdate true to update forcely.
    */
-  virtual void RequestUpdate() = 0;
+  virtual void RequestUpdate( bool forceUpdate ) = 0;
 
   /**
    * Requests a future call to Dali::Integration::Core::ProcessEvents(), when the application is idle.
    * Multi-threading note: this method will be called from the main thread only.
+   * @param[in] forceProcess true to process events forcely.
    */
-  virtual void RequestProcessEventsOnIdle() = 0;
+  virtual void RequestProcessEventsOnIdle( bool forceProcess ) = 0;
 
 };
 
index d176f70..aa6eb19 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2016 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2017 Samsung Electronics Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -83,7 +83,6 @@ Core::Core( RenderController& renderController, PlatformAbstraction& platform,
             GestureManager& gestureManager, ResourcePolicy::DataRetention dataRetentionPolicy)
 : mRenderController( renderController ),
   mPlatform(platform),
-  mIsActive(true),
   mProcessingEvent(false)
 {
   // Create the thread local storage
@@ -117,7 +116,7 @@ Core::Core( RenderController& renderController, PlatformAbstraction& platform,
 
   mRenderManager->SetShaderSaver( *mUpdateManager );
 
-  mStage = IntrusivePtr<Stage>( Stage::New( *mAnimationPlaylist, *mPropertyNotificationManager, *mUpdateManager, *mNotificationManager ) );
+  mStage = IntrusivePtr<Stage>( Stage::New( *mAnimationPlaylist, *mPropertyNotificationManager, *mUpdateManager, *mNotificationManager, mRenderController ) );
 
   // This must be called after stage is created but before stage initialization
   mRelayoutController = IntrusivePtr< RelayoutController >( new RelayoutController( mRenderController ) );
@@ -229,19 +228,6 @@ void Core::Render( RenderStatus& status )
   mRenderManager->Render( status );
 }
 
-void Core::Suspend()
-{
-  mIsActive = false;
-}
-
-void Core::Resume()
-{
-  mIsActive = true;
-
-  // trigger processing of events queued up while paused
-  ProcessEvents();
-}
-
 void Core::SceneCreated()
 {
   mStage->EmitSceneCreatedSignal();
@@ -260,7 +246,7 @@ void Core::ProcessEvents()
   if( mProcessingEvent )
   {
     DALI_LOG_ERROR( "ProcessEvents should not be called from within ProcessEvents!\n" );
-    mRenderController.RequestProcessEventsOnIdle();
+    mRenderController.RequestProcessEventsOnIdle( false );
     return;
   }
 
@@ -274,29 +260,27 @@ void Core::ProcessEvents()
 
   mNotificationManager->ProcessMessages();
 
-  // Avoid allocating MessageBuffers, triggering size-negotiation or sending any other spam whilst paused
-  if( mIsActive )
-  {
-    // Emit signal here to inform listeners that event processing has finished.
-    mStage->EmitEventProcessingFinishedSignal();
+  // Emit signal here to inform listeners that event processing has finished.
+  mStage->EmitEventProcessingFinishedSignal();
 
-    // Run the size negotiation after event processing finished signal
-    mRelayoutController->Relayout();
+  // Run the size negotiation after event processing finished signal
+  mRelayoutController->Relayout();
 
-    // Rebuild depth tree after event processing has finished
-    mStage->RebuildDepthTree();
+  // Rebuild depth tree after event processing has finished
+  mStage->RebuildDepthTree();
 
-    // Flush any queued messages for the update-thread
-    const bool messagesToProcess = mUpdateManager->FlushQueue();
+  // Flush any queued messages for the update-thread
+  const bool messagesToProcess = mUpdateManager->FlushQueue();
 
-    // Check if the touch or gestures require updates.
-    const bool gestureNeedsUpdate = mGestureEventProcessor->NeedsUpdate();
+  // Check if the touch or gestures require updates.
+  const bool gestureNeedsUpdate = mGestureEventProcessor->NeedsUpdate();
+  // Check if the next update is forced.
+  const bool forceUpdate = mStage->IsNextUpdateForced();
 
-    if( messagesToProcess || gestureNeedsUpdate )
-    {
-      // tell the render controller to keep update thread running
-      mRenderController.RequestUpdate();
-    }
+  if( messagesToProcess || gestureNeedsUpdate || forceUpdate )
+  {
+    // tell the render controller to keep update thread running
+    mRenderController.RequestUpdate( forceUpdate );
   }
 
   mRelayoutController->SetProcessingCoreEvents( false );
index 17bc172..49d7b33 100644 (file)
@@ -2,7 +2,7 @@
 #define DALI_INTERNAL_CORE_H
 
 /*
- * Copyright (c) 2016 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2017 Samsung Electronics Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -137,16 +137,6 @@ public:
   void Render( Integration::RenderStatus& status );
 
   /**
-   * @copydoc Dali::Integration::Core::Suspend()
-   */
-  void Suspend();
-
-  /**
-   * @copydoc Dali::Integration::Core::Resume()
-   */
-  void Resume();
-
-  /**
    * @copydoc Dali::Integration::Core::SceneCreated()
    */
   void SceneCreated();
@@ -265,7 +255,6 @@ private:
   AnimationPlaylistOwner                    mAnimationPlaylist;           ///< For 'Fire and forget' animation support
   OwnerPointer<PropertyNotificationManager> mPropertyNotificationManager; ///< For safe signal emmision of property changed notifications
   IntrusivePtr< RelayoutController >        mRelayoutController;          ///< Size negotiation relayout controller
-  bool                                      mIsActive         : 1;        ///< Whether Core is active or suspended
   bool                                      mProcessingEvent  : 1;        ///< True during ProcessEvents()
 
   OwnerPointer<SceneGraph::RenderTaskProcessor> mRenderTaskProcessor;         ///< Handles the processing of render tasks
index eb2d345..c21c835 100644 (file)
@@ -2,7 +2,7 @@
 #define __DALI_INTERNAL_EVENT_THREAD_SERVICES_H__
 
 /*
- * Copyright (c) 2014 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2017 Samsung Electronics Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -29,6 +29,11 @@ namespace Dali
 
 class BaseObject;
 
+namespace Integration
+{
+class RenderController;
+}
+
 namespace Internal
 {
 
@@ -74,6 +79,13 @@ public:
   virtual SceneGraph::UpdateManager& GetUpdateManager() = 0;
 
   /**
+   * @brief Get a reference to the RenderController
+   *
+   * @return the render controller
+   */
+  virtual Integration::RenderController& GetRenderController() = 0;
+
+  /**
    * Reserve space for another message in the queue; this must then be initialized by the caller.
    * The message will be read from the update-thread after the next FlushMessages is called.
    * @post Calling this method may invalidate any previously returned slots.
@@ -89,6 +101,18 @@ public:
   virtual BufferIndex GetEventBufferIndex() const  = 0;
 
   /**
+   * @brief Indicate that the next rendering is really required.
+   */
+  virtual void ForceNextUpdate() = 0;
+
+  /**
+   * @brief Check if the next rendering is really required.
+   *
+   * @return true if the next rendering is really required.
+   */
+  virtual bool IsNextUpdateForced() = 0;
+
+  /**
    * @return true if core is still running and we can send messages
    */
   static bool IsCoreRunning();
index 1cd7cf3..3fbdade 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2016 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2017 Samsung Electronics Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -89,9 +89,10 @@ SignalConnectorType signalConnector9( mType, SIGNAL_TOUCH,                     &
 StagePtr Stage::New( AnimationPlaylist& playlist,
                      PropertyNotificationManager& propertyNotificationManager,
                      SceneGraph::UpdateManager& updateManager,
-                     NotificationManager& notificationManager )
+                     NotificationManager& notificationManager,
+                     Integration::RenderController& renderController )
 {
-  return StagePtr( new Stage( playlist, propertyNotificationManager, updateManager, notificationManager ) );
+  return StagePtr( new Stage( playlist, propertyNotificationManager, updateManager, notificationManager, renderController ) );
 }
 
 void Stage::Initialize()
@@ -695,18 +696,21 @@ void Stage::RebuildDepthTree()
 Stage::Stage( AnimationPlaylist& playlist,
               PropertyNotificationManager& propertyNotificationManager,
               SceneGraph::UpdateManager& updateManager,
-              NotificationManager& notificationManager )
+              NotificationManager& notificationManager,
+              Integration::RenderController& renderController )
 : mAnimationPlaylist( playlist ),
-  mPropertyNotificationManager(propertyNotificationManager),
-  mUpdateManager(updateManager),
-  mNotificationManager(notificationManager),
-  mSize(Vector2::ZERO),
-  mBackgroundColor(Dali::Stage::DEFAULT_BACKGROUND_COLOR),
+  mPropertyNotificationManager( propertyNotificationManager ),
+  mUpdateManager( updateManager ),
+  mNotificationManager( notificationManager ),
+  mRenderController( renderController ),
+  mSize( Vector2::ZERO ),
+  mBackgroundColor( Dali::Stage::DEFAULT_BACKGROUND_COLOR ),
   mViewMode( MONO ),
   mStereoBase( DEFAULT_STEREO_BASE ),
   mTopMargin( 0 ),
-  mSystemOverlay(NULL),
-  mDepthTreeDirty( false )
+  mSystemOverlay( NULL ),
+  mDepthTreeDirty( false ),
+  mForceNextUpdate( false )
 {
 }
 
@@ -715,6 +719,11 @@ SceneGraph::UpdateManager& Stage::GetUpdateManager()
   return mUpdateManager;
 }
 
+Integration::RenderController& Stage::GetRenderController()
+{
+  return mRenderController;
+}
+
 unsigned int* Stage::ReserveMessageSlot( std::size_t size, bool updateScene )
 {
   return mUpdateManager.ReserveMessageSlot( size, updateScene );
@@ -725,6 +734,18 @@ BufferIndex Stage::GetEventBufferIndex() const
   return mUpdateManager.GetEventBufferIndex();
 }
 
+void Stage::ForceNextUpdate()
+{
+  mForceNextUpdate = true;
+}
+
+bool Stage::IsNextUpdateForced()
+{
+  bool nextUpdateForced = mForceNextUpdate;
+  mForceNextUpdate = false;
+  return nextUpdateForced;
+}
+
 Stage::~Stage()
 {
   delete mSystemOverlay;
index 52d68ee..7ff94ba 100644 (file)
@@ -2,7 +2,7 @@
 #define __DALI_INTERNAL_STAGE_H__
 
 /*
- * Copyright (c) 2014 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2017 Samsung Electronics Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -45,6 +45,7 @@ struct Vector2;
 namespace Integration
 {
 class SystemOverlay;
+class RenderController;
 }
 
 namespace Internal
@@ -76,11 +77,13 @@ public:
    * @param[in] propertyNotificationManager
    * @param[in] updateManager
    * @param[in] notificationManager
+   * @param[in] renderController
    */
   static StagePtr New( AnimationPlaylist& playlist,
                        PropertyNotificationManager& propertyNotificationManager,
                        SceneGraph::UpdateManager& updateManager,
-                       NotificationManager& notificationManager );
+                       NotificationManager& notificationManager,
+                       Integration::RenderController& renderController );
 
   /**
    * Initialize the stage.
@@ -425,6 +428,11 @@ public: // Implementation of EventThreadServices
   virtual SceneGraph::UpdateManager& GetUpdateManager();
 
   /**
+   * @copydoc EventThreadServices::GetRenderController
+   */
+  virtual Integration::RenderController& GetRenderController();
+
+  /**
    * @copydoc EventThreadServices::ReserveMessageSlot
    */
   virtual unsigned int* ReserveMessageSlot( std::size_t size, bool updateScene );
@@ -435,6 +443,16 @@ public: // Implementation of EventThreadServices
   virtual BufferIndex GetEventBufferIndex() const;
 
   /**
+   * @copydoc EventThreadServices::ForceNextUpdate
+   */
+  virtual void ForceNextUpdate();
+
+  /**
+   * @copydoc EventThreadServices::IsNextUpdateForced
+   */
+  virtual bool IsNextUpdateForced();
+
+  /**
    * Request that the depth tree is rebuilt
    */
   void RequestRebuildDepthTree();
@@ -453,7 +471,8 @@ private:
   Stage( AnimationPlaylist& playlist,
          PropertyNotificationManager& propertyNotificationManager,
          SceneGraph::UpdateManager& updateManager,
-         NotificationManager& notificationManager );
+         NotificationManager& notificationManager,
+         Integration::RenderController& renderController );
 
   /**
    * A reference counted object may only be deleted by calling Unreference()
@@ -471,6 +490,8 @@ private:
 
   NotificationManager& mNotificationManager;
 
+  Integration::RenderController& mRenderController;
+
   // The stage-size may be less than surface-size (reduced by top-margin)
   Vector2 mSize;
   Vector2 mSurfaceSize;
@@ -504,6 +525,9 @@ private:
 
   Integration::SystemOverlay* mSystemOverlay; ///< SystemOverlay stage access
 
+  bool mDepthTreeDirty; ///< True if the depth tree needs recalculating
+  bool mForceNextUpdate; ///< True if the next rendering is really required.
+
   // The key event signal
   Dali::Stage::KeyEventSignalType                 mKeyEventSignal;
   Dali::DevelStage::KeyEventGeneratedSignalType   mKeyEventGeneratedSignal;
@@ -514,7 +538,6 @@ private:
   // The touched signals
   Dali::Stage::TouchedSignalType                  mTouchedSignal;
   Dali::Stage::TouchSignalType                    mTouchSignal;
-  bool mDepthTreeDirty; ///< True if the depth tree needs recalculating
 
   // The wheel event signal
   Dali::Stage::WheelEventSignalType               mWheelEventSignal;
index a6ad63a..6a5b938 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2017 Samsung Electronics Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -194,7 +194,7 @@ void GestureEventProcessor::SetGestureProperties( const Gesture& gesture )
     SetUpdateRequired();
 
     // We may not be updating so we need to ask the render controller for an update.
-    mRenderController.RequestUpdate();
+    mRenderController.RequestUpdate( false );
   }
 
   switch ( gesture.type )
index 5044890..3c3bbbd 100644 (file)
@@ -21,6 +21,7 @@
 // INTERNAL INCLUDES
 #include <dali/internal/update/manager/update-manager.h>
 #include <dali/internal/event/common/stage-impl.h>
+#include <dali/integration-api/render-controller.h>
 
 namespace Dali
 {
@@ -151,6 +152,11 @@ bool Texture::Upload( PixelDataPtr pixelData,
                                     static_cast< uint16_t >( width ),
                                     static_cast< uint16_t >( height ) };
             UploadTextureMessage( mEventThreadServices.GetUpdateManager(), *mRenderObject, pixelData, params );
+
+            // Request event processing and update forcely
+            mEventThreadServices.GetRenderController().RequestProcessEventsOnIdle( true );
+            mEventThreadServices.ForceNextUpdate();
+
             result = true;
           }
         }
index 0b3ec2c..4e468f4 100644 (file)
@@ -199,7 +199,7 @@ void RelayoutController::RequestRelayout( Dali::Actor& actor, Dimension::Type di
 
   if ( !mProcessingCoreEvents )
   {
-    mRenderController.RequestProcessEventsOnIdle();
+    mRenderController.RequestProcessEventsOnIdle( false );
   }
 }
 
index 29b32ba..330234d 100644 (file)
@@ -193,7 +193,7 @@ unsigned int* MessageQueue::ReserveMessageSlot( unsigned int requestedSize, bool
   // If we are outside, then we have to request a call to Core::ProcessEvents() on idle.
   if ( false == mImpl->processingEvents )
   {
-    mImpl->renderController.RequestProcessEventsOnIdle();
+    mImpl->renderController.RequestProcessEventsOnIdle( false );
   }
 
   return mImpl->currentMessageBuffer->ReserveMessageSlot( requestedSize );