292 lines
8.8 KiB
C
292 lines
8.8 KiB
C
|
|
/*
|
||
|
|
* SPDX-FileCopyrightText: Copyright (c) 2024-2025 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.
|
||
|
|
*/
|
||
|
|
|
||
|
|
#ifndef NV_INFER_PLUGIN_BASE_H
|
||
|
|
#define NV_INFER_PLUGIN_BASE_H
|
||
|
|
|
||
|
|
#if !defined(NV_INFER_INTERNAL_INCLUDE)
|
||
|
|
static_assert(false, "Do not directly include this file. Include NvInferRuntime.h or NvInferPluginUtils.h");
|
||
|
|
#endif
|
||
|
|
|
||
|
|
#define NV_INFER_INTERNAL_INCLUDE 1
|
||
|
|
#include "NvInferRuntimeBase.h" // IWYU pragma: exports
|
||
|
|
#undef NV_INFER_INTERNAL_INCLUDE
|
||
|
|
namespace nvinfer1
|
||
|
|
{
|
||
|
|
|
||
|
|
//!
|
||
|
|
//! \enum PluginFieldType
|
||
|
|
//!
|
||
|
|
//! \brief The possible field types for custom layer.
|
||
|
|
//!
|
||
|
|
enum class PluginFieldType : int32_t
|
||
|
|
{
|
||
|
|
//! FP16 field type.
|
||
|
|
kFLOAT16 = 0,
|
||
|
|
//! FP32 field type.
|
||
|
|
kFLOAT32 = 1,
|
||
|
|
//! FP64 field type.
|
||
|
|
kFLOAT64 = 2,
|
||
|
|
//! INT8 field type.
|
||
|
|
kINT8 = 3,
|
||
|
|
//! INT16 field type.
|
||
|
|
kINT16 = 4,
|
||
|
|
//! INT32 field type.
|
||
|
|
kINT32 = 5,
|
||
|
|
//! char field type.
|
||
|
|
kCHAR = 6,
|
||
|
|
//! nvinfer1::Dims field type.
|
||
|
|
kDIMS = 7,
|
||
|
|
//! Unknown field type.
|
||
|
|
kUNKNOWN = 8,
|
||
|
|
//! BF16 field type.
|
||
|
|
kBF16 = 9,
|
||
|
|
//! INT64 field type.
|
||
|
|
kINT64 = 10,
|
||
|
|
//! FP8 field type.
|
||
|
|
kFP8 = 11,
|
||
|
|
//! INT4 field type.
|
||
|
|
kINT4 = 12,
|
||
|
|
//! FP4 field type.
|
||
|
|
kFP4 = 13,
|
||
|
|
};
|
||
|
|
|
||
|
|
//!
|
||
|
|
//! \class PluginField
|
||
|
|
//!
|
||
|
|
//! \brief Structure containing plugin attribute field names and associated data
|
||
|
|
//! This information can be parsed to decode necessary plugin metadata
|
||
|
|
//!
|
||
|
|
//!
|
||
|
|
class PluginField
|
||
|
|
{
|
||
|
|
public:
|
||
|
|
//! Plugin field attribute name
|
||
|
|
AsciiChar const* name;
|
||
|
|
//! Plugin field attribute data
|
||
|
|
void const* data;
|
||
|
|
//! Plugin field attribute type
|
||
|
|
PluginFieldType type;
|
||
|
|
//! Number of data entries in the Plugin attribute
|
||
|
|
int32_t length;
|
||
|
|
|
||
|
|
PluginField(AsciiChar const* const name_ = nullptr, void const* const data_ = nullptr,
|
||
|
|
PluginFieldType const type_ = PluginFieldType::kUNKNOWN, int32_t const length_ = 0) noexcept
|
||
|
|
: name(name_)
|
||
|
|
, data(data_)
|
||
|
|
, type(type_)
|
||
|
|
, length(length_)
|
||
|
|
{
|
||
|
|
}
|
||
|
|
};
|
||
|
|
|
||
|
|
//!
|
||
|
|
//! \struct PluginFieldCollection
|
||
|
|
//!
|
||
|
|
//! \brief Plugin field collection struct.
|
||
|
|
//!
|
||
|
|
struct PluginFieldCollection
|
||
|
|
{
|
||
|
|
//! Number of PluginField entries.
|
||
|
|
int32_t nbFields{};
|
||
|
|
//! Pointer to PluginField entries.
|
||
|
|
PluginField const* fields{};
|
||
|
|
};
|
||
|
|
|
||
|
|
//!
|
||
|
|
//! \enum TensorRTPhase
|
||
|
|
//!
|
||
|
|
//! \brief Indicates a phase of operation of TensorRT
|
||
|
|
//!
|
||
|
|
enum class TensorRTPhase : int32_t
|
||
|
|
{
|
||
|
|
//! Build phase of TensorRT
|
||
|
|
kBUILD = 0,
|
||
|
|
//! Execution phase of TensorRT
|
||
|
|
kRUNTIME = 1
|
||
|
|
};
|
||
|
|
|
||
|
|
//!
|
||
|
|
//! \enum PluginCapabilityType
|
||
|
|
//!
|
||
|
|
//! \brief Enumerates the different capability types a IPluginV3 object may have
|
||
|
|
//!
|
||
|
|
enum class PluginCapabilityType : int32_t
|
||
|
|
{
|
||
|
|
//! Core capability. Every IPluginV3 object must have this.
|
||
|
|
kCORE = 0,
|
||
|
|
//! Build capability. IPluginV3 objects provided to TensorRT build phase must have this.
|
||
|
|
kBUILD = 1,
|
||
|
|
//! Runtime capability. IPluginV3 objects provided to TensorRT build and execution phases must have this.
|
||
|
|
kRUNTIME = 2
|
||
|
|
};
|
||
|
|
|
||
|
|
namespace v_1_0
|
||
|
|
{
|
||
|
|
class IPluginCapability : public IVersionedInterface
|
||
|
|
{
|
||
|
|
};
|
||
|
|
|
||
|
|
class IPluginResource : public IVersionedInterface
|
||
|
|
{
|
||
|
|
public:
|
||
|
|
//!
|
||
|
|
//! \brief Return version information associated with this interface. Applications must not override this method.
|
||
|
|
//!
|
||
|
|
InterfaceInfo getInterfaceInfo() const noexcept override
|
||
|
|
{
|
||
|
|
return InterfaceInfo{"IPluginResource", 1, 0};
|
||
|
|
}
|
||
|
|
//!
|
||
|
|
//! \brief Free the underlying resource
|
||
|
|
//!
|
||
|
|
//! This will only be called for IPluginResource objects that were produced from IPluginResource::clone()
|
||
|
|
//!
|
||
|
|
//! The IPluginResource object on which release() is called must still be in a clone-able state
|
||
|
|
//! after release() returns
|
||
|
|
//!
|
||
|
|
//! \return 0 for success, else non-zero
|
||
|
|
//! \usage
|
||
|
|
//! - Allowed context for the API call
|
||
|
|
//! - Thread-safe: No; this method is not required to be thread-safe
|
||
|
|
//!
|
||
|
|
virtual int32_t release() noexcept = 0;
|
||
|
|
|
||
|
|
//!
|
||
|
|
//! \brief Clone the resource object
|
||
|
|
//!
|
||
|
|
//! \note Resource initialization (if any) may be skipped for non-cloned objects since only clones will be
|
||
|
|
//! registered by TensorRT
|
||
|
|
//!
|
||
|
|
//! \return Pointer to cloned object. nullptr if there was an issue.
|
||
|
|
//!
|
||
|
|
//! \usage
|
||
|
|
//! - Allowed context for the API call
|
||
|
|
//! - Thread-safe: Yes; this method is required to be thread-safe and may be called from multiple threads.
|
||
|
|
//!
|
||
|
|
virtual IPluginResource* clone() noexcept = 0;
|
||
|
|
|
||
|
|
~IPluginResource() noexcept override = default;
|
||
|
|
|
||
|
|
IPluginResource() = default;
|
||
|
|
IPluginResource(IPluginResource const&) = default;
|
||
|
|
IPluginResource(IPluginResource&&) = default;
|
||
|
|
IPluginResource& operator=(IPluginResource const&) & = default;
|
||
|
|
IPluginResource& operator=(IPluginResource&&) & = default;
|
||
|
|
}; // class IPluginResource
|
||
|
|
|
||
|
|
class IPluginCreatorInterface : public IVersionedInterface
|
||
|
|
{
|
||
|
|
public:
|
||
|
|
~IPluginCreatorInterface() noexcept override = default;
|
||
|
|
|
||
|
|
protected:
|
||
|
|
IPluginCreatorInterface() = default;
|
||
|
|
IPluginCreatorInterface(IPluginCreatorInterface const&) = default;
|
||
|
|
IPluginCreatorInterface(IPluginCreatorInterface&&) = default;
|
||
|
|
IPluginCreatorInterface& operator=(IPluginCreatorInterface const&) & = default;
|
||
|
|
IPluginCreatorInterface& operator=(IPluginCreatorInterface&&) & = default;
|
||
|
|
};
|
||
|
|
|
||
|
|
class IPluginV3 : public IVersionedInterface
|
||
|
|
{
|
||
|
|
public:
|
||
|
|
//!
|
||
|
|
//! \brief Return version information associated with this interface. Applications must not override this method.
|
||
|
|
//!
|
||
|
|
InterfaceInfo getInterfaceInfo() const noexcept override
|
||
|
|
{
|
||
|
|
return InterfaceInfo{"PLUGIN", 1, 0};
|
||
|
|
}
|
||
|
|
|
||
|
|
//! \brief Return a pointer to plugin object implementing the specified PluginCapabilityType.
|
||
|
|
//!
|
||
|
|
//! \note IPluginV3 objects added for the build phase (through addPluginV3()) must return valid objects for
|
||
|
|
//! PluginCapabilityType::kCORE, PluginCapabilityType::kBUILD and PluginCapabilityType::kRUNTIME.
|
||
|
|
//!
|
||
|
|
//! \note IPluginV3 objects added for the runtime phase must return valid objects for
|
||
|
|
//! PluginCapabilityType::kCORE and PluginCapabilityType::kRUNTIME.
|
||
|
|
//!
|
||
|
|
//! \see TensorRTPhase
|
||
|
|
//! \see IPluginCreatorV3One::createPlugin()
|
||
|
|
//!
|
||
|
|
virtual IPluginCapability* getCapabilityInterface(PluginCapabilityType type) noexcept = 0;
|
||
|
|
|
||
|
|
//!
|
||
|
|
//! \brief Clone the plugin object. This copies over internal plugin parameters and returns a new plugin object with
|
||
|
|
//! these parameters. The cloned object must be in a fully initialized state.
|
||
|
|
//!
|
||
|
|
//! \note The cloned object must return valid objects through getCapabilityInterface() for at least the same
|
||
|
|
//! PluginCapabilityTypes as the original object.
|
||
|
|
//!
|
||
|
|
//! \return A cloned plugin object in an initialized state with the same parameters as the current object.
|
||
|
|
//! nullptr must be returned if the cloning fails.
|
||
|
|
//!
|
||
|
|
virtual IPluginV3* clone() noexcept = 0;
|
||
|
|
};
|
||
|
|
} // namespace v_1_0
|
||
|
|
|
||
|
|
//!
|
||
|
|
//! \class IPluginResource
|
||
|
|
//!
|
||
|
|
//! \brief Interface for plugins to define custom resources that could be shared through the plugin registry
|
||
|
|
//!
|
||
|
|
//! \see IPluginRegistry::acquirePluginResource
|
||
|
|
//! \see IPluginRegistry::releasePluginResource
|
||
|
|
//!
|
||
|
|
using IPluginResource = v_1_0::IPluginResource;
|
||
|
|
|
||
|
|
//!
|
||
|
|
//! \class IPluginCreatorInterface
|
||
|
|
//!
|
||
|
|
//! \brief Base class for all plugin creator versions.
|
||
|
|
//!
|
||
|
|
//! \see IPluginCreator and IPluginRegistry
|
||
|
|
//!
|
||
|
|
using IPluginCreatorInterface = v_1_0::IPluginCreatorInterface;
|
||
|
|
|
||
|
|
//!
|
||
|
|
//! \class IPluginV3
|
||
|
|
//!
|
||
|
|
//! \brief Plugin class for the V3 generation of user-implemented layers.
|
||
|
|
//!
|
||
|
|
//! IPluginV3 acts as a wrapper around the plugin capability interfaces that define the actual behavior of the plugin.
|
||
|
|
//!
|
||
|
|
//! \see IPluginCapability
|
||
|
|
//! \see IPluginCreatorV3One
|
||
|
|
//! \see IPluginRegistry
|
||
|
|
//!
|
||
|
|
using IPluginV3 = v_1_0::IPluginV3;
|
||
|
|
|
||
|
|
//!
|
||
|
|
//! \class IPluginCapability
|
||
|
|
//!
|
||
|
|
//! \brief Base class for plugin capability interfaces
|
||
|
|
//!
|
||
|
|
//! IPluginCapability represents a split in TensorRT V3 plugins to sub-objects that expose different types of
|
||
|
|
//! capabilites a plugin may have, as opposed to a single interface which defines all capabilities and behaviors of a
|
||
|
|
//! plugin.
|
||
|
|
//!
|
||
|
|
//! \warning Do not inherit from this class, as doing so will break forward-compatibility of the API and ABI.
|
||
|
|
//!
|
||
|
|
//! \see PluginCapabilityType
|
||
|
|
//!
|
||
|
|
using IPluginCapability = v_1_0::IPluginCapability;
|
||
|
|
} // namespace nvinfer1
|
||
|
|
|
||
|
|
#endif /* NV_INFER_PLUGIN_BASE_H */
|