X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali%2Finternal%2Fadaptor%2Fcommon%2Fapplication-impl.cpp;h=44d4146015cad2de06ab960539e6580c8065bfd2;hb=HEAD;hp=c44318e9ef5a5618be134a93ed9f1fbff3193729;hpb=741de12613579e7caf298b683b2d89b8ef3d6867;p=platform%2Fcore%2Fuifw%2Fdali-adaptor.git diff --git a/dali/internal/adaptor/common/application-impl.cpp b/dali/internal/adaptor/common/application-impl.cpp index c44318e..6064745 100644 --- a/dali/internal/adaptor/common/application-impl.cpp +++ b/dali/internal/adaptor/common/application-impl.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022 Samsung Electronics Co., Ltd. + * Copyright (c) 2024 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. @@ -31,10 +31,13 @@ #include #include #include +#include #include #include +#include #include #include +#include #include #include #include @@ -64,16 +67,14 @@ DALI_INIT_TRACE_FILTER(gTraceFilter, DALI_TRACE_APPLICATION, true); ApplicationPtr Application::gPreInitializedApplication(NULL); ApplicationPtr Application::New( - int* argc, - char** argv[], - const std::string& stylesheet, - Dali::Application::WINDOW_MODE windowMode, - const PositionSize& positionSize, - Framework::Type applicationType, - WindowType type, - bool useUiThread) -{ - ApplicationPtr application(new Application(argc, argv, stylesheet, windowMode, positionSize, applicationType, type, useUiThread)); + int* argc, + char** argv[], + const std::string& stylesheet, + Framework::Type applicationType, + bool useUiThread, + const WindowData& windowData) +{ + ApplicationPtr application(new Application(argc, argv, stylesheet, applicationType, useUiThread, windowData)); return application; } @@ -81,15 +82,43 @@ void Application::PreInitialize(int* argc, char** argv[]) { if(!gPreInitializedApplication) { - Dali::TextAbstraction::FontClientPreInitialize(); + bool isUseUIThread = false; + +#ifdef UI_THREAD_AVAILABLE + char* retEnv = std::getenv("TIZEN_UI_THREAD"); + if(retEnv) + { + std::string uiThreadEnv = retEnv; + std::string enabledString = "true"; + if(uiThreadEnv == enabledString) + { + isUseUIThread = true; + } + } +#endif - gPreInitializedApplication = new Application(argc, argv, "", Dali::Application::OPAQUE, PositionSize(), Framework::NORMAL, WindowType::NORMAL, false); - gPreInitializedApplication->CreateWindow(); // Only create window + Dali::TextAbstraction::FontClientPreInitialize(); + WindowData windowData; + gPreInitializedApplication = new Application(argc, argv, "", Framework::NORMAL, isUseUIThread, windowData); gPreInitializedApplication->mLaunchpadState = Launchpad::PRE_INITIALIZED; + +#ifdef UI_THREAD_AVAILABLE + if(isUseUIThread) + { + DALI_LOG_RELEASE_INFO("PRE_INITIALIZED with UI Threading\n"); + gPreInitializedApplication->mUIThreadLoader = new UIThreadLoader(argc, argv); + gPreInitializedApplication->mUIThreadLoader->Run([&]() { gPreInitializedApplication->CreateWindow(); }); + } + else +#endif + { + DALI_LOG_RELEASE_INFO("Only PRE_INITIALIZED\n"); + gPreInitializedApplication->CreateWindow(); // Only create window + } } } -Application::Application(int* argc, char** argv[], const std::string& stylesheet, Dali::Application::WINDOW_MODE windowMode, const PositionSize& positionSize, Framework::Type applicationType, WindowType type, bool useUiThread) +Application::Application(int* argc, char** argv[], const std::string& stylesheet, Framework::Type applicationType, bool useUiThread, const WindowData& windowData) : mInitSignal(), mTerminateSignal(), mPauseSignal(), @@ -98,27 +127,28 @@ Application::Application(int* argc, char** argv[], const std::string& stylesheet mAppControlSignal(), mLanguageChangedSignal(), mRegionChangedSignal(), - mEventLoop(nullptr), mFramework(nullptr), + mFrameworkFactory(nullptr), mCommandLineOptions(nullptr), mAdaptorBuilder(nullptr), mAdaptor(nullptr), + mEnvironmentOptions(nullptr), mMainWindow(), - mMainWindowMode(windowMode), + mMainWindowMode(windowData.GetTransparency() ? WINDOW_MODE::TRANSPARENT : WINDOW_MODE::OPAQUE), mMainWindowName(), + mIsMainWindowFrontBufferRendering(windowData.GetFrontBufferRendering()), mStylesheet(stylesheet), - mEnvironmentOptions(), - mWindowPositionSize(positionSize), + mWindowPositionSize(windowData.GetPositionSize()), mLaunchpadState(Launchpad::NONE), - mDefaultWindowType(type), + mDefaultWindowType(windowData.GetWindowType()), mUseUiThread(useUiThread), - mSlotDelegate(this) + mIsSystemInitialized(false), + mSlotDelegate(this), + mUIThreadLoader(nullptr) { - // Get mName from environment options - mMainWindowName = mEnvironmentOptions.GetWindowName(); - if(mMainWindowName.empty() && argc && (*argc > 0)) + // Set mName from command-line args + if(argc && (*argc > 0)) { - // Set mName from command-line args if environment option not set mMainWindowName = (*argv)[0]; } @@ -129,8 +159,11 @@ Application::Application(int* argc, char** argv[], const std::string& stylesheet } mCommandLineOptions = new CommandLineOptions(argc, argv); - mFramework = new Framework(*this, *this, argc, argv, applicationType, mUseUiThread); - mUseRemoteSurface = (applicationType == Framework::WATCH); + + mFrameworkFactory = std::unique_ptr(Dali::Internal::Adaptor::CreateFrameworkFactory()); + mFramework = mFrameworkFactory->CreateFramework(FrameworkBackend::DEFAULT, *this, *this, argc, argv, applicationType, mUseUiThread); + + mUseRemoteSurface = (applicationType == Framework::WATCH); } Application::~Application() @@ -143,10 +176,28 @@ Application::~Application() } mMainWindow.Reset(); - delete mAdaptor; - delete mAdaptorBuilder; + delete mCommandLineOptions; - delete mFramework; + + // Application is created in Main thread whether UI Threading is enabled or not. + // But some resources are created in Main thread or UI thread. + // The below code is for the resource are created in Main thread. + if(!mUseUiThread) + { + delete mAdaptor; + delete mAdaptorBuilder; + if(mIsSystemInitialized) + { + WindowSystem::Shutdown(); + } + } + else + { + if(mUIThreadLoader) + { + delete mUIThreadLoader; + } + } } void Application::StoreWindowPositionSize(PositionSize positionSize) @@ -154,14 +205,29 @@ void Application::StoreWindowPositionSize(PositionSize positionSize) mWindowPositionSize = positionSize; } -void Application::ChangePreInitializedWindowSize() +void Application::StoreFrontBufferRendering(bool enable) +{ + mIsMainWindowFrontBufferRendering = enable; +} + +void Application::ChangePreInitializedWindowInfo() { + // Set window name + auto windowClassName = mEnvironmentOptions->GetWindowClassName(); + auto windowName = mEnvironmentOptions->GetWindowName(); + if(!windowName.empty()) + { + mMainWindowName = windowName; + } + mMainWindow.SetClass(mMainWindowName, windowClassName); + // The real screen size may be different from the value of the preinitialized state. Update it. Dali::Internal::Adaptor::WindowSystem::UpdateScreenSize(); int screenWidth, screenHeight; Dali::Internal::Adaptor::WindowSystem::GetScreenSize(screenWidth, screenHeight); + // Set window position / size if(mWindowPositionSize != PositionSize(0, 0, 0, 0)) { Dali::DevelWindow::SetPositionSize(mMainWindow, mWindowPositionSize); @@ -173,11 +239,11 @@ void Application::ChangePreInitializedWindowSize() mWindowPositionSize.height = mCommandLineOptions->stageHeight; mMainWindow.SetSize(Dali::Window::WindowSize(mWindowPositionSize.width, mWindowPositionSize.height)); } - else if(mEnvironmentOptions.GetWindowWidth() && mEnvironmentOptions.GetWindowHeight()) + else if(mEnvironmentOptions->GetWindowWidth() && mEnvironmentOptions->GetWindowHeight()) { // Environment options override full screen functionality if command line arguments not provided - mWindowPositionSize.width = mEnvironmentOptions.GetWindowWidth(); - mWindowPositionSize.height = mEnvironmentOptions.GetWindowHeight(); + mWindowPositionSize.width = mEnvironmentOptions->GetWindowWidth(); + mWindowPositionSize.height = mEnvironmentOptions->GetWindowHeight(); mMainWindow.SetSize(Dali::Window::WindowSize(mWindowPositionSize.width, mWindowPositionSize.height)); } else if(screenWidth != mWindowPositionSize.width || screenHeight != mWindowPositionSize.height) @@ -187,30 +253,61 @@ void Application::ChangePreInitializedWindowSize() mWindowPositionSize.height = screenHeight; mMainWindow.SetSize(Dali::Window::WindowSize(mWindowPositionSize.width, mWindowPositionSize.height)); } + + // Set front buffer rendering + Dali::DevelWindow::SetFrontBufferRendering(mMainWindow, mIsMainWindowFrontBufferRendering); } void Application::CreateWindow() { - if(mWindowPositionSize.width == 0 && mWindowPositionSize.height == 0) + Internal::Adaptor::Window* window; + WindowData windowData; + windowData.SetTransparency(mMainWindowMode); + windowData.SetWindowType(mDefaultWindowType); + windowData.SetFrontBufferRendering(mIsMainWindowFrontBufferRendering); + + DALI_LOG_RELEASE_INFO("Create Default Window\n"); + + WindowSystem::Initialize(); + mIsSystemInitialized = true; + + if(mLaunchpadState != Launchpad::PRE_INITIALIZED) { - if(mCommandLineOptions->stageWidth > 0 && mCommandLineOptions->stageHeight > 0) + if(mWindowPositionSize.width == 0 && mWindowPositionSize.height == 0) { - // Command line options override environment options and full screen - mWindowPositionSize.width = mCommandLineOptions->stageWidth; - mWindowPositionSize.height = mCommandLineOptions->stageHeight; + if(mCommandLineOptions->stageWidth > 0 && mCommandLineOptions->stageHeight > 0) + { + // Command line options override environment options and full screen + mWindowPositionSize.width = mCommandLineOptions->stageWidth; + mWindowPositionSize.height = mCommandLineOptions->stageHeight; + } + else if(mEnvironmentOptions->GetWindowWidth() && mEnvironmentOptions->GetWindowHeight()) + { + // Environment options override full screen functionality if command line arguments not provided + mWindowPositionSize.width = mEnvironmentOptions->GetWindowWidth(); + mWindowPositionSize.height = mEnvironmentOptions->GetWindowHeight(); + } } - else if(mEnvironmentOptions.GetWindowWidth() && mEnvironmentOptions.GetWindowHeight()) + + auto windowClassName = mEnvironmentOptions->GetWindowClassName(); + auto windowName = mEnvironmentOptions->GetWindowName(); + if(!windowName.empty()) { - // Environment options override full screen functionality if command line arguments not provided - mWindowPositionSize.width = mEnvironmentOptions.GetWindowWidth(); - mWindowPositionSize.height = mEnvironmentOptions.GetWindowHeight(); + mMainWindowName = windowName; } - } - const std::string& windowClassName = mEnvironmentOptions.GetWindowClassName(); + windowData.SetPositionSize(mWindowPositionSize); + window = Internal::Adaptor::Window::New(mMainWindowName, windowClassName, windowData); + } + else + { + // The position, size, window name, and frontbuffering of the pre-initialized application + // will be updated in ChangePreInitializedWindowInfo() when the real application is launched. + windowData.SetPositionSize(mWindowPositionSize); + window = Internal::Adaptor::Window::New("", "", windowData); + } - Internal::Adaptor::Window* window = Internal::Adaptor::Window::New(mWindowPositionSize, mMainWindowName, windowClassName, mDefaultWindowType, mMainWindowMode == Dali::Application::TRANSPARENT); - mMainWindow = Dali::Window(window); + mMainWindow = Dali::Window(window); // Quit the application when the window is closed GetImplementation(mMainWindow).DeleteRequestSignal().Connect(mSlotDelegate, &Application::Quit); @@ -220,18 +317,18 @@ void Application::CreateAdaptor() { DALI_ASSERT_ALWAYS(mMainWindow && "Window required to create adaptor"); - auto graphicsFactory = mAdaptorBuilder->GetGraphicsFactory(); + auto& graphicsFactory = mAdaptorBuilder->GetGraphicsFactory(); Integration::SceneHolder sceneHolder = Integration::SceneHolder(&Dali::GetImplementation(mMainWindow)); - mAdaptor = Adaptor::New(graphicsFactory, sceneHolder, &mEnvironmentOptions); + mAdaptor = Adaptor::New(graphicsFactory, sceneHolder, mEnvironmentOptions.get()); Adaptor::GetImplementation(*mAdaptor).SetUseRemoteSurface(mUseRemoteSurface); } void Application::CreateAdaptorBuilder() { - mAdaptorBuilder = new AdaptorBuilder(mEnvironmentOptions); + mAdaptorBuilder = &AdaptorBuilder::Get(*mEnvironmentOptions); } void Application::MainLoop() @@ -250,7 +347,7 @@ void Application::Quit() { // Actually quit the application. // Force a call to Quit even if adaptor is not running. - Internal::Adaptor::Adaptor::GetImplementation(*mAdaptor).AddIdle(MakeCallback(this, &Application::QuitFromMainLoop), false, true); + Internal::Adaptor::Adaptor::GetImplementation(*mAdaptor).AddIdle(MakeCallback(this, &Application::QuitFromMainLoop), false); } void Application::QuitFromMainLoop() @@ -265,12 +362,15 @@ void Application::QuitFromMainLoop() void Application::OnInit() { + mEnvironmentOptions = std::unique_ptr(new EnvironmentOptions()); + mFramework->AddAbortCallback(MakeCallback(this, &Application::QuitFromMainLoop)); CreateAdaptorBuilder(); // If an application was pre-initialized, a window was made in advance if(mLaunchpadState == Launchpad::NONE) { + DALI_LOG_RELEASE_INFO("default Window is created in standalone\n"); CreateWindow(); } @@ -278,7 +378,7 @@ void Application::OnInit() if(mLaunchpadState == Launchpad::PRE_INITIALIZED) { - ChangePreInitializedWindowSize(); + ChangePreInitializedWindowInfo(); } // Run the adaptor @@ -309,6 +409,9 @@ void Application::OnInit() DALI_TRACE_END(gTraceFilter, "DALI_APP_EMIT_INIT_SIGNAL"); mAdaptor->NotifySceneCreated(); + + // Ensure the join of Font thread at this point + Dali::TextAbstraction::FontClientJoinFontThreads(); } void Application::OnTerminate() @@ -326,6 +429,15 @@ void Application::OnTerminate() } mMainWindow.Reset(); // This only resets (clears) the default Window + + // If DALi's UI Thread works, some resources are created in UI Thread, not Main thread. + // For that case, these resource should be deleted in UI Thread. + if(mUseUiThread) + { + delete mAdaptor; + delete mAdaptorBuilder; + WindowSystem::Shutdown(); + } } void Application::OnPause() @@ -501,12 +613,17 @@ Dali::Window Application::GetWindow() std::string Application::GetResourcePath() { - return Internal::Adaptor::Framework::GetResourcePath(); + return SystemSettings::GetResourcePath(); } std::string Application::GetDataPath() { - return Internal::Adaptor::Framework::GetDataPath(); + return SystemSettings::GetDataPath(); +} + +void Application::FlushUpdateMessages() +{ + Internal::Adaptor::Adaptor::GetImplementation(*mAdaptor).FlushUpdateMessages(); } void Application::SetStyleSheet(const std::string& stylesheet) @@ -521,6 +638,12 @@ void Application::SetCommandLineOptions(int* argc, char** argv[]) mCommandLineOptions = new CommandLineOptions(argc, argv); mFramework->SetCommandLineOptions(argc, argv); + + if(argc && (*argc > 0)) + { + // Set mName from command-line args + mMainWindowName = (*argv)[0]; + } } void Application::SetDefaultWindowType(WindowType type) @@ -529,6 +652,15 @@ void Application::SetDefaultWindowType(WindowType type) mMainWindow.SetType(type); } +int32_t Application::GetRenderThreadId() const +{ + if(mAdaptor) + { + return Internal::Adaptor::Adaptor::GetImplementation(*mAdaptor).GetRenderThreadId(); + } + return 0; +} + ApplicationPtr Application::GetPreInitializedApplication() { // Reset the handle to decrease the reference count