Added pre-render callback to Adaptor 04/188404/5
authorDavid Steele <david.steele@samsung.com>
Tue, 4 Sep 2018 16:32:05 +0000 (17:32 +0100)
committerDavid Steele <david.steele@samsung.com>
Fri, 7 Sep 2018 13:20:59 +0000 (14:20 +0100)
New API to add a pre-render hook - this callback gets called from
the Update/Render thread before rendering starts. If the callback
returns false, then it removes the callback, otherwise the callback
will be called every frame.

No DALi Event API can be called from this callback, doing so will
result in instability and crashes.

To use the callback, your application needs to call the following code:

  Dali::Adaptor::Get().SetPreRenderCallback( Dali::MakeCallback( this, &SomeClass::OnPreRender ) );

or some other variant of MakeCallback.

Change-Id: I014842f0adcb004b94435353fba869d886471b93
Signed-off-by: David Steele <david.steele@samsung.com>
dali/integration-api/adaptor.h
dali/internal/adaptor/common/adaptor-impl.cpp
dali/internal/adaptor/common/adaptor-impl.h
dali/internal/adaptor/common/adaptor.cpp
dali/internal/adaptor/common/combined-update-render-controller.cpp
dali/internal/adaptor/common/combined-update-render-controller.h
dali/internal/adaptor/common/thread-controller-interface.h
dali/internal/system/common/thread-controller.cpp
dali/internal/system/common/thread-controller.h

index 6ce71a3..0925028 100755 (executable)
@@ -257,6 +257,23 @@ public:
   void SetRenderRefreshRate( unsigned int numberOfVSyncsPerRender );
 
   /**
   void SetRenderRefreshRate( unsigned int numberOfVSyncsPerRender );
 
   /**
+   * @brief The callback is called from the Update/Render thread prior to rendering.
+   *
+   * @param[in] callback The function to call
+   *
+   * @note The function is called from the Update thread, so should do as little processing as possible.
+   * It is not possible to call any DALi event side APIs from within the callback; doing so will cause
+   * instability. Only 1 callback is supported. Setting the callback to NULL will remove the current callback.
+   *
+   * A callback of the following type should be used:
+   * @code
+   *   bool MyFunction();
+   * @endcode
+   * This callback will be called repeatedly as long as it returns true. A return of 0 deletes this callback.
+   */
+  void SetPreRenderCallback( CallbackBase* callback );
+
+  /**
    * @brief Set whether the frame count per render is managed using the hardware VSync or
    * manually timed.
    *
    * @brief Set whether the frame count per render is managed using the hardware VSync or
    * manually timed.
    *
index b660e43..e2df71d 100755 (executable)
@@ -502,6 +502,11 @@ void Adaptor::RemoveIdle( CallbackBase* callback )
   mCallbackManager->RemoveIdleCallback( callback );
 }
 
   mCallbackManager->RemoveIdleCallback( callback );
 }
 
+void Adaptor::SetPreRenderCallback( CallbackBase* callback )
+{
+  mThreadController->SetPreRenderCallback( callback );
+}
+
 Dali::Adaptor& Adaptor::Get()
 {
   DALI_ASSERT_ALWAYS( IsAvailable() && "Adaptor not instantiated" );
 Dali::Adaptor& Adaptor::Get()
 {
   DALI_ASSERT_ALWAYS( IsAvailable() && "Adaptor not instantiated" );
index 3359746..1e4defe 100755 (executable)
@@ -216,6 +216,11 @@ public: // AdaptorInternalServices implementation
    */
   virtual void RemoveIdle( CallbackBase* callback );
 
    */
   virtual void RemoveIdle( CallbackBase* callback );
 
