diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/osd/modules/font/font_dwrite.cpp | 6 | ||||
-rw-r--r-- | src/osd/modules/lib/osdlib.h | 16 | ||||
-rw-r--r-- | src/osd/modules/monitor/monitor_dxgi.cpp | 2 | ||||
-rw-r--r-- | src/osd/modules/sound/xaudio2_sound.cpp | 2 |
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 |