Add front buffer rendering APIs in Dali::Window 74/300974/11
authorANZ1217 <chihun.jeong@samsung.com>
Mon, 6 Nov 2023 12:09:23 +0000 (21:09 +0900)
committerANZ1217 <chihun.jeong@samsung.com>
Tue, 7 Nov 2023 04:22:08 +0000 (13:22 +0900)
Front buffer rendering is used to improve latency or real-time interactivity.

Change-Id: I53d300db7bb589042b0137854f424696d127cd8a

24 files changed:
dali/devel-api/adaptor-framework/window-devel.cpp
dali/devel-api/adaptor-framework/window-devel.h
dali/internal/adaptor/common/application-impl.cpp
dali/internal/adaptor/common/application-impl.h
dali/internal/window-system/android/window-base-android.cpp
dali/internal/window-system/android/window-base-android.h
dali/internal/window-system/common/window-base.h
dali/internal/window-system/common/window-impl.cpp
dali/internal/window-system/common/window-impl.h
dali/internal/window-system/common/window-render-surface.cpp
dali/internal/window-system/common/window-render-surface.h
dali/internal/window-system/macos/window-base-mac.h
dali/internal/window-system/macos/window-base-mac.mm
dali/internal/window-system/tizen-wayland/ecore-wl/window-base-ecore-wl.cpp
dali/internal/window-system/tizen-wayland/ecore-wl/window-base-ecore-wl.h
dali/internal/window-system/tizen-wayland/ecore-wl2/window-base-ecore-wl2.cpp
dali/internal/window-system/tizen-wayland/ecore-wl2/window-base-ecore-wl2.h
dali/internal/window-system/ubuntu-x11/window-base-ecore-x.cpp
dali/internal/window-system/ubuntu-x11/window-base-ecore-x.h
dali/internal/window-system/windows/window-base-win.cpp
dali/internal/window-system/windows/window-base-win.h
dali/internal/window-system/x11/window-base-x.cpp
dali/internal/window-system/x11/window-base-x.h
dali/public-api/adaptor-framework/application.cpp

index 30cf358..b41149a 100644 (file)
@@ -354,6 +354,16 @@ bool GetFullScreen(Window window)
   return GetImplementation(window).GetFullScreen();
 }
 
