Merge "Added memory pool logging" into devel/master
[platform/core/uifw/dali-core.git] / dali / integration-api / core.h
index 5d05e85..0b44348 100644 (file)
@@ -2,7 +2,7 @@
 #define DALI_INTEGRATION_CORE_H
 
 /*
- * Copyright (c) 2018 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2022 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.
  *
  */
 
+// EXTERNAL INCLUDES
+#include <cstdint> // uint32_t
+
 // INTERNAL INCLUDES
-#include <dali/public-api/common/dali-common.h>
-#include <dali/public-api/common/view-mode.h>
 #include <dali/integration-api/context-notifier.h>
 #include <dali/integration-api/core-enumerations.h>
-#include <dali/integration-api/resource-policies.h>
+#include <dali/public-api/common/dali-common.h>
+#include <dali/public-api/common/vector-wrapper.h>
+#include <dali/public-api/math/rect.h>
 
 namespace Dali
 {
+class Layer;
+class ObjectRegistry;
+class RenderTaskList;
+
+namespace Graphics
+{
+class Controller;
+}
 
 namespace Internal
 {
@@ -35,17 +46,13 @@ class Core;
 
 namespace Integration
 {
-
 class Core;
-class GestureManager;
-class GlAbstraction;
-class GlSyncAbstraction;
 class PlatformAbstraction;
+class Processor;
 class RenderController;
-class SystemOverlay;
+class Scene;
 struct Event;
-struct TouchData;
-
+struct TouchEvent;
 
 /**
  * The reasons why further updates are required.
@@ -54,11 +61,11 @@ namespace KeepUpdating
 {
 enum Reasons
 {
-  NOT_REQUESTED           = 0,    ///< Zero means that no further updates are required
-  STAGE_KEEP_RENDERING    = 1<<1, ///<  - Stage::KeepRendering() is being used
-  ANIMATIONS_RUNNING      = 1<<2, ///< - Animations are ongoing
-  MONITORING_PERFORMANCE  = 1<<3, ///< - The --enable-performance-monitor option is being used
-  RENDER_TASK_SYNC        = 1<<4  ///< - A render task is waiting for render sync
+  NOT_REQUESTED          = 0,      ///< Zero means that no further updates are required
+  STAGE_KEEP_RENDERING   = 1 << 1, ///<  - Stage::KeepRendering() is being used
+  ANIMATIONS_RUNNING     = 1 << 2, ///< - Animations are ongoing
+  MONITORING_PERFORMANCE = 1 << 3, ///< - The --enable-performance-monitor option is being used
+  RENDER_TASK_SYNC       = 1 << 4  ///< - A render task is waiting for render sync
 };
 }
 
@@ -68,44 +75,50 @@ enum Reasons
 class UpdateStatus
 {
 public:
-
   /**
    * Constructor
    */
   UpdateStatus()
   : keepUpdating(false),
     needsNotification(false),
-    secondsFromLastFrame( 0.0f )
+    secondsFromLastFrame(0.0f)
   {
   }
 
 public:
-
   /**
    * Query whether the Core has further frames to update & render e.g. when animations are ongoing.
    * @return A bitmask of KeepUpdating values
    */
-  unsigned int KeepUpdating() { return keepUpdating; }
+  uint32_t KeepUpdating()
+  {
+    return keepUpdating;
+  }
 
   /**
    * Query whether the Core requires an Notification event.
    * This should be sent through the same mechanism (e.g. event loop) as input events.
    * @return True if an Notification event should be sent.
    */
-  bool NeedsNotification() { return needsNotification; }
+  bool NeedsNotification()
+  {
+    return needsNotification;
+  }
 
   /**
    * This method is provided so that FPS can be easily calculated with a release version
    * of Core.
    * @return the seconds from last frame as float
    */
-  float SecondsFromLastFrame() { return secondsFromLastFrame; }
+  float SecondsFromLastFrame()
+  {
+    return secondsFromLastFrame;
+  }
 
 public:
-
-  unsigned int keepUpdating; ///< A bitmask of KeepUpdating values
-  bool needsNotification;
-  float secondsFromLastFrame;
+  uint32_t keepUpdating; ///< A bitmask of KeepUpdating values
+  bool     needsNotification;
+  float    secondsFromLastFrame;
 };
 
 /**
@@ -114,13 +127,12 @@ public:
 class RenderStatus
 {
 public:
-
   /**
    * Constructor
    */
   RenderStatus()
-  : needsUpdate( false ),
-    needsPostRender( false )
+  : needsUpdate(false),
+    needsPostRender(false)
   {
   }
 
@@ -128,7 +140,7 @@ public:
    * Set whether update needs to run following a render.
    * @param[in] updateRequired Set to true if an update is required to be run
    */
-  void SetNeedsUpdate( bool updateRequired )
+  void SetNeedsUpdate(bool updateRequired)
   {
     needsUpdate = updateRequired;
   }
@@ -147,7 +159,7 @@ public:
    * If nothing is rendered this frame, we can skip post-render.
    * @param[in] postRenderRequired Set to True if post-render is required to be run
    */
-  void SetNeedsPostRender( bool postRenderRequired )
+  void SetNeedsPostRender(bool postRenderRequired)
   {
     needsPostRender = postRenderRequired;
   }
@@ -162,29 +174,11 @@ public:
   }
 
 private:
-
-  bool needsUpdate      :1;  ///< True if update is required to be run
-  bool needsPostRender  :1;  ///< True if post-render is required to be run.
+  bool needsUpdate : 1;     ///< True if update is required to be run
+  bool needsPostRender : 1; ///< True if post-render is required to be run.
 };
 
 /**
- * Interface to enable classes to be processed after the event loop. Classes are processed
- * in the order they are registered.
- */
-class DALI_IMPORT_API Processor
-{
-public:
-  /**
-   * @brief Run the processor
-   */
-  virtual void Process() = 0;
-
-protected:
-  virtual ~Processor() { }
-};
-
-
-/**
  * Integration::Core is used for integration with the native windowing system.
  * The following integration tasks must be completed:
  *
@@ -202,8 +196,6 @@ protected:
  *
  * 6) Provide an implementation of the GlAbstraction interface, used to access OpenGL services.
  *
- * 7) Provide an implementation of the GestureManager interface, used to register gestures provided by the platform.
- *
  * Multi-threading notes:
  *
  * The Dali API methods are not reentrant.  If you access the API from multiple threads simultaneously, then the results
@@ -219,41 +211,39 @@ protected:
  * This is the recommended option, so that input processing will not affect the smoothness of animations.
  * Note that the rendering thread must be halted, before destroying the GL context.
  */
