From: David Steele Date: Tue, 4 Sep 2018 16:32:05 +0000 (+0100) Subject: Added pre-render callback to Adaptor X-Git-Tag: dali_1.3.41~5 X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-adaptor.git;a=commitdiff_plain;h=37d8d7dca35290d61aeb300f8f97bb993998d4e4 Added pre-render callback to Adaptor 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 --- diff --git a/dali/integration-api/adaptor.h b/dali/integration-api/adaptor.h index 6ce71a3..0925028 100755 --- a/dali/integration-api/adaptor.h +++ b/dali/integration-api/adaptor.h @@ -257,6 +257,23 @@ public: 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. * diff --git a/dali/internal/adaptor/common/adaptor-impl.cpp b/dali/internal/adaptor/common/adaptor-impl.cpp index b660e43..e2df71d 100755 --- a/dali/internal/adaptor/common/adaptor-impl.cpp +++ b/dali/internal/adaptor/common/adaptor-impl.cpp @@ -502,6 +502,11 @@ void Adaptor::RemoveIdle( CallbackBase* callback ) mCallbackManager->RemoveIdleCallback( callback ); } +void Adaptor::SetPreRenderCallback( CallbackBase* callback ) +{ + mThreadController->SetPreRenderCallback( callback ); +} + Dali::Adaptor& Adaptor::Get() { DALI_ASSERT_ALWAYS( IsAvailable() && "Adaptor not instantiated" ); diff --git a/dali/internal/adaptor/common/adaptor-impl.h b/dali/internal/adaptor/common/adaptor-impl.h index 3359746..1e4defe 100755 --- a/dali/internal/adaptor/common/adaptor-impl.h +++ b/dali/internal/adaptor/common/adaptor-impl.h @@ -216,6 +216,11 @@ public: // AdaptorInternalServices implementation */ virtual void RemoveIdle( CallbackBase* callback ); + /** + * Sets a pre-render callback. + */ + void SetPreRenderCallback( CallbackBase* callback ); + public: /** diff --git a/dali/internal/adaptor/common/adaptor.cpp b/dali/internal/adaptor/common/adaptor.cpp index b0c6047..6b40012 100755 --- a/dali/internal/adaptor/common/adaptor.cpp +++ b/dali/internal/adaptor/common/adaptor.cpp @@ -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. @@ -123,6 +123,11 @@ void Adaptor::SetRenderRefreshRate( unsigned int numberOfVSyncsPerRender ) mImpl->SetRenderRefreshRate( numberOfVSyncsPerRender ); } +void Adaptor::SetPreRenderCallback( CallbackBase* callback ) +{ + mImpl->SetPreRenderCallback( callback ); +} + void Adaptor::SetUseHardwareVSync(bool useHardware) { mImpl->SetUseHardwareVSync( useHardware ); diff --git a/dali/internal/adaptor/common/combined-update-render-controller.cpp b/dali/internal/adaptor/common/combined-update-render-controller.cpp index 72aa9da..60ce74c 100644 --- a/dali/internal/adaptor/common/combined-update-render-controller.cpp +++ b/dali/internal/adaptor/common/combined-update-render-controller.cpp @@ -96,6 +96,7 @@ CombinedUpdateRenderController::CombinedUpdateRenderController( AdaptorInternalS mEnvironmentOptions( environmentOptions ), mNotificationTrigger( adaptorInterfaces.GetProcessCoreEventsTrigger() ), mSleepTrigger( NULL ), + mPreRenderCallback( NULL ), mUpdateRenderThread( NULL ), mDefaultFrameDelta( 0.0f ), mDefaultFrameDurationMilliseconds( 0u ), @@ -137,6 +138,7 @@ CombinedUpdateRenderController::~CombinedUpdateRenderController() Stop(); + delete mPreRenderCallback; delete mSleepTrigger; } @@ -314,6 +316,19 @@ void CombinedUpdateRenderController::SetRenderRefreshRate( unsigned int numberOf 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 /////////////////////////////////////////////////////////////////////////////////////////////////// @@ -502,6 +517,15 @@ void CombinedUpdateRenderController::UpdateRenderThread() ////////////////////////////// mRenderHelper.ConsumeEvents(); + if( mPreRenderCallback != NULL ) + { + bool keepCallback = CallbackBase::ExecuteReturn(*mPreRenderCallback); + if( ! keepCallback ) + { + delete mPreRenderCallback; + mPreRenderCallback = NULL; + } + } mRenderHelper.PreRender(); Integration::RenderStatus renderStatus; diff --git a/dali/internal/adaptor/common/combined-update-render-controller.h b/dali/internal/adaptor/common/combined-update-render-controller.h index 2e2dcad..7760c7e 100644 --- a/dali/internal/adaptor/common/combined-update-render-controller.h +++ b/dali/internal/adaptor/common/combined-update-render-controller.h @@ -2,7 +2,7 @@ #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. @@ -135,6 +135,11 @@ public: */ virtual void SetRenderRefreshRate( unsigned int numberOfFramesPerRender ); + /** + * @copydoc ThreadControllerInterface::SetPreRenderCallback + */ + void SetPreRenderCallback( CallbackBase* callback ) override; + 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 + CallbackBase* mPreRenderCallback; ///< Used by Update/Render thread when PreRender is about to be called on graphics. pthread_t* mUpdateRenderThread; ///< The Update/Render thread. diff --git a/dali/internal/adaptor/common/thread-controller-interface.h b/dali/internal/adaptor/common/thread-controller-interface.h index 2c8e8eb..8f4aabc 100644 --- a/dali/internal/adaptor/common/thread-controller-interface.h +++ b/dali/internal/adaptor/common/thread-controller-interface.h @@ -2,7 +2,7 @@ #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. @@ -18,6 +18,8 @@ * */ +#include + namespace Dali { @@ -93,6 +95,11 @@ public: */ virtual void SetRenderRefreshRate( unsigned int numberOfVSyncsPerRender ) = 0; + /** + * @copydoc Dali::Adaptor::SetPreRenderCallback() + */ + virtual void SetPreRenderCallback( CallbackBase* callback ) = 0; + protected: /** diff --git a/dali/internal/system/common/thread-controller.cpp b/dali/internal/system/common/thread-controller.cpp index 179d1c2..3cffd54 100644 --- a/dali/internal/system/common/thread-controller.cpp +++ b/dali/internal/system/common/thread-controller.cpp @@ -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. @@ -100,6 +100,11 @@ void ThreadController::SetRenderRefreshRate(unsigned int numberOfVSyncsPerRender mThreadControllerInterface->SetRenderRefreshRate( numberOfVSyncsPerRender ); } +void ThreadController::SetPreRenderCallback( CallbackBase* callback ) +{ + mThreadControllerInterface->SetPreRenderCallback( callback ); +} + } // namespace Adaptor } // namespace Internal diff --git a/dali/internal/system/common/thread-controller.h b/dali/internal/system/common/thread-controller.h index 6feddc1..9429525 100644 --- a/dali/internal/system/common/thread-controller.h +++ b/dali/internal/system/common/thread-controller.h @@ -2,7 +2,7 @@ #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. @@ -17,6 +17,7 @@ * limitations under the License. * */ +#include namespace Dali { @@ -113,6 +114,11 @@ public: */ void SetRenderRefreshRate( unsigned int numberOfVSyncsPerRender ); + /** + * @copydoc Dali::Adaptor::SetPreRenderCallback + */ + void SetPreRenderCallback( CallbackBase* callback ); + private: // Undefined copy constructor.