+void SetFrontBufferRendering(Window window, bool enable)
+{
+  GetImplementation(window).SetFrontBufferRendering(enable);
+}
+
+bool GetFrontBufferRendering(Window window)
+{
+  return GetImplementation(window).GetFrontBufferRendering();
+}
+
 InterceptKeyEventSignalType& InterceptKeyEventSignal(Window window)
 {
   return GetImplementation(window).InterceptKeyEventSignal();
index ca2e3e4..2a92b07 100644 (file)
@@ -640,6 +640,22 @@ DALI_ADAPTOR_API void SetFullScreen(Window window, bool fullscreen);
 DALI_ADAPTOR_API bool GetFullScreen(Window window);
 
 /**
+ * @brief Enables or disables front buffer rendering.
+ *
+ * @param[in] window The window instance.
+ * @param[in] enable true to enable front buffer rendering, false to disable.
+ */
+DALI_ADAPTOR_API void SetFrontBufferRendering(Window window, bool enable);
+
+/**
+ * @brief Gets whether front buffer rendering is enabled.
+ *
+ * @param[in] window The window instance.
+ * @return Whether front buffer rendering has been enabled or not.
+ */
+DALI_ADAPTOR_API bool GetFrontBufferRendering(Window window);
+
+/**
  * @brief The user would connect to this signal to intercept a KeyEvent at window.
  *
  * Intercepts KeyEvents in the window before dispatching KeyEvents to the control.
index a513be2..0f18afa 100644 (file)
@@ -135,6 +135,7 @@ Application::Application(int* argc, char** argv[], const std::string& stylesheet
   mMainWindow(),
   mMainWindowMode(windowData.GetTransparency() ? WINDOW_MODE::TRANSPARENT : WINDOW_MODE::OPAQUE),
   mMainWindowName(),
+  mIsMainWindowFrontBufferRendering(windowData.GetFrontBufferRendering()),
   mStylesheet(stylesheet),
   mWindowPositionSize(windowData.GetPositionSize()),
   mLaunchpadState(Launchpad::NONE),
@@ -203,6 +204,11 @@ void Application::StoreWindowPositionSize(PositionSize positionSize)
   mWindowPositionSize = positionSize;
 }
 
+void Application::StoreFrontBufferRendering(bool enable)
+{
+  mIsMainWindowFrontBufferRendering = enable;
+}
+
 void Application::ChangePreInitializedWindowInfo()
 {
   // Set window name
@@ -246,6 +252,9 @@ void Application::ChangePreInitializedWindowInfo()
     mWindowPositionSize.height = screenHeight;
     mMainWindow.SetSize(Dali::Window::WindowSize(mWindowPositionSize.width, mWindowPositionSize.height));
   }
+
+  // Set front buffer rendering
+  Dali::DevelWindow::SetFrontBufferRendering(mMainWindow, mIsMainWindowFrontBufferRendering);
 }
 
 void Application::CreateWindow()
@@ -254,6 +263,7 @@ void Application::CreateWindow()
   WindowData                 windowData;
   windowData.SetTransparency(mMainWindowMode);
   windowData.SetWindowType(mDefaultWindowType);
+  windowData.SetFrontBufferRendering(mIsMainWindowFrontBufferRendering);
 
   DALI_LOG_RELEASE_INFO("Create Default Window");
 
@@ -290,8 +300,8 @@ void Application::CreateWindow()
   }
   else
   {
-    // The position, size and the window name of the pre-initialized application will be updated in ChangePreInitializedWindowInfo()
-    // when the real application is launched.
+    // The position, size, window name, and frontbuffering of the pre-initialized application
+    // will be updated in ChangePreInitializedWindowInfo() when the real application is launched.
     windowData.SetPositionSize(mWindowPositionSize);
     window = Internal::Adaptor::Window::New("", "", windowData);
   }
index 109b5a9..8d0d9c4 100644 (file)
@@ -160,6 +160,11 @@ public:
   void StoreWindowPositionSize(PositionSize positionSize);
 
   /**
+   * Stores the front buffer rendering status of the window.
+   */
+  void StoreFrontBufferRendering(bool enable);
+
+  /**
    * @copydoc Dali::DevelApplication::GetRenderThreadId()
    */
   int32_t GetRenderThreadId() const;
@@ -537,9 +542,10 @@ private:
 
   // The Main Window is that window created by the Application during initial startup
   // (previously this was the only window)
-  Dali::Window                   mMainWindow;     ///< Main Window instance
-  Dali::Application::WINDOW_MODE mMainWindowMode; ///< Window mode of the main window
-  std::string                    mMainWindowName; ///< Name of the main window as obtained from environment options
+  Dali::Window                   mMainWindow;                       ///< Main Window instance
+  Dali::Application::WINDOW_MODE mMainWindowMode;                   ///< Window mode of the main window
+  std::string                    mMainWindowName;                   ///< Name of the main window as obtained from environment options
+  bool                           mIsMainWindowFrontBufferRendering; ///< Whether front buffer rendering of the main window is enabled
 
   std::string      mStylesheet;
   PositionSize     mWindowPositionSize;
index 6766567..821da58 100644 (file)
@@ -479,6 +479,19 @@ bool WindowBaseAndroid::GetFullScreen()
   return false;
 }
 
+void WindowBaseAndroid::SetFrontBufferRendering(bool enable)
+{
+}
+
+bool WindowBaseAndroid::GetFrontBufferRendering()
+{
+  return false;
+}
+
+void WindowBaseAndroid::SetEglWindowFrontBufferMode(bool enable)
+{
+}
+
 } // namespace Adaptor
 
 } // namespace Internal
index 2638cb3..3e92ba6 100644 (file)
@@ -504,6 +504,21 @@ public:
    */
   bool GetFullScreen() override;
 
+  /**
+   * @copydoc Dali::Internal::Adaptor::WindowBase::SetFrontBufferRendering()
+   */
+  void SetFrontBufferRendering(bool enable) override;
+
+  /**
+   * @copydoc Dali::Internal::Adaptor::WindowBase::GetFrontBufferRendering()
+   */
+  bool GetFrontBufferRendering() override;
+
+  /**
+   * @copydoc Dali::Internal::Adaptor::WindowBase::SetEglWindowFrontBufferMode()
+   */
+  void SetEglWindowFrontBufferMode(bool enable) override;
+
 private:
   /**
    * Second stage initialization
index 4a80d81..7774da3 100644 (file)
@@ -547,6 +547,24 @@ public:
    */
   virtual bool GetFullScreen() = 0;
 
