[Tizen] Update RenderState in PreRender
[platform/core/uifw/dali-core.git] / dali / integration-api / core.h
index e242cfe..a5051e5 100644 (file)
@@ -2,7 +2,7 @@
 #define DALI_INTEGRATION_CORE_H
 
 /*
- * Copyright (c) 2020 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2021 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 <cstdint> // uint32_t
 
 // INTERNAL INCLUDES
-#include <dali/public-api/common/dali-common.h>
 #include <dali/integration-api/context-notifier.h>
 #include <dali/integration-api/core-enumerations.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
 {
 class Core;
@@ -40,16 +47,12 @@ class Core;
 namespace Integration
 {
 class Core;
-class GlAbstraction;
-class GlSyncAbstraction;
-class GlContextHelperAbstraction;
 class PlatformAbstraction;
 class Processor;
 class RenderController;
-class RenderSurface;
+class Scene;
 struct Event;
-struct TouchData;
-
+struct TouchEvent;
 
 /**
  * The reasons why further updates are required.
@@ -58,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
 };
 }
 
@@ -72,52 +75,50 @@ enum Reasons
 class UpdateStatus
 {
 public:
-
   /**
    * Constructor
    */
   UpdateStatus()
   : keepUpdating(false),
     needsNotification(false),
-    surfaceRectChanged(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
    */
-  uint32_t 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; }
-
-  /**
-   * Query wheter the default surface rect is changed or not.
-   * @return true if the default surface rect is changed.
-   */
-  bool SurfaceRectChanged() { return surfaceRectChanged; }
+  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:
-
   uint32_t keepUpdating; ///< A bitmask of KeepUpdating values
-  bool needsNotification;
-  bool surfaceRectChanged;
-  float secondsFromLastFrame;
+  bool     needsNotification;
+  float    secondsFromLastFrame;
 };
 
 /**
@@ -126,13 +127,12 @@ public:
 class RenderStatus
 {
 public:
-
   /**
    * Constructor
    */
   RenderStatus()
-  : needsUpdate( false ),
-    needsPostRender( false )
+  : needsUpdate(false),
+    needsPostRender(false)
   {
   }
 
@@ -140,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;
   }
@@ -159,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;
   }
@@ -174,12 +174,10 @@ 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.
 };
 
-
 /**
  * Integration::Core is used for integration with the native windowing system.
  * The following integration tasks must be completed:
@@ -216,28 +214,25 @@ private:
 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] glContextHelperAbstraction The interface providing OpenGL context helper objects.
+   * @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,
-                    GlContextHelperAbstraction& glContextHelperAbstraction,
-                    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.
@@ -283,13 +278,6 @@ public:
    */
   void RecoverFromContextLoss();
 
-  /**
-   * Notify the Core that the GL surface has been deleted.
-   * Multi-threading note: this method should be called from the main thread
-   * @param[in] surface The deleted surface
-   */
-  void SurfaceDeleted( Integration::RenderSurface* surface );
-
   // Core Lifecycle
 
   /**
@@ -337,39 +325,91 @@ public:
    * @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.
    */
-  void Update( float elapsedSeconds,
-               uint32_t lastVSyncTimeMilliseconds,
-               uint32_t nextVSyncTimeMilliseconds,
-               UpdateStatus& status,
-               bool renderToFboEnabled,
-               bool isRenderingToFbo );
+  void Update(float         elapsedSeconds,
+              uint32_t      lastVSyncTimeMilliseconds,
+              uint32_t      nextVSyncTimeMilliseconds,
+              UpdateStatus& status,
+              bool          renderToFboEnabled,
+              bool          isRenderingToFbo);
 
   /**
-   * 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.
    * @param[in] uploadOnly uploadOnly Upload the resource only without rendering.
    */
-  void Render( RenderStatus& status, bool forceClear, bool uploadOnly );
+  void PreRender(RenderStatus& status, bool forceClear, bool uploadOnly);
+
+  /**
+   * 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 PreRender(RenderStatus& status, Integration::Scene& scene, std::vector<Rect<int>>& damagedRects);
+
+  /**
+   * 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.
+   */
+  void RenderScene(RenderStatus& status, Integration::Scene& scene, bool renderToFbo);
+
+  /**
+   * 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 RenderScene(RenderStatus& status, Integration::Scene& scene, bool renderToFbo, Rect<int>& clippingRect);
+
+  /**
+   * 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.
+   * @param[in] uploadOnly uploadOnly Upload the resource only without rendering.
+   */
+  void PostRender(bool uploadOnly);
 
   /**
    * @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;
 
+private:
   /**
    * Private constructor; see also Core::New()
    */
@@ -390,9 +430,7 @@ private:
   Core& operator=(const Core& rhs);
 
 private:
-
   Internal::Core* mImpl;
-
 };
 
 } // namespace Integration