#define DALI_INTERNAL_CORE_H
/*
- * Copyright (c) 2016 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2019 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.
*/
// INTERNAL INCLUDES
+#include <dali/public-api/common/dali-vector.h>
#include <dali/public-api/object/ref-object.h>
#include <dali/integration-api/context-notifier.h>
+#include <dali/integration-api/core-enumerations.h>
#include <dali/internal/common/owner-pointer.h>
+#include <dali/devel-api/common/owner-container.h>
#include <dali/internal/event/animation/animation-playlist-declarations.h>
#include <dali/internal/event/common/stage-def.h>
-#include <dali/public-api/common/view-mode.h>
#include <dali/integration-api/resource-policies.h>
+#include <dali/internal/event/common/scene-impl.h>
+#include <dali/internal/event/common/object-registry-impl.h>
namespace Dali
{
namespace Integration
{
+class Processor;
class RenderController;
class PlatformAbstraction;
-class GestureManager;
class GlAbstraction;
class GlSyncAbstraction;
-class SystemOverlay;
+class GlContextHelperAbstraction;
class UpdateStatus;
class RenderStatus;
+class RenderSurface;
struct Event;
struct TouchData;
}
class ShaderFactory;
class TouchResampler;
class RelayoutController;
+class EventThreadServices;
namespace SceneGraph
{
/**
* Internal class for Dali::Integration::Core
*/
-class Core
+class Core : public EventThreadServices
{
public:
Integration::PlatformAbstraction& platform,
Integration::GlAbstraction& glAbstraction,
Integration::GlSyncAbstraction& glSyncAbstraction,
- Integration::GestureManager& gestureManager,
- ResourcePolicy::DataRetention dataRetentionPolicy );
+ Integration::GlContextHelperAbstraction& glContextHelperAbstraction,
+ ResourcePolicy::DataRetention dataRetentionPolicy,
+ Integration::RenderToFrameBuffer renderToFboEnabled,
+ Integration::DepthBufferAvailable depthBufferAvailable,
+ Integration::StencilBufferAvailable stencilBufferAvailable,
+ Integration::PartialUpdateAvailable partialUpdateAvailable );
/**
* Destructor
~Core();
/**
+ * @copydoc Dali::Integration::Core::Initialize()
+ */
+ void Initialize();
+
+ /**
* @copydoc Dali::Integration::Core::GetContextNotifier()
*/
Integration::ContextNotifierInterface* GetContextNotifier();
void RecoverFromContextLoss();
/**
- * @copydoc Dali::Integration::Core::SurfaceResized(unsigned int, unsigned int)
+ * @copydoc Dali::Integration::Core::SurfaceDeleted(Integration::RenderSurface*)
*/
- void SurfaceResized(unsigned int width, unsigned int height);
+ void SurfaceDeleted( Integration::RenderSurface* surface );
/**
- * @copydoc Dali::Integration::Core::SetTopMargin( unsigned int margin )
+ * @copydoc Dali::Integration::Core::SetMinimumFrameTimeInterval(uint32_t)
*/
- void SetTopMargin( unsigned int margin );
+ void SetMinimumFrameTimeInterval(uint32_t interval);
/**
- * @copydoc Dali::Integration::Core::SetDpi(unsigned int, unsigned int)
+ * @copydoc Dali::Integration::Core::Update()
*/
- void SetDpi(unsigned int dpiHorizontal, unsigned int dpiVertical);
+ void Update( float elapsedSeconds, uint32_t lastVSyncTimeMilliseconds, uint32_t nextVSyncTimeMilliseconds, Integration::UpdateStatus& status, bool renderToFboEnabled, bool isRenderingToFbo );
/**
- * @copydoc Dali::Integration::Core::SetMinimumFrameTimeInterval(unsigned int)
+ * @copydoc Dali::Integration::Core::Render()
*/
- void SetMinimumFrameTimeInterval(unsigned int interval);
+ void Render( Integration::RenderStatus& status, bool forceClear, bool uploadOnly );
/**
- * @copydoc Dali::Integration::Core::Update()
+ * @copydoc Dali::Integration::Core::SceneCreated()
*/
- void Update( float elapsedSeconds, unsigned int lastVSyncTimeMilliseconds, unsigned int nextVSyncTimeMilliseconds, Integration::UpdateStatus& status );
+ void SceneCreated();
/**
- * @copydoc Dali::Integration::Core::Render()
+ * @copydoc Dali::Integration::Core::QueueEvent(const Integration::Event&)
*/
- void Render( Integration::RenderStatus& status );
+ void QueueEvent( const Integration::Event& event );
/**
- * @copydoc Dali::Integration::Core::Suspend()
+ * @copydoc Dali::Integration::Core::ProcessEvents()
*/
- void Suspend();
+ void ProcessEvents();
/**
- * @copydoc Dali::Integration::Core::Resume()
+ * @copydoc Dali::Integration::Core::GetMaximumUpdateCount()
*/
- void Resume();
+ uint32_t GetMaximumUpdateCount() const;
/**
- * @copydoc Dali::Integration::Core::SceneCreated()
+ * @copydoc Dali::Integration::Core::RegisterProcessor
*/
- void SceneCreated();
+ void RegisterProcessor( Dali::Integration::Processor& processor );
/**
- * @copydoc Dali::Integration::Core::QueueEvent(const Integration::Event&)
+ * @copydoc Dali::Integration::Core::UnregisterProcessor
*/
- void QueueEvent( const Integration::Event& event );
+ void UnregisterProcessor( Dali::Integration::Processor& processor );
/**
- * @copydoc Dali::Integration::Core::ProcessEvents()
+ * @copydoc Dali::Internal::ThreadLocalStorage::AddScene()
*/
- void ProcessEvents();
+ void AddScene( Scene* scene );
/**
- * @copydoc Dali::Integration::Core::GetMaximumUpdateCount()
+ * @copydoc Dali::Internal::ThreadLocalStorage::RemoveScene()
+ */
+ void RemoveScene( Scene* scene );
+
+public: // Implementation of EventThreadServices
+
+ /**
+ * @copydoc EventThreadServices::RegisterObject
+ */
+ void RegisterObject( BaseObject* object) override;
+
+ /**
+ * @copydoc EventThreadServices::UnregisterObject
*/
- unsigned int GetMaximumUpdateCount() const;
+ void UnregisterObject( BaseObject* object) override;
/**
- * @copydoc Dali::Integration::Core::GetSystemOverlay()
+ * @copydoc EventThreadServices::GetUpdateManager
*/
- Integration::SystemOverlay& GetSystemOverlay();
+ SceneGraph::UpdateManager& GetUpdateManager() override;
- // Stereoscopy
+ /**
+ * @copydoc EventThreadServices::GetRenderController
+ */
+ Integration::RenderController& GetRenderController() override;
/**
- * @copydoc Dali::Integration::Core::SetViewMode()
+ * @copydoc EventThreadServices::ReserveMessageSlot
*/
- void SetViewMode( ViewMode viewMode );
+ uint32_t* ReserveMessageSlot( uint32_t size, bool updateScene ) override;
/**
- * @copydoc Dali::Integration::Core::GetViewMode()
+ * @copydoc EventThreadServices::GetEventBufferIndex
*/
- ViewMode GetViewMode() const;
+ BufferIndex GetEventBufferIndex() const override;
/**
- * @copydoc Dali::Integration::Core::SetStereoBase()
+ * @copydoc EventThreadServices::ForceNextUpdate
*/
- void SetStereoBase( float stereoBase );
+ void ForceNextUpdate() override;
/**
- * @copydoc Dali::Integration::Core::GetStereoBase()
+ * @copydoc EventThreadServices::IsNextUpdateForced
+ */
+ bool IsNextUpdateForced() override;
+
+private:
+ /**
+ * Run each registered processor
*/
- float GetStereoBase() const;
+ void RunProcessors();
-private: // for use by ThreadLocalStorage
+ // for use by ThreadLocalStorage
/**
* Returns the current stage.
Integration::PlatformAbstraction& GetPlatform();
/**
- * Returns the update manager.
- * @return A reference to the update manager.
- */
- SceneGraph::UpdateManager& GetUpdateManager();
-
- /**
* Returns the render manager.
* @return A reference to the render manager.
*/
*/
RelayoutController& GetRelayoutController();
+ /**
+ * @brief Gets the Object registry.
+ * @return A reference to the object registry
+ */
+ ObjectRegistry& GetObjectRegistry() const;
+
+ /**
+ * @brief Gets the event thread services.
+ * @return A reference to the event thread services
+ */
+ EventThreadServices& GetEventThreadServices();
+
+ /**
+ * @brief Gets the property notification manager.
+ * @return A reference to the property notification manager
+ */
+ PropertyNotificationManager& GetPropertyNotificationManager() const;
+
+ /**
+ * @brief Gets the animation play list.
+ * @return A reference to the animation play list
+ */
+ AnimationPlaylist& GetAnimationPlaylist() const;
+
private:
/**
* Undefined copy and assignment operators
*/
- Core(const Core& core); // No definition
- Core& operator=(const Core& core); // No definition
+ Core(const Core& core) = delete; // No definition
+ Core& operator=(const Core& core) = delete; // No definition
/**
* Create Thread local storage
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
OwnerPointer<SceneGraph::RenderManager> mRenderManager; ///< Render manager
OwnerPointer<ShaderFactory> mShaderFactory; ///< Shader resource factory
OwnerPointer<NotificationManager> mNotificationManager; ///< Notification manager
OwnerPointer<GestureEventProcessor> mGestureEventProcessor; ///< The gesture event processor
- OwnerPointer<EventProcessor> mEventProcessor; ///< The event processor
+ Dali::Vector<Integration::Processor*> mProcessors; ///< Registered processors (not owned)
+
+ using SceneContainer = std::vector<ScenePtr>;
+ SceneContainer mScenes; ///< A container of scenes that bound to a surface for rendering, owned by Core
+
+ // The object registry
+ ObjectRegistryPtr mObjectRegistry;
+
+ bool mProcessingEvent : 1; ///< True during ProcessEvents()
+ bool mForceNextUpdate:1; ///< True if the next rendering is really required.
friend class ThreadLocalStorage;