X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali%2Finternal%2Fcommon%2Fcore-impl.cpp;h=e9da29683611c5aefe1d3212bf908739ac9a7649;hb=dfb57447dbb1cece7f1cd4c9cb93cac6a7895713;hp=9a5c89e4914598f894c9b522573158a479728354;hpb=fd2f99d83dc86de5e4e76fe1a1d0f97a008037f5;p=platform%2Fcore%2Fuifw%2Fdali-core.git diff --git a/dali/internal/common/core-impl.cpp b/dali/internal/common/core-impl.cpp index 9a5c89e..e9da296 100644 --- a/dali/internal/common/core-impl.cpp +++ b/dali/internal/common/core-impl.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022 Samsung Electronics Co., Ltd. + * Copyright (c) 2023 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -50,7 +50,6 @@ #include #include -using Dali::Internal::SceneGraph::DiscardQueue; using Dali::Internal::SceneGraph::RenderManager; using Dali::Internal::SceneGraph::RenderQueue; using Dali::Internal::SceneGraph::UpdateManager; @@ -90,9 +89,9 @@ Core::Core(RenderController& renderController, mPlatform(platform), mGraphicsController(graphicsController), mProcessingEvent(false), - mForceNextUpdate(false), mProcessorUnregistered(false), - mPostProcessorUnregistered(false) + mPostProcessorUnregistered(false), + mRelayoutFlush(false) { // Create the thread local storage CreateThreadLocalStorage(); @@ -112,12 +111,9 @@ Core::Core(RenderController& renderController, RenderQueue& renderQueue = mRenderManager->GetRenderQueue(); - mDiscardQueue = new DiscardQueue(renderQueue); - mUpdateManager = new UpdateManager(*mNotificationManager, *mAnimationPlaylist, *mPropertyNotificationManager, - *mDiscardQueue, renderController, *mRenderManager, renderQueue, @@ -138,6 +134,10 @@ Core::Core(RenderController& renderController, mUpdateManager->SetShaderSaver(*mShaderFactory); GetImplementation(Dali::TypeRegistry::Get()).CallInitFunctions(); + + DALI_LOG_RELEASE_INFO("Node size: %lu\n", sizeof(Dali::Internal::SceneGraph::Node)); + DALI_LOG_RELEASE_INFO("Renderer size: %lu\n", sizeof(Dali::Internal::SceneGraph::Renderer)); + DALI_LOG_RELEASE_INFO("RenderItem size: %lu\n", sizeof(Dali::Internal::SceneGraph::RenderItem)); } Core::~Core() @@ -259,13 +259,28 @@ void Core::QueueEvent(const Integration::Event& event) } } +void Core::ForceRelayout() +{ + if(mRelayoutFlush) + { + DALI_LOG_ERROR("ForceRelayout should not be called from within RelayoutAndFlush!\n"); + return; + } + + // Scene could be added or removed while processing the events + // Copy the Scene container locally to avoid possibly invalid iterator + SceneContainer scenes = mScenes; + + RelayoutAndFlush(scenes); +} + void Core::ProcessEvents() { // Guard against calls to ProcessEvents() during ProcessEvents() if(mProcessingEvent) { DALI_LOG_ERROR("ProcessEvents should not be called from within ProcessEvents!\n"); - mRenderController.RequestProcessEventsOnIdle(false); + mRenderController.RequestProcessEventsOnIdle(); return; } @@ -293,6 +308,47 @@ void Core::ProcessEvents() scene->EmitEventProcessingFinishedSignal(); } + RelayoutAndFlush(scenes); + + mUpdateManager->EventProcessingFinished(); + + // Check if the touch or gestures require updates. + const bool gestureNeedsUpdate = mGestureEventProcessor->NeedsUpdate(); + + if(gestureNeedsUpdate) + { + // tell the render controller to keep update thread running + mRenderController.RequestUpdate(); + } + + mRelayoutController->SetProcessingCoreEvents(false); + + // ProcessEvents() may now be called again + mProcessingEvent = false; +} + +void Core::RelayoutAndFlush(SceneContainer& scenes) +{ + if(mRelayoutFlush) + { + DALI_LOG_ERROR("RelayoutAndFlush should not be called from within RelayoutAndFlush!\n"); + return; + } + + const bool isProcessEvents = mProcessingEvent; + + if(!isProcessEvents) + { + // Fake that we are in ProcessEvents() + mProcessingEvent = true; + mRelayoutController->SetProcessingCoreEvents(true); + + // Signal that any messages received will be flushed soon + mUpdateManager->EventProcessingStarted(); + } + + mRelayoutFlush = true; + // Run any registered processors RunProcessors(); @@ -303,7 +359,7 @@ void Core::ProcessEvents() RunPostProcessors(); // Rebuild depth tree after event processing has finished - for(auto scene : scenes) + for(auto& scene : scenes) { scene->RebuildDepthTree(); } @@ -311,21 +367,22 @@ void Core::ProcessEvents() // Flush any queued messages for the update-thread const bool messagesToProcess = mUpdateManager->FlushQueue(); - // Check if the touch or gestures require updates. - const bool gestureNeedsUpdate = mGestureEventProcessor->NeedsUpdate(); - // Check if the next update is forced. - const bool forceUpdate = IsNextUpdateForced(); - - if(messagesToProcess || gestureNeedsUpdate || forceUpdate) + if(messagesToProcess) { // tell the render controller to keep update thread running - mRenderController.RequestUpdate(forceUpdate); + mRenderController.RequestUpdate(); } - mRelayoutController->SetProcessingCoreEvents(false); + mRelayoutFlush = false; - // ProcessEvents() may now be called again - mProcessingEvent = false; + if(!isProcessEvents) + { + // Revert fake informations + mProcessingEvent = false; + mRelayoutController->SetProcessingCoreEvents(false); + + mUpdateManager->EventProcessingFinished(); + } } uint32_t Core::GetMaximumUpdateCount() const @@ -371,7 +428,14 @@ void Core::RunProcessors() { if(mProcessors.Count() != 0) { - DALI_TRACE_BEGIN(gTraceFilter, "DALI_CORE_RUN_PROCESSORS"); +#ifdef TRACE_ENABLED + if(gTraceFilter && gTraceFilter->IsTraceEnabled()) + { + std::ostringstream stream; + stream << "[" << mProcessors.Count() << "]"; + DALI_TRACE_BEGIN_WITH_MESSAGE(gTraceFilter, "DALI_CORE_RUN_PROCESSORS", stream.str().c_str()); + } +#endif // Copy processor pointers to prevent changes to vector affecting loop iterator. Dali::Vector processors(mProcessors); @@ -399,7 +463,19 @@ void Core::RunProcessors() } } } - DALI_TRACE_END(gTraceFilter, "DALI_CORE_RUN_PROCESSORS"); +#ifdef TRACE_ENABLED + if(gTraceFilter && gTraceFilter->IsTraceEnabled()) + { + std::ostringstream stream; + stream << "[" << mProcessors.Count(); + if(mProcessorUnregistered) + { + stream << ", processor changed"; + } + stream << "]"; + DALI_TRACE_END_WITH_MESSAGE(gTraceFilter, "DALI_CORE_RUN_PROCESSORS", stream.str().c_str()); + } +#endif } } @@ -407,7 +483,14 @@ void Core::RunPostProcessors() { if(mPostProcessors.Count() != 0) { - DALI_TRACE_BEGIN(gTraceFilter, "DALI_CORE_RUN_POST_PROCESSORS"); +#ifdef TRACE_ENABLED + if(gTraceFilter && gTraceFilter->IsTraceEnabled()) + { + std::ostringstream stream; + stream << "[" << mPostProcessors.Count() << "]"; + DALI_TRACE_BEGIN_WITH_MESSAGE(gTraceFilter, "DALI_CORE_RUN_POST_PROCESSORS", stream.str().c_str()); + } +#endif // Copy processor pointers to prevent changes to vector affecting loop iterator. Dali::Vector processors(mPostProcessors); @@ -435,7 +518,20 @@ void Core::RunPostProcessors() } } } - DALI_TRACE_END(gTraceFilter, "DALI_CORE_RUN_POST_PROCESSORS"); + +#ifdef TRACE_ENABLED + if(gTraceFilter && gTraceFilter->IsTraceEnabled()) + { + std::ostringstream stream; + stream << "[" << mPostProcessors.Count(); + if(mPostProcessorUnregistered) + { + stream << ", post processor changed"; + } + stream << "]"; + DALI_TRACE_END_WITH_MESSAGE(gTraceFilter, "DALI_CORE_RUN_POST_PROCESSORS", stream.str().c_str()); + } +#endif } } @@ -484,6 +580,47 @@ ObjectRegistry& Core::GetObjectRegistry() const return *(mObjectRegistry.Get()); } +void Core::LogMemoryPools() const +{ + uint32_t animationPoolCapacity = SceneGraph::Animation::GetMemoryPoolCapacity(); + uint32_t renderItemPoolCapacity = SceneGraph::RenderItem::GetMemoryPoolCapacity(); + uint32_t relayoutItemPoolCapacity = mRelayoutController->GetMemoryPoolCapacity(); + uint32_t rendererPoolCapacity = SceneGraph::Renderer::GetMemoryPoolCapacity(); + uint32_t textureSetPoolCapacity = SceneGraph::TextureSet::GetMemoryPoolCapacity(); + uint32_t renderTaskPoolCapacity = SceneGraph::RenderTaskList::GetMemoryPoolCapacity(); + uint32_t nodePoolCapacity = SceneGraph::Node::GetMemoryPoolCapacity(); + + DALI_LOG_RELEASE_INFO( + "\nMemory Pool capacities:\n" + " Animations: %lu\n" + " RenderItems: %lu\n" + " RelayoutItems: %lu\n" + " Renderers: %lu\n" + " TextureSets: %lu\n" + " RenderTasks: %lu\n" + " Nodes: %lu\n", + animationPoolCapacity, + renderItemPoolCapacity, + relayoutItemPoolCapacity, + rendererPoolCapacity, + textureSetPoolCapacity, + renderTaskPoolCapacity, + nodePoolCapacity); + + uint32_t updateQCapacity = mUpdateManager->GetUpdateMessageQueueCapacity(); + uint32_t renderQCapacity = mUpdateManager->GetRenderMessageQueueCapacity(); + + DALI_LOG_RELEASE_INFO( + "\nMessage Queue capacities:\n" + " UpdateQueue: %lu\n" + " RenderQueue: %lu\n", + updateQCapacity, + renderQCapacity); + + size_t renderInstructionCapacity = mUpdateManager->GetRenderInstructionCapacity(); + DALI_LOG_RELEASE_INFO("\nRenderInstruction capacity: %lu\n", renderInstructionCapacity); +} + EventThreadServices& Core::GetEventThreadServices() { return *this; @@ -553,18 +690,6 @@ BufferIndex Core::GetEventBufferIndex() const return mUpdateManager->GetEventBufferIndex(); } -void Core::ForceNextUpdate() -{ - mForceNextUpdate = true; -} - -bool Core::IsNextUpdateForced() -{ - bool nextUpdateForced = mForceNextUpdate; - mForceNextUpdate = false; - return nextUpdateForced; -} - } // namespace Internal } // namespace Dali