[Tizen] Implement partial update
[platform/core/uifw/dali-core.git] / dali / internal / render / renderers / render-surface-frame-buffer.h
old mode 100644 (file)
new mode 100755 (executable)
index 576ea65..6749e87
  * limitations under the License.
  */
 
+// EXTERNAL INCLUDES
+#include <atomic>
+
 // INTERNAL INCLUDES
+#include <dali/internal/update/manager/update-manager.h>
 #include <dali/internal/render/renderers/render-frame-buffer.h>
 #include <dali/integration-api/render-surface.h>
 
@@ -82,6 +86,31 @@ public:
    */
   bool IsSurfaceBacked() override { return true; };
 
+  /**
+   * @brief Sets the frame buffer size.
+   * @param[in] width The width size
+   * @param[in] height The height size
+   */
+  void SetSize( uint32_t width, uint32_t height );
+
+  /**
+   * @brief Sets the background color.
+   * @param[in] color The new background color
+   */
+  void SetBackgroundColor( const Vector4& color );
+
+  /**
+   * @copydoc Dali::Internal::FrameBuffer::MarkSurfaceAsInvalid()
+   */
+  void MarkSurfaceAsInvalid() { mIsSurfaceInvalid = true; };
+
+  /**
+   * @brief Gets whether the render surface in this frame buffer is valid or not
+   * @note The render surface becomes invalid when it is deleted in the event thread
+   * @return Whether the render surface is valid or not
+   */
+  bool IsSurfaceValid() const;
+
 public:
 
   /**
@@ -96,16 +125,9 @@ public:
   Context* GetContext();
 
   /**
-   * @brief Gets whether the depth buffer is required
-   * @return TRUE if the depth buffer is required
+   * @brief Makes the graphics context current
    */
-  Integration::DepthBufferAvailable GetDepthBufferRequired();
-
-  /**
-   * @brief Gets whether the stencil buffer is required
-   * @return TRUE if the stencil buffer is required
-   */
-  Integration::StencilBufferAvailable GetStencilBufferRequired();
+  void MakeContextCurrent();
 
   /**
    * @brief Gets the background color of the surface.
@@ -113,12 +135,72 @@ public:
    */
   Vector4 GetBackgroundColor();
 
+  /**
+   * @brief Sets currentframe damaged rects
+   * @param[in] Sets currentframe damaged rects
+   * @param[out] return merged rect
+   */
+  void SetDamagedRect( const Dali::DamagedRect& damagedRect, Dali::DamagedRect& mergedRect );
+
+  /**
+   * @brief Gets whether partial update is required for partial update
+   * @return whether partial update or not
+   */
+  bool IsPartialUpdateEnabled() const;
+
+  /**
+   * @brief Sets whether partial update is required for partial update
+   * @param[in] value whether partial update or not
+   */
+  void SetPartialUpdateEnabled( bool value );
+
 private:
 
   Integration::RenderSurface* mSurface;   ///< The render surface
   Context*                    mContext;   ///< The context holding the GL state of rendering for the surface backed frame buffer
+
+  uint32_t                    mWidth;
+  uint32_t                    mHeight;
+  Vector4                     mBackgroundColor;
+  bool                        mSizeChanged;
+  bool                        mBackgroundColorChanged;
+  std::atomic<bool>           mIsSurfaceInvalid; ///< This is set only from the event thread and read only from the render thread
+  bool                        mPartialUpdateEnabled; ///< This value is whether partial update is required
 };
 
+// Messages for FrameBuffer
+inline void SetFrameBufferSizeMessage( SceneGraph::UpdateManager& updateManager, SurfaceFrameBuffer* surfaceFrameBuffer, uint32_t width, uint32_t height )
+{
+  typedef MessageValue2< SurfaceFrameBuffer, uint32_t, uint32_t  > LocalType;
+
+  // Reserve some memory inside the message queue
+  uint32_t* slot = updateManager.ReserveMessageSlot( sizeof( LocalType ) );
+
+  // Construct message in the message queue memory; note that delete should not be called on the return value
+  new (slot) LocalType( surfaceFrameBuffer, &SurfaceFrameBuffer::SetSize, width, height );
+}
+
+inline void SetFrameBufferBackgroundColorMessage( SceneGraph::UpdateManager& updateManager, SurfaceFrameBuffer* surfaceFrameBuffer, const Vector4& color )
+{
+  typedef MessageValue1< SurfaceFrameBuffer, Vector4 > LocalType;
+
+  // Reserve some memory inside the message queue
+  uint32_t* slot = updateManager.ReserveMessageSlot( sizeof( LocalType ) );
+
+  // Construct message in the message queue memory; note that delete should not be called on the return value
+  new (slot) LocalType( surfaceFrameBuffer, &SurfaceFrameBuffer::SetBackgroundColor, color );
+}
+
+inline void SetFrameBufferPartialUpdateMessage( SceneGraph::UpdateManager& updateManager, SurfaceFrameBuffer* surfaceFrameBuffer, bool value )
+{
+  typedef MessageValue1< SurfaceFrameBuffer, bool > LocalType;
+
+  // Reserve some memory inside the message queue
+  uint32_t* slot = updateManager.ReserveMessageSlot( sizeof( LocalType ) );
+
+  // Construct message in the message queue memory; note that delete should not be called on the return value
+  new (slot) LocalType( surfaceFrameBuffer, &SurfaceFrameBuffer::SetPartialUpdateEnabled, value );
+}
 
 } // namespace Render