-class DALI_IMPORT_API Core
+class DALI_CORE_API Core
 {
 public:
-
   /**
    * Create a new Core.
    * This object is used for integration with the native windowing system.
    * @param[in] renderController The interface to an object which controls rendering.
    * @param[in] platformAbstraction The interface providing platform specific services.
-   * @param[in] glAbstraction The interface providing OpenGL services.
-   * @param[in] glSyncAbstraction The interface providing OpenGL sync objects.
-   * @param[in] gestureManager The interface providing gesture manager services.
-   * @param[in] policy The data retention policy. This depends on application setting
-   * and platform support. Dali should honour this policy when deciding to discard
-   * intermediate resource data.
+   * @param[in] graphicsController The interface providing graphics services
    * @param[in] renderToFboEnabled Whether rendering into the Frame Buffer Object is enabled.
    * @param[in] depthBufferAvailable Whether the depth buffer is available
    * @param[in] stencilBufferAvailable Whether the stencil buffer is available
+   * @param[in] partialUpdateAvailable Whether the partial update is available
    * @return A newly allocated Core.
    */
-  static Core* New( RenderController& renderController,
-                    PlatformAbstraction& platformAbstraction,
-                    GlAbstraction& glAbstraction,
-                    GlSyncAbstraction& glSyncAbstraction,
-                    GestureManager& gestureManager,
-                    ResourcePolicy::DataRetention policy,
-                    RenderToFrameBuffer renderToFboEnabled,
-                    DepthBufferAvailable depthBufferAvailable,
-                    StencilBufferAvailable stencilBufferAvailable );
+  static Core* New(RenderController&      renderController,
+                   PlatformAbstraction&   platformAbstraction,
+                   Graphics::Controller&  graphicsController,
+                   RenderToFrameBuffer    renderToFboEnabled,
+                   DepthBufferAvailable   depthBufferAvailable,
+                   StencilBufferAvailable stencilBufferAvailable,
+                   PartialUpdateAvailable partialUpdateAvailable);
 
   /**
    * Non-virtual destructor. Core is not intended as a base class.
    */
   ~Core();
 
+  /**
+   * Initialize the core
+   */
+  void Initialize();
+
   // GL Context Lifecycle
 
   /**
@@ -288,37 +278,6 @@ public:
    */
   void RecoverFromContextLoss();
 
-  /**
-   * Notify the Core that the GL surface has been resized.
-   * This should be done at least once i.e. after the first call to ContextCreated().
-   * The Core will use the surface size for camera calculations, and to set the GL viewport.
-   * Multi-threading note: this method should be called from the main thread
-   * @param[in] width The new surface width.
-   * @param[in] height The new surface height.
-   */
-  void SurfaceResized(unsigned int width, unsigned int height);
-
-  /**
-   * Notify the Core about the top margin size.
-   * Available stage size is reduced by this size.
-   * The stage is located below the size at the top of the display
-   * It is mainly useful for indicator in mobile device
-   * @param[in] margin margin size
-   */
-  void SetTopMargin( unsigned int margin );
-
-  // Core setters
-
-  /**
-   * Notify the Core about the display's DPI values.
-   * This should be done after the display is initialized and a Core instance is created.
-   * The Core will use the DPI values for font rendering.
-   * Multi-threading note: this method should be called from the main thread
-   * @param[in] dpiHorizontal Horizontal DPI value.
-   * @param[in] dpiVertical   Vertical DPI value.
-   */
-  void SetDpi(unsigned int dpiHorizontal, unsigned int dpiVertical);
-
   // Core Lifecycle
 
   /**
@@ -349,7 +308,7 @@ public:
    * the Core::Render() method for frame N has returned.
    * @return The maximum update count (>= 1).
    */
-  unsigned int GetMaximumUpdateCount() const;
+  uint32_t GetMaximumUpdateCount() const;
 
   /**
    * Update the scene for the next frame. This method must be called before each frame is rendered.
@@ -365,72 +324,97 @@ public:
    * whether a Notification event should be sent, regardless of whether the multi-threading is used.
    * @param[in] renderToFboEnabled Whether rendering into the Frame Buffer Object is enabled.
    * @param[in] isRenderingToFbo Whether this frame is being rendered into the Frame Buffer Object.
+   * @param[in] uploadOnly uploadOnly Upload the resource only without rendering.
    */
-  void Update( float elapsedSeconds,
-               unsigned int lastVSyncTimeMilliseconds,
-               unsigned int nextVSyncTimeMilliseconds,
-               UpdateStatus& status,
-               bool renderToFboEnabled,
-               bool isRenderingToFbo );
+  void Update(float         elapsedSeconds,
+              uint32_t      lastVSyncTimeMilliseconds,
+              uint32_t      nextVSyncTimeMilliseconds,
+              UpdateStatus& status,
+              bool          renderToFboEnabled,
+              bool          isRenderingToFbo,
+              bool          uploadOnly);
 
   /**
-   * Render the next frame. This method should be preceded by a call up Update.
+   * This is called before rendering any scene in the next frame. This method should be preceded
+   * by a call up Update.
    * Multi-threading note: this method should be called from a dedicated rendering thread.
    * @pre The GL context must have been created, and made current.
    * @param[out] status showing whether update is required to run.
    * @param[in] forceClear force the Clear on the framebuffer even if nothing is rendered.
    */
-  void Render( RenderStatus& status, bool forceClear );
-
-  // System-level overlay
-
-  /**
-   * Use the SystemOverlay to draw content for system-level indicators, dialogs etc.
-   * @return The SystemOverlay.
-   */
-  SystemOverlay& GetSystemOverlay();
+  void PreRender(RenderStatus& status, bool forceClear);
 
   /**
-   * Set the stereoscopic 3D view mode
-   * @param[in] viewMode The new view mode
+   * This is called before rendering any scene in the next frame. This method should be preceded
+   * by a call up Update.
+   * Multi-threading note: this method should be called from a dedicated rendering thread.
+   * @pre The GL context must have been created, and made current.
+   * @param[in] scene The scene to be rendered.
+   * @param[out] damagedRects containing damaged render items rects for this pass.
    */
-  void SetViewMode( ViewMode viewMode );
+  void PreRender(Integration::Scene& scene, std::vector<Rect<int>>& damagedRects);
 
   /**
-   * Get the current view mode
-   * @return The current view mode
-   * @see SetViewMode.
+   * Render a scene in the next frame. This method should be preceded by a call up PreRender.
+   * This method should be called twice. The first pass to render off-screen frame buffers if any,
+   * and the second pass to render the surface.
+   * Multi-threading note: this method should be called from a dedicated rendering thread.
+   * @pre The GL context must have been created, and made current.
+   * @param[out] status Contains the rendering flags.
+   * @param[in] scene The scene to be rendered.
+   * @param[in] renderToFbo True to render off-screen frame buffers only if any, and False to render the surface only.
    */
-  ViewMode GetViewMode() const;
+  void RenderScene(RenderStatus& status, Integration::Scene& scene, bool renderToFbo);
 
   /**
-   * Set the stereo base (eye seperation) for stereoscopic 3D
-   * @param[in] stereoBase The stereo base (eye seperation) for stereoscopic 3D (mm)
+   * Render a scene in the next frame. This method should be preceded by a call up PreRender.
+   * This method should be called twice. The first pass to render off-screen frame buffers if any,
+   * and the second pass to render the surface.
+   * Multi-threading note: this method should be called from a dedicated rendering thread.
+   * @pre The GL context must have been created, and made current.
+   * @param[out] status Contains the rendering flags.
+   * @param[in] scene The scene to be rendered.
+   * @param[in] renderToFbo True to render off-screen frame buffers only if any, and False to render the surface only.
+   * @param[in] clippingRect The rect to clip rendered scene.
    */
-  void SetStereoBase( float stereoBase );
+  void RenderScene(RenderStatus& status, Integration::Scene& scene, bool renderToFbo, Rect<int>& clippingRect);
 
   /**
-   * Get the stereo base (eye seperation) for stereoscopic 3D
-   * @return The stereo base (eye seperation) for stereoscopic 3D (mm)
+   * This is called after rendering all the scenes in the next frame. This method should be
+   * followed by a call up RenderScene.
+   * Multi-threading note: this method should be called from a dedicated rendering thread.
+   * @pre The GL context must have been created, and made current.
    */
-  float GetStereoBase() const;
+  void PostRender();
 
   /**
    * @brief Register a processor
    *
    * Note, Core does not take ownership of this processor.
    * @param[in] processor The process to register
+   * @param[in] postProcessor set this processor required to be called after size negotiation. Default is false.
    */
-  void RegisterProcessor( Processor& processor );
+  void RegisterProcessor(Processor& processor, bool postProcessor = false);
 
   /**
    * @brief Unregister a processor
    * @param[in] processor The process to unregister
+   * @param[in] postProcessor True if the processor to be unregister is for post processor.
    */
-  void UnregisterProcessor( Processor& processor );
+  void UnregisterProcessor(Processor& processor, bool postProcessor = false);
 
-private:
+  /**
+   * @brief Gets the Object registry.
+   * @return The object registry
+   */
+  ObjectRegistry GetObjectRegistry() const;
+
+  /**
+   * Log core's memory pool's capacities
+   */
+  void LogMemoryPools() const;
 
+private:
   /**
    * Private constructor; see also Core::New()
    */
@@ -451,9 +435,7 @@ private:
   Core& operator=(const Core& rhs);
 
 private:
-
   Internal::Core* mImpl;
-
 };
 
 } // namespace Integration