+  /**
+   * Sets a pre-render callback.
+   */
+  void SetPreRenderCallback( CallbackBase* callback );
+
 public:
 
   /**
 public:
 
   /**
index b0c6047..6b40012 100755 (executable)
@@ -1,5 +1,5 @@
 /*
 /*
- * Copyright (c) 2017 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2018 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.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -123,6 +123,11 @@ void Adaptor::SetRenderRefreshRate( unsigned int numberOfVSyncsPerRender )
   mImpl->SetRenderRefreshRate( numberOfVSyncsPerRender );
 }
 
   mImpl->SetRenderRefreshRate( numberOfVSyncsPerRender );
 }
 
+void Adaptor::SetPreRenderCallback( CallbackBase* callback )
+{
+  mImpl->SetPreRenderCallback( callback );
+}
+
 void Adaptor::SetUseHardwareVSync(bool useHardware)
 {
   mImpl->SetUseHardwareVSync( useHardware );
 void Adaptor::SetUseHardwareVSync(bool useHardware)
 {
   mImpl->SetUseHardwareVSync( useHardware );
index 72aa9da..60ce74c 100644 (file)
@@ -96,6 +96,7 @@ CombinedUpdateRenderController::CombinedUpdateRenderController( AdaptorInternalS
   mEnvironmentOptions( environmentOptions ),
   mNotificationTrigger( adaptorInterfaces.GetProcessCoreEventsTrigger() ),
   mSleepTrigger( NULL ),
   mEnvironmentOptions( environmentOptions ),
   mNotificationTrigger( adaptorInterfaces.GetProcessCoreEventsTrigger() ),
   mSleepTrigger( NULL ),
+  mPreRenderCallback( NULL ),
   mUpdateRenderThread( NULL ),
   mDefaultFrameDelta( 0.0f ),
   mDefaultFrameDurationMilliseconds( 0u ),
   mUpdateRenderThread( NULL ),
   mDefaultFrameDelta( 0.0f ),
   mDefaultFrameDurationMilliseconds( 0u ),
@@ -137,6 +138,7 @@ CombinedUpdateRenderController::~CombinedUpdateRenderController()
 
   Stop();
 
 
   Stop();
 
+  delete mPreRenderCallback;
   delete mSleepTrigger;
 }
 
   delete mSleepTrigger;
 }
 
@@ -314,6 +316,19 @@ void CombinedUpdateRenderController::SetRenderRefreshRate( unsigned int numberOf
   LOG_EVENT( "mDefaultFrameDelta(%.6f), mDefaultFrameDurationMilliseconds(%lld), mDefaultFrameDurationNanoseconds(%lld)", mDefaultFrameDelta, mDefaultFrameDurationMilliseconds, mDefaultFrameDurationNanoseconds );
 }
 
   LOG_EVENT( "mDefaultFrameDelta(%.6f), mDefaultFrameDurationMilliseconds(%lld), mDefaultFrameDurationNanoseconds(%lld)", mDefaultFrameDelta, mDefaultFrameDurationMilliseconds, mDefaultFrameDurationNanoseconds );
 }
 
+void CombinedUpdateRenderController::SetPreRenderCallback( CallbackBase* callback )
+{
+  LOG_EVENT_TRACE;
+  LOG_EVENT( "Set PreRender Callback" );
+
+  ConditionalWait::ScopedLock updateLock( mUpdateRenderThreadWaitCondition );
+  if( mPreRenderCallback )
+  {
+    delete mPreRenderCallback;
+  }
+  mPreRenderCallback = callback;
+}
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 // EVENT THREAD
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 // EVENT THREAD
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -502,6 +517,15 @@ void CombinedUpdateRenderController::UpdateRenderThread()
     //////////////////////////////
 
     mRenderHelper.ConsumeEvents();
     //////////////////////////////
 
     mRenderHelper.ConsumeEvents();
+    if( mPreRenderCallback != NULL )
+    {
+      bool keepCallback = CallbackBase::ExecuteReturn<bool>(*mPreRenderCallback);
+      if( ! keepCallback )
+      {
+        delete mPreRenderCallback;
+        mPreRenderCallback = NULL;
+      }
+    }
     mRenderHelper.PreRender();
 
     Integration::RenderStatus renderStatus;
     mRenderHelper.PreRender();
 
     Integration::RenderStatus renderStatus;
index 2e2dcad..7760c7e 100644 (file)
@@ -2,7 +2,7 @@
 #define __DALI_INTERNAL_COMBINED_UPDATE_RENDER_CONTROLLER_H__
 
 /*
 #define __DALI_INTERNAL_COMBINED_UPDATE_RENDER_CONTROLLER_H__
 
 /*
- * Copyright (c) 2017 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2018 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.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -135,6 +135,11 @@ public:
    */
   virtual void SetRenderRefreshRate( unsigned int numberOfFramesPerRender );
 
    */
   virtual void SetRenderRefreshRate( unsigned int numberOfFramesPerRender );
 
