/*
- * Copyright (c) 2024 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2025 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.
// EXTERNAL_HEADERS
#include <dali/integration-api/debug.h>
+#include <dali/public-api/common/vector-wrapper.h>
#include <tbm_bufmgr.h>
#include <tbm_dummy_display.h>
+#include <utility> ///< for std::pair
// INTERNAL HEADERS
#include <dali/internal/window-system/tizen-wayland/display-connection-native-types.h>
{
NativeRenderSurfaceDisplayHolder()
: mBufMgr(nullptr),
- mDisplay(nullptr)
+ mDisplayList()
{
Initialize();
}
void Initialize()
{
mBufMgr = tbm_bufmgr_init(-1); // -1 is meaningless. The parameter in this function is deprecated.
+ }
+
+ tbm_dummy_display* AcquireDisplay()
+ {
+ tbm_dummy_display* display = nullptr;
if(mBufMgr)
{
- mDisplay = tbm_dummy_display_create();
+ for(auto& displayPair : mDisplayList)
+ {
+ if(!displayPair.second)
+ {
+ displayPair.second = true;
+ DALI_LOG_DEBUG_INFO("Use created dummy display : %p (total dummy display : %zu)\n", displayPair.first, mDisplayList.size());
+ return displayPair.first;
+ }
+ }
+
+ // Create new dummy 1 display
+ display = tbm_dummy_display_create();
+ if(display)
+ {
+ mDisplayList.push_back({display, true});
+ DALI_LOG_DEBUG_INFO("Create dummy display : %p (total dummy display : %zu)\n", display, mDisplayList.size());
+ }
}
+ return display;
}
+
+ void ReleaseDisplay(tbm_dummy_display* display)
+ {
+ for(auto& displayPair : mDisplayList)
+ {
+ if(displayPair.first == display)
+ {
+ DALI_LOG_DEBUG_INFO("Release dummy display : %p (total dummy display : %zu)\n", display, mDisplayList.size());
+ displayPair.second = false;
+ break;
+ }
+ }
+ }
+
void Destroy()
{
- if(mDisplay)
+ for(auto& displayPair : mDisplayList)
{
- tbm_dummy_display_destroy(mDisplay);
+ tbm_dummy_display_destroy(displayPair.first);
}
+ mDisplayList.clear();
if(mBufMgr)
{
tbm_bufmgr_deinit(mBufMgr);
+ mBufMgr = nullptr;
}
}
tbm_bufmgr mBufMgr; ///< For creating tbm_dummy_display
- tbm_dummy_display* mDisplay;
+ std::vector<std::pair<tbm_dummy_display*, bool>> mDisplayList; ///< pair of {display, used}. Increase only.
};
-static tbm_dummy_display* GetUniqueTbmDummyDisplay()
+static NativeRenderSurfaceDisplayHolder& GetDummyDisplayHolder()
+{
+ static NativeRenderSurfaceDisplayHolder gNativeRenderSurfaceDisplayHolder;
+ return gNativeRenderSurfaceDisplayHolder;
+}
+
+static tbm_dummy_display* AcquireUniqueTbmDummyDisplay()
{
- static NativeRenderSurfaceDisplayHolder sNativeRenderSurfaceDisplayHolder;
- if(sNativeRenderSurfaceDisplayHolder.mBufMgr == nullptr)
+ auto& displayHolder = GetDummyDisplayHolder();
+ if(displayHolder.mBufMgr == nullptr)
{
// Retry to initialize tbm bufmgr
- sNativeRenderSurfaceDisplayHolder.Destroy();
- sNativeRenderSurfaceDisplayHolder.Initialize();
- if(sNativeRenderSurfaceDisplayHolder.mBufMgr == nullptr)
+ displayHolder.Destroy();
+ displayHolder.Initialize();
+ if(displayHolder.mBufMgr == nullptr)
{
DALI_LOG_ERROR("Fail to init tbm buf mgr\n");
return nullptr;
}
}
- return sNativeRenderSurfaceDisplayHolder.mDisplay;
+ return displayHolder.AcquireDisplay();
+}
+
+static void ReleaseTbmDummyDisplay(tbm_dummy_display* display)
+{
+ auto& displayHolder = GetDummyDisplayHolder();
+ if(displayHolder.mBufMgr == nullptr)
+ {
+ return;
+ }
+ return displayHolder.ReleaseDisplay(display);
}
} // namespace
{
}
-DisplayConnectionEcoreWl::~DisplayConnectionEcoreWl() = default;
+DisplayConnectionEcoreWl::~DisplayConnectionEcoreWl()
+{
+ if(mSurfaceType == Integration::RenderSurfaceInterface::NATIVE_RENDER_SURFACE)
+ {
+ ReleaseTbmDummyDisplay(mDisplay);
+ mDisplay = nullptr;
+ }
+}
Any DisplayConnectionEcoreWl::GetDisplay()
{
if(mSurfaceType == Integration::RenderSurfaceInterface::NATIVE_RENDER_SURFACE)
{
- mDisplay = static_cast<wl_display*>(GetUniqueTbmDummyDisplay());
+ mDisplay = static_cast<wl_display*>(AcquireUniqueTbmDummyDisplay());
}
else
{