+  /**
+   * @brief Enables or disables front buffer rendering.
+   * @param[in] enable true to enable front buffer rendering, false to disable.
+   */
+  virtual void SetFrontBufferRendering(bool enable) = 0;
+
+    /**
+   * @brief Enables or disables front buffer rendering.
+   * @return Returns whether front buffer rendering has been enabled or not.
+   */
+  virtual bool GetFrontBufferRendering() = 0;
+
+  /**
+   * @brief Sets front buffer rendering to the egl window.
+   * @param[in] enable True to enable front buffer rendering mode, False to otherwise.
+   */
+  virtual void SetEglWindowFrontBufferMode(bool enable) = 0;
+
   // Signals
 
   /**
index e91a74a..52ba60b 100644 (file)
@@ -1476,6 +1476,17 @@ bool Window::GetFullScreen()
   return mWindowBase->GetFullScreen();
 }
 
+void Window::SetFrontBufferRendering(bool enable)
+{
+  mWindowBase->SetFrontBufferRendering(enable);
+  mWindowSurface->SetFrontBufferRendering(enable);
+}
+
+bool Window::GetFrontBufferRendering()
+{
+  return mWindowBase->GetFrontBufferRendering();
+}
+
 } // namespace Adaptor
 
 } // namespace Internal
index 83908bf..d3d5ce5 100644 (file)
@@ -562,6 +562,16 @@ public: // Dali::Internal::Adaptor::SceneHolder
    */
   bool GetFullScreen();
 
+  /**
+   * @copydoc Dali::DevelWindow::SetFrontBufferRendering()
+   */
+  void SetFrontBufferRendering(bool enable);
+
+  /**
+   * @copydoc Dali::DevelWindow::GetFrontBufferRendering()
+   */
+  bool GetFrontBufferRendering();
+
 private:
   /**
    * @brief Enumeration for orietation mode.
index 1955aa4..0d6dbdb 100644 (file)
@@ -176,7 +176,9 @@ WindowRenderSurface::WindowRenderSurface(Dali::PositionSize positionSize, Any su
   mOwnSurface(false),
   mIsImeWindowSurface(false),
   mNeedWindowRotationAcknowledgement(false),
-  mIsWindowOrientationChanging(false)
+  mIsWindowOrientationChanging(false),
+  mIsFrontBufferRendering(false),
+  mIsFrontBufferRenderingChanged(false)
 {
   DALI_LOG_INFO(gWindowRenderSurfaceLogFilter, Debug::Verbose, "Creating Window\n");
   Initialize(surface);
@@ -589,6 +591,14 @@ bool WindowRenderSurface::PreRender(bool resizingSurface, const std::vector<Rect
     SetFullSwapNextFrame();
   }
 
+  // When mIsFrontBufferRendering is not equal to mWindowBase's
+  if(mIsFrontBufferRenderingChanged)
+  {
+    mIsFrontBufferRenderingChanged = false;
+    mWindowBase->SetEglWindowFrontBufferMode(mIsFrontBufferRendering);
+    SetFullSwapNextFrame();
+  }
+
   SetBufferDamagedRects(damagedRects, clippingRect);
 
   if(scene)
@@ -944,6 +954,15 @@ void WindowRenderSurface::SwapBuffers(const std::vector<Rect<int>>& damagedRects
   }
 }
 
+void WindowRenderSurface::SetFrontBufferRendering(bool enable)
+{
+  if(mIsFrontBufferRendering != enable)
+  {
+    mIsFrontBufferRendering = enable;
+    mIsFrontBufferRenderingChanged = !mIsFrontBufferRenderingChanged;
+  }
+}
+
 } // namespace Adaptor
 
 } // namespace Internal
index 371ff6b..c59bbef 100644 (file)
@@ -161,6 +161,13 @@ public: // API
    */
   RotationFinishedSignalType& RotationFinishedSignal();
 
+  /**
+   * @brief Sets front buffer rendering flag
+   *
+   * @param[in] enable The flag for front buffer rendering
+   */
+  void SetFrontBufferRendering(bool enable);
+
 public: // from Dali::RenderSurfaceInterface
   /**
    * @copydoc Dali::RenderSurfaceInterface::GetPositionSize()
@@ -365,6 +372,8 @@ private: // Data
   bool                                   mIsImeWindowSurface;
   bool                                   mNeedWindowRotationAcknowledgement;
   bool                                   mIsWindowOrientationChanging;
+  bool                                   mIsFrontBufferRendering;
+  bool                                   mIsFrontBufferRenderingChanged;
 
 }; // class WindowRenderSurface
 
index 425bcc5..640d527 100644 (file)
@@ -437,6 +437,22 @@ public:
    */
   bool GetFullScreen() override;
 
