Since we can destroy and re-create adaptor, We need to release whole items ensurely
after terminate application.
To support this system,
- Let we keep environment options for OffscreenApplication
- Make static API to terminate adaptor builder (Allow to recreate adaptor builder by options)
- Terminate adaptor builder after initalize adaptor done.
Change-Id: Ie9dadd29f6d9894db73ef01bdb42e09299fcea57
Signed-off-by: Eunki, Hong <eunkiki.hong@samsung.com>
namespace Dali::Internal::Adaptor
{
+namespace
+{
+static AdaptorBuilder* gAdaptorBuilder = nullptr;
+}
AdaptorBuilder& AdaptorBuilder::Get(EnvironmentOptions& environmentOptions)
{
- static AdaptorBuilder* gAdaptorBuilder = nullptr;
-
if(gAdaptorBuilder == nullptr)
{
gAdaptorBuilder = new AdaptorBuilder(environmentOptions);
return *gAdaptorBuilder;
}
+void AdaptorBuilder::Finalize()
+{
+ delete gAdaptorBuilder;
+ gAdaptorBuilder = nullptr;
+}
+
AdaptorBuilder::AdaptorBuilder(EnvironmentOptions& environmentOptions)
: mEnvironmentOptions(environmentOptions)
{
{
public:
static AdaptorBuilder& Get(EnvironmentOptions& environmentOptions);
+ static void Finalize();
/**
* Destructor
auto& graphicsFactory = adaptorBuilder.GetGraphicsFactory();
impl->Initialize(graphicsFactory);
+ AdaptorBuilder::Finalize();
+
return adaptor;
}
mFramework(nullptr),
mFrameworkFactory(nullptr),
mCommandLineOptions(nullptr),
- mAdaptorBuilder(nullptr),
mAdaptor(nullptr),
mEnvironmentOptions(nullptr),
mMainWindow(),
if(!mUseUiThread)
{
delete mAdaptor;
- delete mAdaptorBuilder;
if(mIsSystemInitialized)
{
WindowSystem::Shutdown();
GetImplementation(mMainWindow).DeleteRequestSignal().Connect(mSlotDelegate, &Application::Quit);
}
-void Application::CreateAdaptor()
+void Application::CreateAdaptor(AdaptorBuilder& adaptorBuilder)
{
DALI_ASSERT_ALWAYS(mMainWindow && "Window required to create adaptor");
- auto& graphicsFactory = mAdaptorBuilder->GetGraphicsFactory();
+ auto& graphicsFactory = adaptorBuilder.GetGraphicsFactory();
Integration::SceneHolder sceneHolder = Integration::SceneHolder(&Dali::GetImplementation(mMainWindow));
Adaptor::GetImplementation(*mAdaptor).SetUseRemoteSurface(mUseRemoteSurface);
}
-void Application::CreateAdaptorBuilder()
-{
- mAdaptorBuilder = &AdaptorBuilder::Get(*mEnvironmentOptions);
-}
-
void Application::MainLoop()
{
// Run the application
mFramework->AddAbortCallback(MakeCallback(this, &Application::QuitFromMainLoop));
- CreateAdaptorBuilder();
+ auto& adaptorBuilder = AdaptorBuilder::Get(*mEnvironmentOptions);
// If an application was pre-initialized, a window was made in advance
if(mLaunchpadState == Launchpad::NONE)
{
CreateWindow();
}
- CreateAdaptor();
+ CreateAdaptor(adaptorBuilder);
+
+ // adaptorBuilder invalidate after now.
+ AdaptorBuilder::Finalize();
if(mLaunchpadState == Launchpad::PRE_INITIALIZED)
{
if(mUseUiThread)
{
delete mAdaptor;
- delete mAdaptorBuilder;
WindowSystem::Shutdown();
}
}
#define DALI_INTERNAL_APPLICATION_H
/*
- * Copyright (c) 2023 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.
/**
* Creates the adaptor
*/
- void CreateAdaptor();
-
- /**
- * Creates the adaptor builder
- */
- void CreateAdaptorBuilder();
+ void CreateAdaptor(AdaptorBuilder& adaptorBuilder);
/**
* Quits from the main loop
CommandLineOptions* mCommandLineOptions;
- Dali::Internal::Adaptor::AdaptorBuilder* mAdaptorBuilder; ///< The adaptor builder
Dali::Adaptor* mAdaptor;
std::unique_ptr<EnvironmentOptions> mEnvironmentOptions;
/*
- * Copyright (c) 2023 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.
// Disable ATSPI
Dali::Accessibility::Bridge::DisableAutoInit();
+ // Create environment options after environmnet value changed.
+ mEnvironmentOptions = std::unique_ptr<Dali::Internal::Adaptor::EnvironmentOptions>(new Dali::Internal::Adaptor::EnvironmentOptions());
+
+ auto& adaptorBuilder = Dali::Internal::Adaptor::AdaptorBuilder::Get(*mEnvironmentOptions);
+
// Now we assume separated main loop for the offscreen application
mFrameworkFactory = std::unique_ptr<Adaptor::FrameworkFactory>(Dali::Internal::Adaptor::CreateFrameworkFactory());
mFramework = mFrameworkFactory->CreateFramework(Internal::Adaptor::FrameworkBackend::GLIB, *this, *this, nullptr, nullptr, Adaptor::Framework::NORMAL, false);
IntrusivePtr<Internal::OffscreenWindow> impl = Internal::OffscreenWindow::New(width, height, surface, isTranslucent);
mDefaultWindow = Dali::OffscreenWindow(impl.Get());
- mAdaptor.reset(Dali::Internal::Adaptor::Adaptor::New(Dali::Integration::SceneHolder(impl.Get()), impl->GetSurface(), NULL, renderMode == RenderMode::AUTO ? Dali::Internal::Adaptor::ThreadMode::NORMAL : Dali::Internal::Adaptor::ThreadMode::RUN_IF_REQUESTED));
+ auto& graphicsFactory = adaptorBuilder.GetGraphicsFactory();
+
+ mAdaptor.reset(Dali::Internal::Adaptor::Adaptor::New(graphicsFactory, Dali::Integration::SceneHolder(impl.Get()), impl->GetSurface(), mEnvironmentOptions.get(), renderMode == RenderMode::AUTO ? Dali::Internal::Adaptor::ThreadMode::NORMAL : Dali::Internal::Adaptor::ThreadMode::RUN_IF_REQUESTED));
+
+ // adaptorBuilder invalidate after now.
+ Dali::Internal::Adaptor::AdaptorBuilder::Finalize();
// Initialize default window
impl->Initialize(true);
#define DALI_INTERNAL_OFFSCREEN_APPLICATION_IMPL_H
/*
- * Copyright (c) 2023 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.
#include <dali/devel-api/adaptor-framework/offscreen-application.h>
#include <dali/devel-api/adaptor-framework/offscreen-window.h>
#include <dali/integration-api/adaptor-framework/scene-holder-impl.h>
+#include <dali/internal/adaptor/common/adaptor-builder-impl.h>
#include <dali/internal/adaptor/common/framework.h>
+#include <dali/internal/system/common/environment-options.h>
namespace Dali
{
OffscreenApplication& operator=(OffscreenApplication&&) = delete;
private:
- std::unique_ptr<Dali::Adaptor> mAdaptor;
- Dali::OffscreenWindow mDefaultWindow;
+ std::unique_ptr<Dali::Adaptor> mAdaptor;
+ std::unique_ptr<Dali::Internal::Adaptor::EnvironmentOptions> mEnvironmentOptions;
+
+ Dali::OffscreenWindow mDefaultWindow;
std::unique_ptr<Internal::Adaptor::Framework> mFramework;
std::unique_ptr<Internal::Adaptor::FrameworkFactory> mFrameworkFactory;