+  /**
+   * @copydoc ThreadControllerInterface::SetPreRenderCallback
+   */
+  void SetPreRenderCallback( CallbackBase* callback ) override;
+
 private:
 
   // Undefined copy constructor.
 private:
 
   // Undefined copy constructor.
@@ -306,6 +311,7 @@ private:
   const EnvironmentOptions&         mEnvironmentOptions;               ///< Environment options
   TriggerEventInterface&            mNotificationTrigger;              ///< Reference to notification event trigger
   TriggerEventInterface*            mSleepTrigger;                     ///< Used by the update-render thread to trigger the event thread when it no longer needs to do any updates
   const EnvironmentOptions&         mEnvironmentOptions;               ///< Environment options
   TriggerEventInterface&            mNotificationTrigger;              ///< Reference to notification event trigger
   TriggerEventInterface*            mSleepTrigger;                     ///< Used by the update-render thread to trigger the event thread when it no longer needs to do any updates
+  CallbackBase*                     mPreRenderCallback;                ///< Used by Update/Render thread when PreRender is about to be called on graphics.
 
   pthread_t*                        mUpdateRenderThread;               ///< The Update/Render thread.
 
 
   pthread_t*                        mUpdateRenderThread;               ///< The Update/Render thread.
 
index 2c8e8eb..8f4aabc 100644 (file)
@@ -2,7 +2,7 @@
 #define __DALI_INTERNAL_THREAD_CONTROLLER_INTERFACE_H__
 
 /*
 #define __DALI_INTERNAL_THREAD_CONTROLLER_INTERFACE_H__
 
 /*
- * Copyright (c) 2017 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2018 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.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -18,6 +18,8 @@
  *
  */
 
  *
  */
 
+#include <dali/public-api/signals/callback.h>
+
 namespace Dali
 {
 
 namespace Dali
 {
 
@@ -93,6 +95,11 @@ public:
    */
   virtual void SetRenderRefreshRate( unsigned int numberOfVSyncsPerRender ) = 0;
 
    */
   virtual void SetRenderRefreshRate( unsigned int numberOfVSyncsPerRender ) = 0;
 
+  /**
+   * @copydoc Dali::Adaptor::SetPreRenderCallback()
+   */
+  virtual void SetPreRenderCallback( CallbackBase* callback ) = 0;
+
 protected:
 
   /**
 protected:
 
   /**
index 179d1c2..3cffd54 100644 (file)
@@ -1,5 +1,5 @@
 /*
 /*
- * Copyright (c) 2017 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2018 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.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -100,6 +100,11 @@ void ThreadController::SetRenderRefreshRate(unsigned int numberOfVSyncsPerRender
   mThreadControllerInterface->SetRenderRefreshRate( numberOfVSyncsPerRender );
 }
 
   mThreadControllerInterface->SetRenderRefreshRate( numberOfVSyncsPerRender );
 }
 
+void ThreadController::SetPreRenderCallback( CallbackBase* callback )
+{
+  mThreadControllerInterface->SetPreRenderCallback( callback );
+}
+
 } // namespace Adaptor
 
 } // namespace Internal
 } // namespace Adaptor
 
 } // namespace Internal
index 6feddc1..9429525 100644 (file)
@@ -2,7 +2,7 @@
 #define __DALI_INTERNAL_THREAD_CONTROLLER_H__
 
 /*
 #define __DALI_INTERNAL_THREAD_CONTROLLER_H__
 
 /*
- * Copyright (c) 2017 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2018 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.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -17,6 +17,7 @@
  * limitations under the License.
  *
  */
  * limitations under the License.
  *
  */
+#include <dali/public-api/signals/callback.h>
 
 namespace Dali
 {
 
 namespace Dali
 {
@@ -113,6 +114,11 @@ public:
    */
   void SetRenderRefreshRate( unsigned int numberOfVSyncsPerRender );
 
    */
   void SetRenderRefreshRate( unsigned int numberOfVSyncsPerRender );
 
+  /**
+   * @copydoc Dali::Adaptor::SetPreRenderCallback
+   */
+  void SetPreRenderCallback( CallbackBase* callback );
+
 private:
 
   // Undefined copy constructor.
 private:
 
   // Undefined copy constructor.