+  /**
+   * @copydoc Dali::Internal::Adaptor::WindowBase::SetFrontBufferRendering()
+   */
+  void SetFrontBufferRendering(bool enable) override;
+
+  /**
+   * @copydoc Dali::Internal::Adaptor::WindowBase::GetFrontBufferRendering()
+   */
+  bool GetFrontBufferRendering() override;
+
+  /**
+   * @brief Sets front buffer rendering to the egl window.
+   * @param[in] enable True to enable front buffer rendering mode, False to otherwise.
+   */
+  void SetEglWindowFrontBufferMode(bool enable) override;
+
 private:
   // Undefined
   WindowBaseCocoa(const WindowBaseCocoa&) = delete;
index 374698d..f7ee40c 100644 (file)
@@ -772,6 +772,19 @@ bool WindowBaseCocoa::GetFullScreen()
   return false;
 }
 
+void WindowBaseCocoa::SetFrontBufferRendering(bool enable)
+{
+}
+
+bool WindowBaseCocoa::GetFrontBufferRendering()
+{
+  return false;
+}
+
+void WindowBaseCocoa::SetEglWindowFrontBufferMode(bool enable)
+{
+}
+
 } // namespace Dali::Internal::Adaptor
 
 @implementation CocoaView
index fb8bf7f..1d7ae2b 100644 (file)
@@ -2181,6 +2181,19 @@ void WindowBaseEcoreWl::ExcludeInputRegion(const Rect<int>& inputRegion)
 {
 }
 
+void WindowBaseEcoreWl::SetFrontBufferRendering(bool enable)
+{
+}
+
+bool WindowBaseEcoreWl::GetFrontBufferRendering()
+{
+  return false;
+}
+
+void WindowBaseEcoreWl::SetEglWindowFrontBufferMode(bool enable)
+{
+}
+
 } // namespace Adaptor
 
 } // namespace Internal
index 08bfd90..fe84ebf 100644 (file)
@@ -559,6 +559,21 @@ public:
    */
   bool GetFullScreen() override;
 
+  /**
+   * @copydoc Dali::Internal::Adaptor::WindowBase::SetFrontBufferRendering()
+   */
+  void SetFrontBufferRendering(bool enable) override;
+
+  /**
+   * @copydoc Dali::Internal::Adaptor::WindowBase::GetFrontBufferRendering()
+   */
+  bool GetFrontBufferRendering() override;
+
+  /**
+   * @copydoc Dali::Internal::Adaptor::WindowBase::SetEglWindowFrontBufferMode()
+   */
+  void SetEglWindowFrontBufferMode(bool enable) override;
+
 private:
   /**
    * Second stage initialization
index ae2a5db..bf6d748 100644 (file)
@@ -921,6 +921,7 @@ WindowBaseEcoreWl2::WindowBaseEcoreWl2(Dali::PositionSize positionSize, Any surf
   mVisible(true),
   mOwnSurface(false),
   mBrightnessChangeDone(true),
+  mIsFrontBufferRendering(false),
   mIsIMEWindowInitialized(false)
 {
   Initialize(positionSize, surface, isTransparent);
@@ -3555,6 +3556,21 @@ bool WindowBaseEcoreWl2::GetFullScreen()
   return ecore_wl2_window_fullscreen_get(mEcoreWindow);
 }
 
+void WindowBaseEcoreWl2::SetFrontBufferRendering(bool enable)
+{
+  mIsFrontBufferRendering = enable;
+}
+
+bool WindowBaseEcoreWl2::GetFrontBufferRendering()
+{
+  return mIsFrontBufferRendering;
+}
+
+void WindowBaseEcoreWl2::SetEglWindowFrontBufferMode(bool enable)
+{
+  wl_egl_window_tizen_set_frontbuffer_mode(mEglWindow, enable);
+}
+
 } // namespace Adaptor
 
 } // namespace Internal
index 3ff8d07..4ec38e0 100644 (file)
@@ -641,6 +641,21 @@ public:
    */
   bool GetFullScreen() override;
 
