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.
*
mCallbackManager->RemoveIdleCallback( callback );
}
+void Adaptor::SetPreRenderCallback( CallbackBase* callback )
+{
+ mThreadController->SetPreRenderCallback( callback );
+}
+
Dali::Adaptor& Adaptor::Get()
{
DALI_ASSERT_ALWAYS( IsAvailable() && "Adaptor not instantiated" );
*/
virtual void RemoveIdle( CallbackBase* callback );
+ /**
+ * Sets a pre-render callback.
+ */
+ void SetPreRenderCallback( CallbackBase* callback );
+
public:
/**
/*
- * 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.
mImpl->SetRenderRefreshRate( numberOfVSyncsPerRender );
}
+void Adaptor::SetPreRenderCallback( CallbackBase* callback )
+{
+ mImpl->SetPreRenderCallback( callback );
+}
+
void Adaptor::SetUseHardwareVSync(bool useHardware)
{
mImpl->SetUseHardwareVSync( useHardware );
mEnvironmentOptions( environmentOptions ),
mNotificationTrigger( adaptorInterfaces.GetProcessCoreEventsTrigger() ),
mSleepTrigger( NULL ),
+ mPreRenderCallback( NULL ),
mUpdateRenderThread( NULL ),
mDefaultFrameDelta( 0.0f ),
mDefaultFrameDurationMilliseconds( 0u ),
Stop();
+ delete mPreRenderCallback;
delete mSleepTrigger;
}
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
///////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////
mRenderHelper.ConsumeEvents();
+ if( mPreRenderCallback != NULL )
+ {
+ bool keepCallback = CallbackBase::ExecuteReturn<bool>(*mPreRenderCallback);
+ if( ! keepCallback )
+ {
+ delete mPreRenderCallback;
+ mPreRenderCallback = NULL;
+ }
+ }
mRenderHelper.PreRender();
Integration::RenderStatus renderStatus;
#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.
*/
virtual void SetRenderRefreshRate( unsigned int numberOfFramesPerRender );
+ /**
+ * @copydoc ThreadControllerInterface::SetPreRenderCallback
+ */
+ void SetPreRenderCallback( CallbackBase* callback ) override;
+
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
+ CallbackBase* mPreRenderCallback; ///< Used by Update/Render thread when PreRender is about to be called on graphics.
pthread_t* mUpdateRenderThread; ///< The Update/Render thread.
#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.
*
*/
+#include <dali/public-api/signals/callback.h>
+
namespace Dali
{
*/
virtual void SetRenderRefreshRate( unsigned int numberOfVSyncsPerRender ) = 0;
+ /**
+ * @copydoc Dali::Adaptor::SetPreRenderCallback()
+ */
+ virtual void SetPreRenderCallback( CallbackBase* callback ) = 0;
+
protected:
/**
/*
- * 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.
mThreadControllerInterface->SetRenderRefreshRate( numberOfVSyncsPerRender );
}
+void ThreadController::SetPreRenderCallback( CallbackBase* callback )
+{
+ mThreadControllerInterface->SetPreRenderCallback( callback );
+}
+
} // namespace Adaptor
} // namespace Internal
#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.
* limitations under the License.
*
*/
+#include <dali/public-api/signals/callback.h>
namespace Dali
{
*/
void SetRenderRefreshRate( unsigned int numberOfVSyncsPerRender );
+ /**
+ * @copydoc Dali::Adaptor::SetPreRenderCallback
+ */
+ void SetPreRenderCallback( CallbackBase* callback );
+
private:
// Undefined copy constructor.