2 * Copyright (c) 2020 Samsung Electronics Co., Ltd.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
19 #include <dali/internal/adaptor/common/adaptor-impl.h>
20 #include <dali/internal/adaptor/common/adaptor-builder-impl.h>
23 #include <dali/public-api/common/stage.h>
24 #include <dali/public-api/actors/layer.h>
25 #include <dali/public-api/object/any.h>
26 #include <dali/devel-api/actors/actor-devel.h>
27 #include <dali/integration-api/debug.h>
28 #include <dali/integration-api/core.h>
29 #include <dali/integration-api/context-notifier.h>
30 #include <dali/integration-api/profiling.h>
31 #include <dali/integration-api/input-options.h>
32 #include <dali/integration-api/events/key-event-integ.h>
33 #include <dali/integration-api/events/touch-event-integ.h>
34 #include <dali/integration-api/events/wheel-event-integ.h>
35 #include <dali/integration-api/processor-interface.h>
38 #include <dali/public-api/dali-adaptor-common.h>
39 #include <dali/internal/system/common/thread-controller.h>
40 #include <dali/internal/system/common/performance-interface-factory.h>
41 #include <dali/internal/adaptor/common/lifecycle-observer.h>
42 #include <dali/internal/adaptor/common/thread-controller-interface.h>
44 #include <dali/internal/graphics/gles/egl-graphics-factory.h>
45 #include <dali/internal/graphics/gles/egl-graphics.h> // Temporary until Core is abstracted
47 #include <dali/devel-api/text-abstraction/font-client.h>
49 #include <dali/internal/system/common/callback-manager.h>
50 #include <dali/internal/accessibility/common/tts-player-impl.h>
51 #include <dali/internal/accessibility/common/accessibility-adaptor-impl.h>
52 #include <dali/internal/window-system/common/event-handler.h>
53 #include <dali/internal/graphics/gles/gl-proxy-implementation.h>
54 #include <dali/internal/graphics/gles/gl-implementation.h>
55 #include <dali/internal/graphics/gles/egl-sync-implementation.h>
56 #include <dali/internal/graphics/common/egl-image-extensions.h>
57 #include <dali/internal/clipboard/common/clipboard-impl.h>
58 #include <dali/internal/system/common/object-profiler.h>
59 #include <dali/internal/window-system/common/display-connection.h>
60 #include <dali/internal/window-system/common/display-utils.h> // For Utils::MakeUnique
61 #include <dali/internal/window-system/common/window-impl.h>
62 #include <dali/internal/window-system/common/window-render-surface.h>
64 #include <dali/internal/system/common/logging.h>
66 #include <dali/internal/system/common/locale-utils.h>
67 #include <dali/internal/imaging/common/image-loader-plugin-proxy.h>
68 #include <dali/internal/imaging/common/image-loader.h>
70 #include <dali/internal/system/common/configuration-manager.h>
71 #include <dali/internal/system/common/environment-variables.h>
73 using Dali::TextAbstraction::FontClient;
75 extern std::string GetSystemCachePath();
89 thread_local Adaptor* gThreadLocalAdaptor = NULL; // raw thread specific pointer to allow Adaptor::Get
91 } // unnamed namespace
93 Dali::Adaptor* Adaptor::New( Dali::Integration::SceneHolder window, Dali::RenderSurfaceInterface *surface, Dali::Configuration::ContextLoss configuration, EnvironmentOptions* environmentOptions )
95 Dali::Adaptor* adaptor = new Dali::Adaptor;
96 Adaptor* impl = new Adaptor( window, *adaptor, surface, environmentOptions );
97 adaptor->mImpl = impl;
99 Dali::Internal::Adaptor::AdaptorBuilder* mAdaptorBuilder = new AdaptorBuilder();
100 auto graphicsFactory = mAdaptorBuilder->GetGraphicsFactory();
102 impl->Initialize( graphicsFactory, configuration );
103 delete mAdaptorBuilder; // Not needed anymore as the graphics interface has now been created
108 Dali::Adaptor* Adaptor::New( Dali::Integration::SceneHolder window, Dali::Configuration::ContextLoss configuration, EnvironmentOptions* environmentOptions )
110 Internal::Adaptor::SceneHolder& windowImpl = Dali::GetImplementation( window );
111 Dali::Adaptor* adaptor = New( window, windowImpl.GetSurface(), configuration, environmentOptions );
112 windowImpl.SetAdaptor( *adaptor );
116 Dali::Adaptor* Adaptor::New( GraphicsFactory& graphicsFactory, Dali::Integration::SceneHolder window, Dali::RenderSurfaceInterface *surface, Dali::Configuration::ContextLoss configuration, EnvironmentOptions* environmentOptions )
118 Dali::Adaptor* adaptor = new Dali::Adaptor; // Public adaptor
119 Adaptor* impl = new Adaptor( window, *adaptor, surface, environmentOptions ); // Impl adaptor
120 adaptor->mImpl = impl;
122 impl->Initialize( graphicsFactory, configuration );
127 Dali::Adaptor* Adaptor::New( GraphicsFactory& graphicsFactory, Dali::Integration::SceneHolder window, Dali::Configuration::ContextLoss configuration, EnvironmentOptions* environmentOptions )
129 Internal::Adaptor::SceneHolder& windowImpl = Dali::GetImplementation( window );
130 Dali::Adaptor* adaptor = New( graphicsFactory, window, windowImpl.GetSurface(), configuration, environmentOptions );
131 windowImpl.SetAdaptor( *adaptor );
135 void Adaptor::Initialize( GraphicsFactory& graphicsFactory, Dali::Configuration::ContextLoss configuration )
137 // all threads here (event, update, and render) will send their logs to TIZEN Platform's LogMessage handler.
138 Dali::Integration::Log::LogFunction logFunction( Dali::TizenPlatform::LogMessage );
139 mEnvironmentOptions->SetLogFunction( logFunction );
140 mEnvironmentOptions->InstallLogFunction(); // install logging for main thread
142 mPlatformAbstraction = new TizenPlatform::TizenPlatformAbstraction;
145 GetDataStoragePath( path );
146 mPlatformAbstraction->SetDataStoragePath( path );
148 ResourcePolicy::DataRetention dataRetentionPolicy = ResourcePolicy::DALI_DISCARDS_ALL_DATA;
149 if( configuration == Dali::Configuration::APPLICATION_DOES_NOT_HANDLE_CONTEXT_LOSS )
151 dataRetentionPolicy = ResourcePolicy::DALI_DISCARDS_ALL_DATA;
154 // Note, Tizen does not use DALI_RETAINS_ALL_DATA, as it can reload images from files automatically.
156 if( mEnvironmentOptions->PerformanceServerRequired() )
158 mPerformanceInterface = PerformanceInterfaceFactory::CreateInterface( *this, *mEnvironmentOptions );
161 mEnvironmentOptions->CreateTraceManager( mPerformanceInterface );
162 mEnvironmentOptions->InstallTraceFunction(); // install tracing for main thread
164 mCallbackManager = CallbackManager::New();
166 Dali::Internal::Adaptor::SceneHolder* defaultWindow = mWindows.front();
168 DALI_ASSERT_DEBUG( defaultWindow->GetSurface() && "Surface not initialized" );
170 mGraphics = &( graphicsFactory.Create() );
171 mGraphics->Initialize( mEnvironmentOptions );
173 auto eglGraphics = static_cast<EglGraphics *>( mGraphics ); // This interface is temporary until Core has been updated to match
175 // This will only be created once
176 eglGraphics->Create();
178 GlImplementation& mGLES = eglGraphics->GetGlesInterface();
179 EglSyncImplementation& eglSyncImpl = eglGraphics->GetSyncImplementation();
180 EglContextHelperImplementation& eglContextHelperImpl = eglGraphics->GetContextHelperImplementation();
182 mCore = Integration::Core::New( *this,
183 *mPlatformAbstraction,
186 eglContextHelperImpl,
187 dataRetentionPolicy ,
188 ( 0u != mEnvironmentOptions->GetRenderToFboInterval() ) ? Integration::RenderToFrameBuffer::TRUE : Integration::RenderToFrameBuffer::FALSE,
189 mGraphics->GetDepthBufferRequired(),
190 mGraphics->GetStencilBufferRequired() );
192 defaultWindow->SetAdaptor( Get() );
194 Dali::Integration::SceneHolder defaultSceneHolder( defaultWindow );
196 mWindowCreatedSignal.Emit( defaultSceneHolder );
198 const unsigned int timeInterval = mEnvironmentOptions->GetObjectProfilerInterval();
199 if( 0u < timeInterval )
201 mObjectProfiler = new ObjectProfiler( timeInterval );
204 mNotificationTrigger = mTriggerEventFactory.CreateTriggerEvent( MakeCallback( this, &Adaptor::ProcessCoreEvents ), TriggerEventInterface::KEEP_ALIVE_AFTER_TRIGGER);
206 mDisplayConnection = Dali::DisplayConnection::New( *mGraphics, defaultWindow->GetSurface()->GetSurfaceType() );
208 mThreadController = new ThreadController( *this, *mEnvironmentOptions );
210 // Should be called after Core creation
211 if( mEnvironmentOptions->GetPanGestureLoggingLevel() )
213 Integration::EnableProfiling( Dali::Integration::PROFILING_TYPE_PAN_GESTURE );
215 if( mEnvironmentOptions->GetPanGesturePredictionMode() >= 0 )
217 Integration::SetPanGesturePredictionMode(mEnvironmentOptions->GetPanGesturePredictionMode());
219 if( mEnvironmentOptions->GetPanGesturePredictionAmount() >= 0 )
221 Integration::SetPanGesturePredictionAmount(mEnvironmentOptions->GetPanGesturePredictionAmount());
223 if( mEnvironmentOptions->GetPanGestureMaximumPredictionAmount() >= 0 )
225 Integration::SetPanGestureMaximumPredictionAmount(mEnvironmentOptions->GetPanGestureMaximumPredictionAmount());
227 if( mEnvironmentOptions->GetPanGestureMinimumPredictionAmount() >= 0 )
229 Integration::SetPanGestureMinimumPredictionAmount(mEnvironmentOptions->GetPanGestureMinimumPredictionAmount());
231 if( mEnvironmentOptions->GetPanGesturePredictionAmountAdjustment() >= 0 )
233 Integration::SetPanGesturePredictionAmountAdjustment(mEnvironmentOptions->GetPanGesturePredictionAmountAdjustment());
235 if( mEnvironmentOptions->GetPanGestureSmoothingMode() >= 0 )
237 Integration::SetPanGestureSmoothingMode(mEnvironmentOptions->GetPanGestureSmoothingMode());
239 if( mEnvironmentOptions->GetPanGestureSmoothingAmount() >= 0.0f )
241 Integration::SetPanGestureSmoothingAmount(mEnvironmentOptions->GetPanGestureSmoothingAmount());
243 if( mEnvironmentOptions->GetPanGestureUseActualTimes() >= 0 )
245 Integration::SetPanGestureUseActualTimes( mEnvironmentOptions->GetPanGestureUseActualTimes() == 0 ? true : false );
247 if( mEnvironmentOptions->GetPanGestureInterpolationTimeRange() >= 0 )
249 Integration::SetPanGestureInterpolationTimeRange( mEnvironmentOptions->GetPanGestureInterpolationTimeRange() );
251 if( mEnvironmentOptions->GetPanGestureScalarOnlyPredictionEnabled() >= 0 )
253 Integration::SetPanGestureScalarOnlyPredictionEnabled( mEnvironmentOptions->GetPanGestureScalarOnlyPredictionEnabled() == 0 ? true : false );
255 if( mEnvironmentOptions->GetPanGestureTwoPointPredictionEnabled() >= 0 )
257 Integration::SetPanGestureTwoPointPredictionEnabled( mEnvironmentOptions->GetPanGestureTwoPointPredictionEnabled() == 0 ? true : false );
259 if( mEnvironmentOptions->GetPanGestureTwoPointInterpolatePastTime() >= 0 )
261 Integration::SetPanGestureTwoPointInterpolatePastTime( mEnvironmentOptions->GetPanGestureTwoPointInterpolatePastTime() );
263 if( mEnvironmentOptions->GetPanGestureTwoPointVelocityBias() >= 0.0f )
265 Integration::SetPanGestureTwoPointVelocityBias( mEnvironmentOptions->GetPanGestureTwoPointVelocityBias() );
267 if( mEnvironmentOptions->GetPanGestureTwoPointAccelerationBias() >= 0.0f )
269 Integration::SetPanGestureTwoPointAccelerationBias( mEnvironmentOptions->GetPanGestureTwoPointAccelerationBias() );
271 if( mEnvironmentOptions->GetPanGestureMultitapSmoothingRange() >= 0 )
273 Integration::SetPanGestureMultitapSmoothingRange( mEnvironmentOptions->GetPanGestureMultitapSmoothingRange() );
275 if( mEnvironmentOptions->GetMinimumPanDistance() >= 0 )
277 Integration::SetPanGestureMinimumDistance( mEnvironmentOptions->GetMinimumPanDistance() );
279 if( mEnvironmentOptions->GetMinimumPanEvents() >= 0 )
281 Integration::SetPanGestureMinimumPanEvents( mEnvironmentOptions->GetMinimumPanEvents() );
283 if( mEnvironmentOptions->GetMinimumPinchDistance() >= 0 )
285 Integration::SetPinchGestureMinimumDistance( mEnvironmentOptions->GetMinimumPinchDistance() );
287 if( mEnvironmentOptions->GetLongPressMinimumHoldingTime() >= 0 )
289 Integration::SetLongPressMinimumHoldingTime( mEnvironmentOptions->GetLongPressMinimumHoldingTime() );
292 std::string systemCachePath = GetSystemCachePath();
293 if( ! systemCachePath.empty() )
295 const int dir_err = system( std::string( "mkdir " + systemCachePath ).c_str() );
298 printf( "Error creating system cache directory: %s!\n", systemCachePath.c_str() );
303 mConfigurationManager = Utils::MakeUnique<ConfigurationManager>( systemCachePath, eglGraphics, mThreadController );
308 // Ensure stop status
311 // set to NULL first as we do not want any access to Adaptor as it is being destroyed.
312 gThreadLocalAdaptor = NULL;
314 for ( ObserverContainer::iterator iter = mObservers.begin(), endIter = mObservers.end(); iter != endIter; ++iter )
316 (*iter)->OnDestroy();
319 // Clear out all the handles to Windows
322 delete mThreadController; // this will shutdown render thread, which will call Core::ContextDestroyed before exit
323 delete mObjectProfiler;
327 delete mDisplayConnection;
328 delete mPlatformAbstraction;
329 delete mCallbackManager;
330 delete mPerformanceInterface;
332 mGraphics->Destroy();
334 // uninstall it on this thread (main actor thread)
335 Dali::Integration::Log::UninstallLogFunction();
337 // Delete environment options if we own it
338 if( mEnvironmentOptionsOwned )
340 delete mEnvironmentOptions;
344 void Adaptor::Start()
346 // It doesn't support restart after stop at this moment to support restarting, need more testing
347 if( READY != mState )
354 SetupSystemInformation();
356 // Start the callback manager
357 mCallbackManager->Start();
359 Dali::Internal::Adaptor::SceneHolder* defaultWindow = mWindows.front();
361 unsigned int dpiHor, dpiVer;
364 defaultWindow->GetSurface()->GetDpi( dpiHor, dpiVer );
366 // set the DPI value for font rendering
367 FontClient fontClient = FontClient::Get();
368 fontClient.SetDpi( dpiHor, dpiVer );
370 // Initialize the thread controller
371 mThreadController->Initialize();
373 // Set max texture size
374 if( mEnvironmentOptions->GetMaxTextureSize() > 0 )
376 Dali::TizenPlatform::ImageLoader::SetMaxTextureSize( mEnvironmentOptions->GetMaxTextureSize() );
380 unsigned int maxTextureSize = mConfigurationManager->GetMaxTextureSize();
381 setenv( DALI_ENV_MAX_TEXTURE_SIZE, std::to_string( maxTextureSize ).c_str(), 1 );
382 Dali::TizenPlatform::ImageLoader::SetMaxTextureSize( maxTextureSize );
385 ProcessCoreEvents(); // Ensure any startup messages are processed.
387 // Initialize the image loader plugin
388 Internal::Adaptor::ImageLoaderPluginProxy::Initialize();
390 for ( ObserverContainer::iterator iter = mObservers.begin(), endIter = mObservers.end(); iter != endIter; ++iter )
396 // Dali::Internal::Adaptor::Adaptor::Pause
397 void Adaptor::Pause()
399 // Only pause the adaptor if we're actually running.
400 if( RUNNING == mState )
402 // Inform observers that we are about to be paused.
403 for( ObserverContainer::iterator iter = mObservers.begin(), endIter = mObservers.end(); iter != endIter; ++iter )
408 // Pause all windows event handlers when adaptor paused
409 for( auto window : mWindows )
414 mThreadController->Pause();
417 // Ensure any messages queued during pause callbacks are processed by doing another update.
420 DALI_LOG_RELEASE_INFO( "Adaptor::Pause: Paused\n" );
424 DALI_LOG_RELEASE_INFO( "Adaptor::Pause: Not paused [%d]\n", mState );
428 // Dali::Internal::Adaptor::Adaptor::Resume
429 void Adaptor::Resume()
431 // Only resume the adaptor if we are in the suspended state.
432 if( PAUSED == mState )
436 // Reset the event handlers when adaptor resumed
437 for( auto window : mWindows )
442 // Inform observers that we have resumed.
443 for( ObserverContainer::iterator iter = mObservers.begin(), endIter = mObservers.end(); iter != endIter; ++iter )
448 // Trigger processing of events queued up while paused
449 mCore->ProcessEvents();
451 // Do at end to ensure our first update/render after resumption includes the processed messages as well
452 mThreadController->Resume();
454 DALI_LOG_RELEASE_INFO( "Adaptor::Resume: Resumed\n");
458 DALI_LOG_RELEASE_INFO( "Adaptor::Resume: Not resumed [%d]\n", mState );
464 if( RUNNING == mState ||
466 PAUSED_WHILE_HIDDEN == mState )
468 for( ObserverContainer::iterator iter = mObservers.begin(), endIter = mObservers.end(); iter != endIter; ++iter )
473 mThreadController->Stop();
475 // Delete the TTS player
476 for( int i =0; i < Dali::TtsPlayer::MODE_NUM; i++ )
480 mTtsPlayers[i].Reset();
484 // Destroy the image loader plugin
485 Internal::Adaptor::ImageLoaderPluginProxy::Destroy();
487 delete mNotificationTrigger;
488 mNotificationTrigger = NULL;
490 mCallbackManager->Stop();
494 DALI_LOG_RELEASE_INFO( "Adaptor::Stop\n" );
498 void Adaptor::ContextLost()
500 mCore->GetContextNotifier()->NotifyContextLost(); // Inform stage
503 void Adaptor::ContextRegained()
505 // Inform core, so that texture resources can be reloaded
506 mCore->RecoverFromContextLoss();
508 mCore->GetContextNotifier()->NotifyContextRegained(); // Inform stage
511 void Adaptor::FeedTouchPoint( TouchPoint& point, int timeStamp )
513 Integration::Point convertedPoint( point );
514 mWindows.front()->FeedTouchPoint( convertedPoint, timeStamp );
517 void Adaptor::FeedWheelEvent( WheelEvent& wheelEvent )
519 Integration::WheelEvent event( static_cast< Integration::WheelEvent::Type >(wheelEvent.type), wheelEvent.direction, wheelEvent.modifiers, wheelEvent.point, wheelEvent.z, wheelEvent.timeStamp );
520 mWindows.front()->FeedWheelEvent( event );
523 void Adaptor::FeedKeyEvent( KeyEvent& keyEvent )
525 Integration::KeyEvent convertedEvent( keyEvent );
526 mWindows.front()->FeedKeyEvent( convertedEvent );
529 void Adaptor::ReplaceSurface( Dali::Integration::SceneHolder window, Dali::RenderSurfaceInterface& newSurface )
531 Internal::Adaptor::SceneHolder* windowImpl = &Dali::GetImplementation( window );
532 for( auto windowPtr : mWindows )
534 if( windowPtr == windowImpl ) // the window is not deleted
536 mResizedSignal.Emit( mAdaptor );
538 windowImpl->SetSurface( &newSurface );
540 // Flush the event queue to give the update-render thread chance
541 // to start processing messages for new camera setup etc as soon as possible
544 // This method blocks until the render thread has completed the replace.
545 mThreadController->ReplaceSurface( &newSurface );
551 void Adaptor::DeleteSurface( Dali::RenderSurfaceInterface& surface )
553 // Flush the event queue to give the update-render thread chance
554 // to start processing messages for new camera setup etc as soon as possible
557 // This method blocks until the render thread has finished rendering the current surface.
558 mThreadController->DeleteSurface( &surface );
561 Dali::RenderSurfaceInterface& Adaptor::GetSurface() const
563 return *mWindows.front()->GetSurface();
566 void Adaptor::ReleaseSurfaceLock()
568 mWindows.front()->GetSurface()->ReleaseLock();
571 Dali::TtsPlayer Adaptor::GetTtsPlayer(Dali::TtsPlayer::Mode mode)
573 if( !mTtsPlayers[mode] )
575 // Create the TTS player when it needed, because it can reduce launching time.
576 mTtsPlayers[mode] = TtsPlayer::New(mode);
579 return mTtsPlayers[mode];
582 bool Adaptor::AddIdle( CallbackBase* callback, bool hasReturnValue, bool forceAdd )
584 bool idleAdded(false);
586 // Only add an idle if the Adaptor is actually running
587 if( RUNNING == mState || READY == mState || forceAdd )
589 idleAdded = mCallbackManager->AddIdleCallback( callback, hasReturnValue );
595 void Adaptor::RemoveIdle( CallbackBase* callback )
597 mCallbackManager->RemoveIdleCallback( callback );
600 void Adaptor::SetPreRenderCallback( CallbackBase* callback )
602 mThreadController->SetPreRenderCallback( callback );
605 bool Adaptor::AddWindow( Dali::Integration::SceneHolder childWindow, const std::string& childWindowName, const std::string& childWindowClassName, bool childWindowMode )
607 Internal::Adaptor::SceneHolder& windowImpl = Dali::GetImplementation( childWindow );
608 windowImpl.SetAdaptor( Get() );
610 // Add the new Window to the container - the order is not important
611 mWindows.push_back( &windowImpl );
613 mWindowCreatedSignal.Emit( childWindow );
618 bool Adaptor::RemoveWindow( Dali::Integration::SceneHolder* childWindow )
620 Internal::Adaptor::SceneHolder& windowImpl = Dali::GetImplementation( *childWindow );
621 for ( WindowContainer::iterator iter = mWindows.begin(); iter != mWindows.end(); ++iter )
623 if( *iter == &windowImpl )
625 mWindows.erase( iter );
633 bool Adaptor::RemoveWindow( std::string childWindowName )
635 for ( WindowContainer::iterator iter = mWindows.begin(); iter != mWindows.end(); ++iter )
637 if( ( *iter )->GetName() == childWindowName )
639 mWindows.erase( iter );
647 bool Adaptor::RemoveWindow( Internal::Adaptor::SceneHolder* childWindow )
649 for ( WindowContainer::iterator iter = mWindows.begin(); iter != mWindows.end(); ++iter )
651 if( ( *iter )->GetId() == childWindow->GetId() )
653 mWindows.erase( iter );
661 Dali::Adaptor& Adaptor::Get()
663 DALI_ASSERT_ALWAYS( IsAvailable() && "Adaptor not instantiated" );
664 return gThreadLocalAdaptor->mAdaptor;
667 bool Adaptor::IsAvailable()
669 return gThreadLocalAdaptor != NULL;
672 void Adaptor::SceneCreated()
674 mCore->SceneCreated();
677 Dali::Integration::Core& Adaptor::GetCore()
682 void Adaptor::SetRenderRefreshRate( unsigned int numberOfVSyncsPerRender )
684 mThreadController->SetRenderRefreshRate( numberOfVSyncsPerRender );
687 Dali::DisplayConnection& Adaptor::GetDisplayConnectionInterface()
689 DALI_ASSERT_DEBUG( mDisplayConnection && "Display connection not created" );
690 return *mDisplayConnection;
693 GraphicsInterface& Adaptor::GetGraphicsInterface()
695 DALI_ASSERT_DEBUG( mGraphics && "Graphics interface not created" );
699 Dali::Integration::PlatformAbstraction& Adaptor::GetPlatformAbstractionInterface()
701 return *mPlatformAbstraction;
704 TriggerEventInterface& Adaptor::GetProcessCoreEventsTrigger()
706 return *mNotificationTrigger;
709 TriggerEventFactoryInterface& Adaptor::GetTriggerEventFactoryInterface()
711 return mTriggerEventFactory;
714 SocketFactoryInterface& Adaptor::GetSocketFactoryInterface()
716 return mSocketFactory;
719 Dali::RenderSurfaceInterface* Adaptor::GetRenderSurfaceInterface()
721 if( !mWindows.empty() )
723 return mWindows.front()->GetSurface();
729 TraceInterface& Adaptor::GetKernelTraceInterface()
731 return mKernelTracer;
734 TraceInterface& Adaptor::GetSystemTraceInterface()
736 return mSystemTracer;
739 PerformanceInterface* Adaptor::GetPerformanceInterface()
741 return mPerformanceInterface;
744 Integration::PlatformAbstraction& Adaptor::GetPlatformAbstraction() const
746 DALI_ASSERT_DEBUG( mPlatformAbstraction && "PlatformAbstraction not created" );
747 return *mPlatformAbstraction;
750 void Adaptor::DestroyTtsPlayer(Dali::TtsPlayer::Mode mode)
752 if( mTtsPlayers[mode] )
754 mTtsPlayers[mode].Reset();
758 Any Adaptor::GetNativeWindowHandle()
760 return mWindows.front()->GetNativeHandle();
763 Any Adaptor::GetNativeWindowHandle( Dali::Actor actor )
765 Any nativeWindowHandle;
767 Dali::Integration::Scene scene = Dali::Integration::Scene::Get( actor );
769 for( auto sceneHolder : mWindows )
771 if ( scene == sceneHolder->GetScene() )
773 nativeWindowHandle = sceneHolder->GetNativeHandle();
778 return nativeWindowHandle;
781 Any Adaptor::GetGraphicsDisplay()
787 auto eglGraphics = static_cast<EglGraphics *>( mGraphics ); // This interface is temporary until Core has been updated to match
789 EglImplementation& eglImpl = eglGraphics->GetEglImplementation();
790 display = eglImpl.GetDisplay();
796 void Adaptor::SetUseRemoteSurface(bool useRemoteSurface)
798 mUseRemoteSurface = useRemoteSurface;
801 void Adaptor::AddObserver( LifeCycleObserver& observer )
803 ObserverContainer::iterator match ( find(mObservers.begin(), mObservers.end(), &observer) );
805 if ( match == mObservers.end() )
807 mObservers.push_back( &observer );
811 void Adaptor::RemoveObserver( LifeCycleObserver& observer )
813 ObserverContainer::iterator match ( find(mObservers.begin(), mObservers.end(), &observer) );
815 if ( match != mObservers.end() )
817 mObservers.erase( match );
821 void Adaptor::QueueCoreEvent(const Dali::Integration::Event& event)
825 mCore->QueueEvent(event);
829 void Adaptor::ProcessCoreEvents()
833 if( mPerformanceInterface )
835 mPerformanceInterface->AddMarker( PerformanceInterface::PROCESS_EVENTS_START );
838 mCore->ProcessEvents();
840 if( mPerformanceInterface )
842 mPerformanceInterface->AddMarker( PerformanceInterface::PROCESS_EVENTS_END );
847 void Adaptor::RequestUpdate( bool forceUpdate )
853 mThreadController->RequestUpdate();
857 case PAUSED_WHILE_HIDDEN:
861 // Update (and resource upload) without rendering
862 mThreadController->RequestUpdateOnce( UpdateMode::SKIP_RENDER );
874 void Adaptor::RequestProcessEventsOnIdle( bool forceProcess )
876 // Only request a notification if the Adaptor is actually running
877 // and we haven't installed the idle notification
878 if( ( ! mNotificationOnIdleInstalled ) && ( RUNNING == mState || READY == mState || forceProcess ) )
880 mNotificationOnIdleInstalled = AddIdleEnterer( MakeCallback( this, &Adaptor::ProcessCoreEventsFromIdle ), forceProcess );
884 void Adaptor::OnWindowShown()
886 if( PAUSED_WHILE_HIDDEN == mState )
888 // Adaptor can now be resumed
893 // Force a render task
896 else if( RUNNING == mState )
898 // Force a render task
901 DALI_LOG_RELEASE_INFO( "Adaptor::OnWindowShown: Update requested.\n" );
905 DALI_LOG_RELEASE_INFO( "Adaptor::OnWindowShown: Adaptor is not paused state.[%d]\n", mState );
909 void Adaptor::OnWindowHidden()
911 if( RUNNING == mState || READY == mState )
913 bool allWindowsHidden = true;
915 for( auto window : mWindows )
917 if ( window->IsVisible() )
919 allWindowsHidden = false;
924 // Only pause the adaptor when all the windows are hidden
925 if( allWindowsHidden )
927 if( mState == RUNNING )
931 // Adaptor cannot be resumed until any window is shown
932 mState = PAUSED_WHILE_HIDDEN;
934 else // mState is READY
936 // Pause the adaptor after the state gets RUNNING
937 mState = PAUSED_WHILE_INITIALIZING;
942 DALI_LOG_RELEASE_INFO( "Adaptor::OnWindowHidden: Some windows are shown. Don't pause adaptor.\n" );
947 DALI_LOG_RELEASE_INFO( "Adaptor::OnWindowHidden: Adaptor is not running state.[%d]\n", mState );
951 // Dali::Internal::Adaptor::Adaptor::OnDamaged
952 void Adaptor::OnDamaged( const DamageArea& area )
954 // This is needed for the case where Dali window is partially obscured
955 RequestUpdate( false );
958 void Adaptor::SurfaceResizePrepare( Dali::RenderSurfaceInterface* surface, SurfaceSize surfaceSize )
960 mResizedSignal.Emit( mAdaptor );
963 void Adaptor::SurfaceResizeComplete( Dali::RenderSurfaceInterface* surface, SurfaceSize surfaceSize )
965 // Flush the event queue to give the update-render thread chance
966 // to start processing messages for new camera setup etc as soon as possible
969 mThreadController->ResizeSurface();
972 void Adaptor::NotifySceneCreated()
974 GetCore().SceneCreated();
976 // Flush the event queue to give the update-render thread chance
977 // to start processing messages for new camera setup etc as soon as possible
980 // Start thread controller after the scene has been created
981 mThreadController->Start();
983 // Process after surface is created (registering to remote surface provider if required)
984 SurfaceInitialized();
986 if( mState != PAUSED_WHILE_INITIALIZING )
990 DALI_LOG_RELEASE_INFO( "Adaptor::NotifySceneCreated: Adaptor is running\n" );
998 mState = PAUSED_WHILE_HIDDEN;
1000 DALI_LOG_RELEASE_INFO( "Adaptor::NotifySceneCreated: Adaptor is paused\n" );
1004 void Adaptor::NotifyLanguageChanged()
1006 mLanguageChangedSignal.Emit( mAdaptor );
1009 void Adaptor::RenderOnce()
1011 RequestUpdateOnce();
1014 const LogFactoryInterface& Adaptor::GetLogFactory()
1016 return *mEnvironmentOptions;
1019 void Adaptor::RegisterProcessor( Integration::Processor& processor )
1021 GetCore().RegisterProcessor(processor);
1024 void Adaptor::UnregisterProcessor( Integration::Processor& processor )
1026 GetCore().UnregisterProcessor(processor);
1029 bool Adaptor::IsMultipleWindowSupported() const
1031 return mConfigurationManager->IsMultipleWindowSupported();
1034 void Adaptor::RequestUpdateOnce()
1036 if( mThreadController )
1038 mThreadController->RequestUpdateOnce( UpdateMode::NORMAL );
1042 bool Adaptor::ProcessCoreEventsFromIdle()
1044 ProcessCoreEvents();
1046 // the idle handle automatically un-installs itself
1047 mNotificationOnIdleInstalled = false;
1052 Dali::Internal::Adaptor::SceneHolder* Adaptor::GetWindow( Dali::Actor& actor )
1054 Dali::Integration::Scene scene = Dali::Integration::Scene::Get( actor );
1056 for( auto window : mWindows )
1058 if ( scene == window->GetScene() )
1067 Dali::WindowContainer Adaptor::GetWindows() const
1069 Dali::WindowContainer windows;
1071 for ( auto iter = mWindows.begin(); iter != mWindows.end(); ++iter )
1073 // Downcast to Dali::Window
1074 Dali::Window window( dynamic_cast<Dali::Internal::Adaptor::Window*>( *iter ) );
1077 windows.push_back( window );
1084 Dali::SceneHolderList Adaptor::GetSceneHolders() const
1086 Dali::SceneHolderList sceneHolderList;
1088 for( auto iter = mWindows.begin(); iter != mWindows.end(); ++iter )
1090 sceneHolderList.push_back( Dali::Integration::SceneHolder( *iter ) );
1093 return sceneHolderList;
1096 Adaptor::Adaptor(Dali::Integration::SceneHolder window, Dali::Adaptor& adaptor, Dali::RenderSurfaceInterface* surface, EnvironmentOptions* environmentOptions)
1098 mLanguageChangedSignal(),
1099 mWindowCreatedSignal(),
1100 mAdaptor( adaptor ),
1103 mThreadController( nullptr ),
1104 mGraphics( nullptr ),
1105 mDisplayConnection( nullptr ),
1107 mConfigurationManager( nullptr ),
1108 mPlatformAbstraction( nullptr ),
1109 mCallbackManager( nullptr ),
1110 mNotificationOnIdleInstalled( false ),
1111 mNotificationTrigger( nullptr ),
1112 mDaliFeedbackPlugin(),
1113 mFeedbackController( nullptr ),
1116 mEnvironmentOptions( environmentOptions ? environmentOptions : new EnvironmentOptions /* Create the options if not provided */),
1117 mPerformanceInterface( nullptr ),
1120 mTriggerEventFactory(),
1121 mObjectProfiler( nullptr ),
1123 mEnvironmentOptionsOwned( environmentOptions ? false : true /* If not provided then we own the object */ ),
1124 mUseRemoteSurface( false )
1126 DALI_ASSERT_ALWAYS( !IsAvailable() && "Cannot create more than one Adaptor per thread" );
1127 mWindows.insert( mWindows.begin(), &Dali::GetImplementation( window ) );
1129 gThreadLocalAdaptor = this;
1132 void Adaptor::SetRootLayoutDirection( std::string locale )
1134 Dali::Stage stage = Dali::Stage::GetCurrent();
1136 stage.GetRootLayer().SetProperty( Dali::Actor::Property::LAYOUT_DIRECTION,
1137 static_cast< LayoutDirection::Type >( Internal::Adaptor::Locale::GetDirection( std::string( locale ) ) ) );
1140 bool Adaptor::AddIdleEnterer( CallbackBase* callback, bool forceAdd )
1142 bool idleAdded( false );
1144 // Only add an idle if the Adaptor is actually running
1145 if( RUNNING == mState || READY == mState || forceAdd )
1147 idleAdded = mCallbackManager->AddIdleEntererCallback( callback );
1153 void Adaptor::RemoveIdleEnterer( CallbackBase* callback )
1155 mCallbackManager->RemoveIdleEntererCallback( callback );
1158 } // namespace Adaptor
1160 } // namespace Internal