summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--src/osd/modules/font/font_dwrite.cpp6
-rw-r--r--src/osd/modules/lib/osdlib.h16
-rw-r--r--src/osd/modules/monitor/monitor_dxgi.cpp2
-rw-r--r--src/osd/modules/sound/xaudio2_sound.cpp2
4 files changed, 17 insertions, 9 deletions
diff --git a/src/osd/modules/font/font_dwrite.cpp b/src/osd/modules/font/font_dwrite.cpp
index 1efc48b79d7..c40e8a11a96 100644
--- a/src/osd/modules/font/font_dwrite.cpp
+++ b/src/osd/modules/font/font_dwrite.cpp
@@ -69,15 +69,15 @@ static const float POINTS_PER_DIP = (3.0f / 4.0f);
// Dynamic APIs
DYNAMIC_API_BEGIN(d2d1, "d2d1.dll")
DYNAMIC_API_FN(HRESULT, WINAPI, D2D1CreateFactory, D2D1_FACTORY_TYPE, REFIID, const D2D1_FACTORY_OPTIONS *, void **)
-DYNAMIC_API_END()
+DYNAMIC_API_END(d2d1)
DYNAMIC_API_BEGIN(dwrite, "dwrite.dll")
DYNAMIC_API_FN(HRESULT, WINAPI, DWriteCreateFactory, DWRITE_FACTORY_TYPE, REFIID, IUnknown **)
-DYNAMIC_API_END()
+DYNAMIC_API_END(dwrite)
DYNAMIC_API_BEGIN(locale, "kernel32.dll")
DYNAMIC_API_FN(int, WINAPI, GetUserDefaultLocaleName, LPWSTR, int)
-DYNAMIC_API_END()
+DYNAMIC_API_END(locale)
// Debugging functions
#ifdef DWRITE_DEBUGGING
diff --git a/src/osd/modules/lib/osdlib.h b/src/osd/modules/lib/osdlib.h
index 28816e4048f..9c77d69cfcc 100644
--- a/src/osd/modules/lib/osdlib.h
+++ b/src/osd/modules/lib/osdlib.h
@@ -19,6 +19,7 @@
#include <string>
#include <type_traits>
#include <vector>
+#include <memory>
/*-----------------------------------------------------------------------------
osd_process_kill: kill the current process
@@ -104,7 +105,7 @@ protected:
//
// DYNAMIC_API_BEGIN(dxgi, "dxgi.dll")
// DYNAMIC_API_FN(DWORD, WINAPI, CreateDXGIFactory1, REFIID, void**)
-// DYNAMIC_API_END()
+// DYNAMIC_API_END(dxgi)
//
// Calling then looks like: DYNAMIC_CALL(dxgi, CreateDXGIFactory1, p1, p2, etc)
//=========================================================================================================================
@@ -115,12 +116,19 @@ protected:
class apiname##_api { \
private: \
osd::dynamic_module::ptr m_module = osd::dynamic_module::open( { __VA_ARGS__ } ); \
+ static std::unique_ptr<apiname##_api> s_instance; \
+ static std::once_flag s_once; \
public: \
- static apiname##_api &instance() { static apiname##_api api; return api; }
+ static apiname##_api &instance() { \
+ std::call_once( apiname##_api::s_once, [](std::unique_ptr<apiname##_api> &inst) { \
+ inst = std::make_unique<apiname##_api>(); }, s_instance); \
+ return *apiname##_api::s_instance.get(); }
#define DYNAMIC_API_FN(ret, conv, apifunc, ...) ret(conv *m_##apifunc##_pfn)( __VA_ARGS__ ) = m_module->bind<ret(conv *)( __VA_ARGS__ )>(#apifunc);
-#define DYNAMIC_API_END() };}}
+#define DYNAMIC_API_END(apiname) }; \
+std::once_flag apiname##_api::s_once; \
+std::unique_ptr<apiname##_api> apiname##_api::s_instance = nullptr; }}
#define DYNAMIC_CALL(apiname, fname, ...) (*osd::dynamicapi::apiname##_api::instance().m_##fname##_pfn) ( __VA_ARGS__ )
#define DYNAMIC_API_TEST(apiname, fname) (osd::dynamicapi::apiname##_api::instance().m_##fname##_pfn != nullptr)
@@ -129,7 +137,7 @@ public: \
#define DYNAMIC_API_BEGIN(apiname, ...)
#define DYNAMIC_API_FN(ret, conv, apifunc, ...)
-#define DYNAMIC_API_END()
+#define DYNAMIC_API_END(apiname)
#define DYNAMIC_CALL(apiname, fname, ...) fname( __VA_ARGS__ )
#define DYNAMIC_API_TEST(apiname, fname) (true)
diff --git a/src/osd/modules/monitor/monitor_dxgi.cpp b/src/osd/modules/monitor/monitor_dxgi.cpp
index c536a52efa6..20d9e53cdda 100644
--- a/src/osd/modules/monitor/monitor_dxgi.cpp
+++ b/src/osd/modules/monitor/monitor_dxgi.cpp
@@ -27,7 +27,7 @@
DYNAMIC_API_BEGIN(dxgi, "dxgi.dll")
DYNAMIC_API_FN(DWORD, WINAPI, CreateDXGIFactory1, REFIID, void**)
-DYNAMIC_API_END()
+DYNAMIC_API_END(dxgi)
using namespace Microsoft::WRL;
diff --git a/src/osd/modules/sound/xaudio2_sound.cpp b/src/osd/modules/sound/xaudio2_sound.cpp
index 0bb9f296b2c..bdd700c902f 100644
--- a/src/osd/modules/sound/xaudio2_sound.cpp
+++ b/src/osd/modules/sound/xaudio2_sound.cpp
@@ -127,7 +127,7 @@ typedef std::unique_ptr<IXAudio2SourceVoice, xaudio2_custom_deleter> src_voice_p
//
DYNAMIC_API_BEGIN(xaudio2, "XAudio2_9.dll", "XAudio2_8.dll")
DYNAMIC_API_FN(HRESULT, WINAPI, XAudio2Create, IXAudio2 **, uint32_t, XAUDIO2_PROCESSOR)
-DYNAMIC_API_END()
+DYNAMIC_API_END(xaudio2)
//============================================================
// Helper classes