Add front buffer rendering APIs in Dali::Window
[platform/core/uifw/dali-adaptor.git] / dali / internal / window-system / common / window-render-surface.cpp
index 1f9dcfc..0d6dbdb 100644 (file)
@@ -30,6 +30,7 @@
 #include <dali/internal/graphics/gles/egl-graphics.h>
 #include <dali/internal/graphics/gles/egl-implementation.h>
 #include <dali/internal/system/common/environment-variables.h>
+#include <dali/internal/system/common/system-factory.h>
 #include <dali/internal/window-system/common/window-base.h>
 #include <dali/internal/window-system/common/window-factory.h>
 #include <dali/internal/window-system/common/window-system.h>
@@ -175,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);
@@ -343,6 +346,11 @@ void WindowRenderSurface::CreateSurface()
   // Create the EGL window
   EGLNativeWindowType window = mWindowBase->CreateEglWindow(width, height);
 
+  if(mWindowBase->GetType() == WindowType::IME)
+  {
+    InitializeImeSurface();
+  }
+
   auto eglGraphics = static_cast<EglGraphics*>(mGraphics);
 
   Internal::Adaptor::EglImplementation& eglImpl = eglGraphics->GetEglImplementation();
@@ -546,7 +554,7 @@ bool WindowRenderSurface::PreRender(bool resizingSurface, const std::vector<Rect
     mPositionSize.width  = surfaceSize.width;
     mPositionSize.height = surfaceSize.height;
 
-    DALI_LOG_RELEASE_INFO("Window is resizing, (%d, %d), [%d x %d]\n", mPositionSize.x, mPositionSize.y, mPositionSize.width, mPositionSize.height);
+    DALI_LOG_RELEASE_INFO("Window is resizing, (%d, %d), [%d x %d], IMEWindow [%d]\n", mPositionSize.x, mPositionSize.y, mPositionSize.width, mPositionSize.height, mIsImeWindowSurface);
 
     // Window rotate or screen rotate
     if(mIsWindowOrientationChanging || isScreenOrientationChanging)
@@ -583,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)
@@ -705,11 +721,15 @@ Integration::StencilBufferAvailable WindowRenderSurface::GetStencilBufferRequire
 
 void WindowRenderSurface::InitializeImeSurface()
 {
-  mIsImeWindowSurface = true;
-  if(!mPostRenderTrigger)
+  if(!mIsImeWindowSurface)
   {
-    mPostRenderTrigger = std::unique_ptr<TriggerEventInterface>(TriggerEventFactory::CreateTriggerEvent(MakeCallback(this, &WindowRenderSurface::ProcessPostRender),
-                                                                                                        TriggerEventInterface::KEEP_ALIVE_AFTER_TRIGGER));
+    mIsImeWindowSurface = true;
+    if(!mPostRenderTrigger)
+    {
+      mPostRenderTrigger = std::unique_ptr<TriggerEventInterface>(TriggerEventFactory::CreateTriggerEvent(MakeCallback(this, &WindowRenderSurface::ProcessPostRender),
+                                                                                                          TriggerEventInterface::KEEP_ALIVE_AFTER_TRIGGER));
+
+    }
   }
 }
 
@@ -763,9 +783,7 @@ void WindowRenderSurface::ProcessFrameCallback()
   {
     if(!iter->fileDescriptorMonitor)
     {
-      iter->fileDescriptorMonitor = std::unique_ptr<FileDescriptorMonitor>(new FileDescriptorMonitor(iter->fileDescriptor,
-                                                                                                     MakeCallback(this, &WindowRenderSurface::OnFileDescriptorEventDispatched),
-                                                                                                     FileDescriptorMonitor::FD_READABLE));
+      iter->fileDescriptorMonitor = Dali::Internal::Adaptor::GetSystemFactory()->CreateFileDescriptorMonitor(iter->fileDescriptor, MakeCallback(this, &WindowRenderSurface::OnFileDescriptorEventDispatched), FileDescriptorMonitor::FD_READABLE);
 
       DALI_LOG_RELEASE_INFO("WindowRenderSurface::ProcessFrameCallback: Add handler [%d]\n", iter->fileDescriptor);
     }
@@ -936,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