diff --git a/source/filters/filter-nv-face-tracking.cpp b/source/filters/filter-nv-face-tracking.cpp index dfc20aa..d9b6da8 100644 --- a/source/filters/filter-nv-face-tracking.cpp +++ b/source/filters/filter-nv-face-tracking.cpp @@ -606,7 +606,7 @@ bool face_tracking_instance::button_profile(obs_properties_t* props, obs_propert face_tracking_factory::face_tracking_factory() { // Try and load CUDA. - _cuda = std::make_shared<::nvidia::cuda::cuda>(); + _cuda = ::nvidia::cuda::cuda::get(); // Try and load AR. _ar = std::make_shared<::nvidia::ar::ar>(); diff --git a/source/nvidia/cuda/nvidia-cuda.cpp b/source/nvidia/cuda/nvidia-cuda.cpp index 0eeca6e..1fc98f2 100644 --- a/source/nvidia/cuda/nvidia-cuda.cpp +++ b/source/nvidia/cuda/nvidia-cuda.cpp @@ -18,8 +18,8 @@ */ #include "nvidia-cuda.hpp" -#include -#include +#include "common.hpp" +#include #if defined(_WIN32) || defined(_WIN64) #define CUDA_NAME "nvcuda.dll" @@ -121,3 +121,15 @@ nvidia::cuda::cuda::~cuda() { os_dlclose(_library); } + +std::shared_ptr nvidia::cuda::cuda::get() +{ + static std::shared_ptr instance; + static std::mutex lock; + + std::unique_lock ul(lock); + if (!instance) { + instance = std::make_shared(); + } + return instance; +} diff --git a/source/nvidia/cuda/nvidia-cuda.hpp b/source/nvidia/cuda/nvidia-cuda.hpp index 5ce8022..ff3dbc2 100644 --- a/source/nvidia/cuda/nvidia-cuda.hpp +++ b/source/nvidia/cuda/nvidia-cuda.hpp @@ -396,6 +396,8 @@ namespace nvidia::cuda { CUDA_DEFINE_FUNCTION(cuGraphicsD3D11RegisterResource, graphics_resource_t* resource, ID3D11Resource* d3dresource, std::uint32_t flags); #endif + public: + static std::shared_ptr get(); }; } // namespace nvidia::cuda