+  /**
+   * @copydoc Dali::Internal::Adaptor::WindowBase::SetFrontBufferRendering()
+   */
+  void SetFrontBufferRendering(bool enable) override;
+
+  /**
+   * @copydoc Dali::Internal::Adaptor::WindowBase::GetFrontBufferRendering()
+   */
+  bool GetFrontBufferRendering() override;
+
+  /**
+   * @copydoc Dali::Internal::Adaptor::WindowBase::SetEglWindowFrontBufferMode()
+   */
+  void SetEglWindowFrontBufferMode(bool enable) override;
+
 private:
   /**
    * Second stage initialization
@@ -728,6 +743,7 @@ private:
   bool mVisible : 1;
   bool mOwnSurface;
   bool mBrightnessChangeDone;
+  bool mIsFrontBufferRendering;
   bool mIsIMEWindowInitialized;
 };
 
index 4356914..fa085a4 100644 (file)
@@ -1066,6 +1066,19 @@ bool WindowBaseEcoreX::GetFullScreen()
   return false;
 }
 
+void WindowBaseEcoreX::SetFrontBufferRendering(bool enable)
+{
+}
+
+bool WindowBaseEcoreX::GetFrontBufferRendering()
+{
+  return false;
+}
+
+void WindowBaseEcoreX::SetEglWindowFrontBufferMode(bool enable)
+{
+}
+
 } // namespace Adaptor
 
 } // namespace Internal
index 0219289..f705111 100644 (file)
@@ -509,6 +509,21 @@ public:
    */
   bool GetFullScreen() override;
 
+  /**
+   * @copydoc Dali::Internal::Adaptor::WindowBase::SetFrontBufferRendering()
+   */
+  void SetFrontBufferRendering(bool enable) override;
+
+  /**
+   * @copydoc Dali::Internal::Adaptor::WindowBase::GetFrontBufferRendering()
+   */
+  bool GetFrontBufferRendering() override;
+
+  /**
+   * @copydoc Dali::Internal::Adaptor::WindowBase::SetEglWindowFrontBufferMode()
+   */
+  void SetEglWindowFrontBufferMode(bool enable) override;
+
 private:
   /**
    * Second stage initialization
index dead822..1c3e8bf 100644 (file)
@@ -701,6 +701,19 @@ bool WindowBaseWin::GetFullScreen()
   return false;
 }
 
+void WindowBaseWin::SetFrontBufferRendering(bool enable)
+{
+}
+
+bool WindowBaseWin::GetFrontBufferRendering()
+{
+  return false;
+}
+
+void WindowBaseWin::SetEglWindowFrontBufferMode(bool enable)
+{
+}
+
 } // namespace Adaptor
 
 } // namespace Internal
index ab5089f..d05f89c 100644 (file)
@@ -491,6 +491,21 @@ public:
    */
   bool GetFullScreen() override;
 
+  /**
+   * @copydoc Dali::Internal::Adaptor::WindowBase::SetFrontBufferRendering()
+   */
+  void SetFrontBufferRendering(bool enable) override;
+
+  /**
+   * @copydoc Dali::Internal::Adaptor::WindowBase::GetFrontBufferRendering()
+   */
+  bool GetFrontBufferRendering() override;
+
+  /**
+   * @copydoc Dali::Internal::Adaptor::WindowBase::SetEglWindowFrontBufferMode()
+   */
+  void SetEglWindowFrontBufferMode(bool enable) override;
+
 private:
   /**
    * Second stage initialization
index 3b44812..da92eff 100644 (file)
@@ -1002,6 +1002,19 @@ bool WindowBaseX::GetFullScreen()
   return false;
 }
 
+void WindowBaseX::SetFrontBufferRendering(bool enable)
+{
+}
+
+bool WindowBaseX::GetFrontBufferRendering()
+{
+  return false;
+}
+
+void WindowBaseX::SetEglWindowFrontBufferMode(bool enable)
+{
+}
+
 } // namespace Adaptor
 
 } // namespace Internal
index b7dc54c..867b7ad 100644 (file)
@@ -513,6 +513,21 @@ public:
    */
   bool GetFullScreen() override;
 
+  /**
+   * @copydoc Dali::Internal::Adaptor::WindowBase::SetFrontBufferRendering()
+   */
+  void SetFrontBufferRendering(bool enable) override;
+
+  /**
+   * @copydoc Dali::Internal::Adaptor::WindowBase::GetFrontBufferRendering()
+   */
+  bool GetFrontBufferRendering() override;
+
+  /**
+   * @copydoc Dali::Internal::Adaptor::WindowBase::SetEglWindowFrontBufferMode()
+   */
+  void SetEglWindowFrontBufferMode(bool enable) override;
+
 private:
   /**
    * Second stage initialization
index 5db7add..7ced481 100644 (file)
@@ -155,6 +155,9 @@ Application Application::New(int* argc, char** argv[], const std::string& styles
 
     // Store only the value before adaptor is created
     internal->StoreWindowPositionSize(windowData.GetPositionSize());
+
+    // Set front buffer rendering
+    internal->StoreFrontBufferRendering(windowData.GetFrontBufferRendering());
   }
   else
   {