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>
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.
*
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" );
*/
virtual void RemoveIdle( CallbackBase* callback );
*/
virtual void RemoveIdle( CallbackBase* callback );
+ /**
+ * Sets a pre-render callback.
+ */
+ void SetPreRenderCallback( CallbackBase* callback );
+
- * 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.
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 );
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 ),
+ delete mPreRenderCallback;
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
///////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////
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;
#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.
*/
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.
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.
#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.
+#include <dali/public-api/signals/callback.h>
+
*/
virtual void SetRenderRefreshRate( unsigned int numberOfVSyncsPerRender ) = 0;
*/
virtual void SetRenderRefreshRate( unsigned int numberOfVSyncsPerRender ) = 0;
+ /**
+ * @copydoc Dali::Adaptor::SetPreRenderCallback()
+ */
+ virtual void SetPreRenderCallback( CallbackBase* callback ) = 0;
+
- * 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.
mThreadControllerInterface->SetRenderRefreshRate( numberOfVSyncsPerRender );
}
mThreadControllerInterface->SetRenderRefreshRate( numberOfVSyncsPerRender );
}
+void ThreadController::SetPreRenderCallback( CallbackBase* callback )
+{
+ mThreadControllerInterface->SetPreRenderCallback( callback );
+}
+
} // namespace Adaptor
} // namespace Internal
} // namespace Adaptor
} // namespace Internal
#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.
* limitations under the License.
*
*/
* limitations under the License.
*
*/
+#include <dali/public-api/signals/callback.h>
*/
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.