/* * SPDX-FileCopyrightText: Copyright (c) 1993-2022 NVIDIA CORPORATION & AFFILIATES. All rights reserved. * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "NvInfer.h" #include "NvInferPlugin.h" #include "checkMacrosPlugin.h" #include "plugin.h" #include #include #include #include #include #include #include using namespace nvinfer1; using namespace nvinfer1::plugin; #include "batchTilePlugin.h" #include "batchedNMSPlugin.h" #include "coordConvACPlugin.h" #include "cropAndResizePlugin.h" #include "decodeBbox3D.h" #include "detectionLayerPlugin.h" #include "efficientNMSPlugin.h" #include "tftrt/efficientNMSImplicitTFTRTPlugin.h" #include "tftrt/efficientNMSExplicitTFTRTPlugin.h" #include "flattenConcat.h" #include "generateDetectionPlugin.h" #include "gridAnchorPlugin.h" #include "instanceNormalizationPlugin.h" #include "lReluPlugin.h" #include "multilevelCropAndResizePlugin.h" #include "multilevelProposeROIPlugin.h" #include "multiscaleDeformableAttnPlugin.h" #include "nmsPlugin.h" #include "normalizePlugin.h" #include "nvFasterRCNNPlugin.h" #include "pillarScatter.h" #include "priorBoxPlugin.h" #include "proposalLayerPlugin.h" #include "proposalPlugin.h" #include "pyramidROIAlignPlugin.h" #include "regionPlugin.h" #include "reorgPlugin.h" #include "resizeNearestPlugin.h" #include "scatterPlugin.h" #include "specialSlicePlugin.h" #include "split.h" #include "voxelGenerator.h" using nvinfer1::plugin::RPROIParams; namespace nvinfer1 { namespace plugin { extern ILogger* gLogger; // This singleton ensures that each plugin is only registered once for a given // namespace and type, and attempts of duplicate registration are ignored. class PluginCreatorRegistry { public: static PluginCreatorRegistry& getInstance() { static PluginCreatorRegistry instance; return instance; } template void addPluginCreator(void* logger, const char* libNamespace) { // Make accesses to the plugin creator registry thread safe std::lock_guard lock(mRegistryLock); std::string errorMsg; std::string verboseMsg; std::unique_ptr pluginCreator{new CreatorType{}}; pluginCreator->setPluginNamespace(libNamespace); nvinfer1::plugin::gLogger = static_cast(logger); std::string pluginType = std::string{pluginCreator->getPluginNamespace()} + "::" + std::string{pluginCreator->getPluginName()} + " version " + std::string{pluginCreator->getPluginVersion()}; if (mRegistryList.find(pluginType) == mRegistryList.end()) { bool status = getPluginRegistry()->registerCreator(*pluginCreator, libNamespace); if (status) { mRegistry.push(std::move(pluginCreator)); mRegistryList.insert(pluginType); verboseMsg = "Registered plugin creator - " + pluginType; } else { errorMsg = "Could not register plugin creator - " + pluginType; } } else { verboseMsg = "Plugin creator already registered - " + pluginType; } if (logger) { if (!errorMsg.empty()) { nvinfer1::plugin::gLogger->log(ILogger::Severity::kERROR, errorMsg.c_str()); } if (!verboseMsg.empty()) { nvinfer1::plugin::gLogger->log(ILogger::Severity::kVERBOSE, verboseMsg.c_str()); } } } ~PluginCreatorRegistry() { std::lock_guard lock(mRegistryLock); // Release pluginCreators in LIFO order of registration. while (!mRegistry.empty()) { mRegistry.pop(); } mRegistryList.clear(); } private: PluginCreatorRegistry() {} std::mutex mRegistryLock; std::stack> mRegistry; std::unordered_set mRegistryList; public: PluginCreatorRegistry(PluginCreatorRegistry const&) = delete; void operator=(PluginCreatorRegistry const&) = delete; }; template void initializePlugin(void* logger, const char* libNamespace) { PluginCreatorRegistry::getInstance().addPluginCreator(logger, libNamespace); } } // namespace plugin } // namespace nvinfer1 // New Plugin APIs extern "C" { bool initLibNvInferPlugins(void* logger, const char* libNamespace) { initializePlugin(logger, libNamespace); initializePlugin(logger, libNamespace); initializePlugin(logger, libNamespace); initializePlugin(logger, libNamespace); initializePlugin(logger, libNamespace); initializePlugin(logger, libNamespace); initializePlugin(logger, libNamespace); initializePlugin(logger, libNamespace); initializePlugin(logger, libNamespace); initializePlugin(logger, libNamespace); initializePlugin(logger, libNamespace); initializePlugin(logger, libNamespace); initializePlugin(logger, libNamespace); initializePlugin(logger, libNamespace); initializePlugin(logger, libNamespace); initializePlugin(logger, libNamespace); initializePlugin(logger, libNamespace); initializePlugin(logger, libNamespace); initializePlugin(logger, libNamespace); initializePlugin(logger, libNamespace); initializePlugin(logger, libNamespace); initializePlugin(logger, libNamespace); initializePlugin(logger, libNamespace); initializePlugin(logger, libNamespace); initializePlugin(logger, libNamespace); initializePlugin(logger, libNamespace); initializePlugin(logger, libNamespace); initializePlugin(logger, libNamespace); initializePlugin(logger, libNamespace); initializePlugin(logger, libNamespace); initializePlugin(logger, libNamespace); initializePlugin(logger, libNamespace); initializePlugin(logger, libNamespace); initializePlugin(logger, libNamespace); initializePlugin(logger, libNamespace); initializePlugin(logger, libNamespace); initializePlugin(logger, libNamespace); initializePlugin(logger, libNamespace); return true; } } // extern "C"