From: Joonbum Ko Date: Fri, 14 Aug 2020 04:15:15 +0000 (+0900) Subject: DSRenderEngineDaliImpl: Make it to render only when RenderView updated. X-Git-Tag: accepted/tizen/unified/20200820.213435~47 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=623fa9e89d071a1b2048b44e2af34fd91ac0f11a;p=platform%2Fcore%2Fuifw%2Flibds.git DSRenderEngineDaliImpl: Make it to render only when RenderView updated. - 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 --- diff --git a/src/DSRender/DSRenderEngineDaliImpl.cpp b/src/DSRender/DSRenderEngineDaliImpl.cpp index bb415cc..a716b55 100644 --- a/src/DSRender/DSRenderEngineDaliImpl.cpp +++ b/src/DSRender/DSRenderEngineDaliImpl.cpp @@ -35,7 +35,8 @@ namespace display_server { DSRenderEngineDaliImpl::DSRenderEngineDaliImpl(std::shared_ptr 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 DSRenderEngineDaliImpl::makeRenderView(std::shared { std::shared_ptr renderView = std::make_shared(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 buffer) +{ + if (!__needToRender) { + DSLOG_DBG("DSRenderEngineDaliImpl", "Something updated!! with buffer(%p)", buffer.get()); + __needToRender = true; + } +} + } // namespace display_server diff --git a/src/DSRender/DSRenderEngineDaliImpl.h b/src/DSRender/DSRenderEngineDaliImpl.h index 7c23148..d9244f7 100644 --- a/src/DSRender/DSRenderEngineDaliImpl.h +++ b/src/DSRender/DSRenderEngineDaliImpl.h @@ -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 bufferQueue); @@ -47,8 +47,12 @@ public: void onInitialize(); private: + void __onWindowUpdated(std::shared_ptr buffer); + std::shared_ptr __bufferQueue; Dali::OffscreenApplication __offscreenApplication; + + bool __needToRender; }; }