DSRenderEngineDaliImpl: Make it to render only when RenderView updated. 28/241828/1
authorJoonbum Ko <joonbum.ko@samsung.com>
Fri, 14 Aug 2020 04:15:15 +0000 (13:15 +0900)
committerSung-Jin Park <sj76.park@samsung.com>
Thu, 20 Aug 2020 10:11:48 +0000 (19:11 +0900)
 - The ecore_evas renderer has a function to check if there is
  an updated evas object.
   Therefore, even if ecore_evas_manual_render is called each idle time,
  it does not actually render if nothing has been updated.
 - On the other hand, if DALi calls RenderOnce whenever idle time,
  there is an overhead of waking up the render thread
  even if there is nothing to draw.

 - Since the RenderEngine does not have a RenderView,
  it is difficult for the RenderEngine to know whether
  the RenderView has been updated.
   Therefore, DSRenderEngineDaliImpl inherits DSObject,
  and it is modified to register BufferChanged callback
  in DSWindow received at the time of makeRenderView call.

 - When BufferChanged callback is called,
  private member __needToRender is made true.
 - Even if renderFrame is called, RenderOnce is called only
  when __needToRender is true,
  and __needToRender is changed to false immediately after that.

 - This modification can be revised back
  if it is possible to change to a better structure.

Change-Id: I5717abee1bd4819abf9629892ccb8843a4f6a209
Signed-off-by: Joonbum Ko <joonbum.ko@samsung.com>
src/DSRender/DSRenderEngineDaliImpl.cpp
src/DSRender/DSRenderEngineDaliImpl.h

index bb415cc..a716b55 100644 (file)
@@ -35,7 +35,8 @@ namespace display_server
 {
 
 DSRenderEngineDaliImpl::DSRenderEngineDaliImpl(std::shared_ptr<IDSBufferQueue> bufferQueue)
-       : __bufferQueue(bufferQueue)
+       : __bufferQueue(bufferQueue),
+         __needToRender(false)
 {
        tbm_surface_queue_h nativeBufferQueue = (tbm_surface_queue_h)bufferQueue->getNativeBufferQueue();
        __offscreenApplication  = OffscreenApplication::New(nativeBufferQueue, true, OffscreenApplication::RenderMode::MANUAL);
@@ -59,14 +60,27 @@ std::shared_ptr<DSRenderView> DSRenderEngineDaliImpl::makeRenderView(std::shared
 {
        std::shared_ptr<DSRenderView> renderView = std::make_shared<DSRenderViewDaliImpl>(window, __offscreenApplication.GetWindow());
 
+       // callbacks
+       window->registerCallbackBufferChanged(this, std::bind(&DSRenderEngineDaliImpl::__onWindowUpdated, this, std::placeholders::_1));
+
        return renderView;
 }
 
 bool DSRenderEngineDaliImpl::renderFrame()
 {
-       Adaptor::Get().RenderOnce();
+       if (__needToRender)
+               Adaptor::Get().RenderOnce();
 
+       __needToRender = false;
        return true;
 }
 
+void DSRenderEngineDaliImpl::__onWindowUpdated(std::shared_ptr<IDSBuffer> buffer)
+{
+       if (!__needToRender) {
+               DSLOG_DBG("DSRenderEngineDaliImpl", "Something updated!! with buffer(%p)", buffer.get());
+               __needToRender = true;
+       }
+}
+
 } // namespace display_server
index 7c23148..d9244f7 100644 (file)
@@ -35,7 +35,7 @@
 namespace display_server
 {
 
-class DSRenderEngineDaliImpl : public IDSRenderEngine, public Dali::ConnectionTracker
+class DSRenderEngineDaliImpl : public IDSRenderEngine, public Dali::ConnectionTracker, public DSObject
 {
 public:
        DSRenderEngineDaliImpl(std::shared_ptr<IDSBufferQueue> bufferQueue);
@@ -47,8 +47,12 @@ public:
        void                             onInitialize();
 
 private:
+       void __onWindowUpdated(std::shared_ptr<IDSBuffer> buffer);
+
        std::shared_ptr<IDSBufferQueue> __bufferQueue;
        Dali::OffscreenApplication __offscreenApplication;
+
+       bool __needToRender;
 };
 
 }