diff --git a/externals/dawn b/externals/dawn index 56a4aec00..a690fe423 160000 --- a/externals/dawn +++ b/externals/dawn @@ -1 +1 @@ -Subproject commit 56a4aec006181ed29853e5cd2bdd6a237798c958 +Subproject commit a690fe42392c8b8043a37fbfbbb69d0f5a02c814 diff --git a/packages/webgpu/cpp/rnwgpu/RNWebGPUManager.cpp b/packages/webgpu/cpp/rnwgpu/RNWebGPUManager.cpp index 5cfa489e8..3ce2dd618 100644 --- a/packages/webgpu/cpp/rnwgpu/RNWebGPUManager.cpp +++ b/packages/webgpu/cpp/rnwgpu/RNWebGPUManager.cpp @@ -30,7 +30,8 @@ RNWebGPUManager::RNWebGPUManager( std::make_shared(_jsCallInvoker); margelo::Dispatcher::installRuntimeGlobalDispatcher(*_jsRuntime, dispatcher); - auto gpu = std::make_shared(); + // Use the singleton GPU instance instead of creating a new one + auto gpu = GPU::getInstance(); auto rnWebGPU = std::make_shared(gpu, _platformContext); _gpu = gpu->get(); _jsRuntime->global().setProperty( diff --git a/packages/webgpu/cpp/rnwgpu/api/GPU.cpp b/packages/webgpu/cpp/rnwgpu/api/GPU.cpp index ca64fd020..c89300ceb 100644 --- a/packages/webgpu/cpp/rnwgpu/api/GPU.cpp +++ b/packages/webgpu/cpp/rnwgpu/api/GPU.cpp @@ -7,6 +7,10 @@ namespace rnwgpu { +// Static member definitions for singleton pattern +std::shared_ptr GPU::_instance = nullptr; +std::once_flag GPU::_onceFlag; + std::future>> GPU::requestAdapter( std::optional> options) { @@ -50,7 +54,7 @@ GPU::requestAdapter( std::unordered_set GPU::getWgslLanguageFeatures() { wgpu::SupportedWGSLLanguageFeatures supportedFeatures = {}; _instance.GetWGSLLanguageFeatures(&supportedFeatures); - + std::unordered_set result; for (size_t i = 0; i < supportedFeatures.featureCount; i++) { wgpu::WGSLLanguageFeatureName feature = supportedFeatures.features[i]; diff --git a/packages/webgpu/cpp/rnwgpu/api/GPU.h b/packages/webgpu/cpp/rnwgpu/api/GPU.h index 85da6867e..14c617465 100644 --- a/packages/webgpu/cpp/rnwgpu/api/GPU.h +++ b/packages/webgpu/cpp/rnwgpu/api/GPU.h @@ -1,7 +1,9 @@ #pragma once +#include #include #include +#include #include #include #include @@ -27,15 +29,17 @@ namespace m = margelo; class GPU : public m::HybridObject { public: - GPU() : HybridObject("GPU") { - wgpu::InstanceDescriptor instanceDesc; - instanceDesc.capabilities.timedWaitAnyEnable = true; - instanceDesc.capabilities.timedWaitAnyMaxCount = 64; - _instance = wgpu::CreateInstance(&instanceDesc); - auto instance = &_instance; - _async = std::make_shared(instance); + // Singleton pattern - get the single instance + static std::shared_ptr getInstance() { + std::call_once(_onceFlag, + []() { _instance = std::shared_ptr(new GPU()); }); + return _instance; } + // Delete copy constructor and assignment operator + GPU(const GPU &) = delete; + GPU &operator=(const GPU &) = delete; + public: std::string getBrand() { return _name; } @@ -57,6 +61,21 @@ class GPU : public m::HybridObject { inline const wgpu::Instance get() { return _instance; } +private: + // Private constructor for singleton pattern + GPU() : HybridObject("GPU") { + wgpu::InstanceDescriptor instanceDesc; + instanceDesc.capabilities.timedWaitAnyEnable = true; + instanceDesc.capabilities.timedWaitAnyMaxCount = 64; + _instance = wgpu::CreateInstance(&instanceDesc); + auto instance = &_instance; + _async = std::make_shared(instance); + } + + // Static members for singleton pattern + static std::shared_ptr _instance; + static std::once_flag _onceFlag; + private: wgpu::Instance _instance; std::shared_ptr _async; diff --git a/packages/webgpu/cpp/rnwgpu/api/descriptors/Unions.h b/packages/webgpu/cpp/rnwgpu/api/descriptors/Unions.h index 45b6202ec..15a450625 100644 --- a/packages/webgpu/cpp/rnwgpu/api/descriptors/Unions.h +++ b/packages/webgpu/cpp/rnwgpu/api/descriptors/Unions.h @@ -441,7 +441,8 @@ static void convertJSUnionToEnum(const std::string &inUnion, } else if (inUnion == "dawn-native") { *outEnum = wgpu::FeatureName::DawnNative; } else if (inUnion == "chromium-experimental-timestamp-query-inside-passes") { - *outEnum = wgpu::FeatureName::ChromiumExperimentalTimestampQueryInsidePasses; + *outEnum = + wgpu::FeatureName::ChromiumExperimentalTimestampQueryInsidePasses; } else if (inUnion == "implicit-device-synchronization") { *outEnum = wgpu::FeatureName::ImplicitDeviceSynchronization; } else if (inUnion == "transient-attachments") { @@ -613,7 +614,7 @@ static void convertEnumToJSUnion(wgpu::FeatureName inEnum, case wgpu::FeatureName::ANGLETextureSharing: *outUnion = "angle-texture-sharing"; break; - case wgpu::FeatureName::ChromiumExperimentalSubgroupMatrix: + case wgpu::FeatureName::ChromiumExperimentalSubgroupMatrix: *outUnion = "chromium-experimental-subgroups-matrix"; break; case wgpu::FeatureName::PixelLocalStorageCoherent: