omni/core/Omni.h

File members: omni/core/Omni.h

// Copyright (c) 2020-2023, NVIDIA CORPORATION. All rights reserved.
//
// NVIDIA CORPORATION and its licensors retain all intellectual property
// and proprietary rights in and to this software, related documentation
// and any modifications thereto. Any use, reproduction, disclosure or
// distribution of this software and related documentation without an express
// license agreement from NVIDIA CORPORATION is strictly prohibited.
//

#pragma once

#include "../../carb/extras/Library.h"
#include "../../carb/PluginInitializers.h"

#include "Api.h"
#include "BuiltIn.h"
#include "ITypeFactory.h"
#include "../log/ILog.h"
#include "../structuredlog/IStructuredLog.h"

OMNI_API const char* omniGetModuleFilename();

OMNI_API const char* omniGetModuleDirectory();

#if CARB_PLATFORM_WINDOWS || defined(DOXYGEN_BUILD)
#    define OMNI_MODULE_GLOBALS_BUILD_CONFIG_SYMBOLS()
#else
#    if CARB_DEBUG
#        define OMNI_MODULE_GLOBALS_BUILD_CONFIG_SYMBOLS() CARB_HIDDEN int g_carbIsDebugConfig = 1
#    else
#        define OMNI_MODULE_GLOBALS_BUILD_CONFIG_SYMBOLS() CARB_HIDDEN int g_carbIsReleaseConfig = 1
#    endif
#endif

#define OMNI_MODULE_DEFINE_LOCATION_FUNCTIONS()                                                                        \
    OMNI_API const char* omniGetModuleFilename()                                                                       \
    {                                                                                                                  \
        static std::string s_omniModuleFilename = carb::extras::getLibraryFilename((void*)(omniGetModuleFilename));    \
        return s_omniModuleFilename.c_str();                                                                           \
    }                                                                                                                  \
    OMNI_API const char* omniGetModuleDirectory()                                                                      \
    {                                                                                                                  \
        static std::string s_omniModuleDirectory = carb::extras::getLibraryDirectory((void*)(omniGetModuleDirectory)); \
        return s_omniModuleDirectory.c_str();                                                                          \
    }

#define OMNI_MODULE_DEFINE_OMNI_FUNCTIONS()                                                                            \
    namespace                                                                                                          \
    {                                                                                                                  \
    ::omni::core::ITypeFactory* s_omniTypeFactory = nullptr;                                                           \
    ::omni::log::ILog* s_omniLog = nullptr;                                                                            \
    ::omni::structuredlog::IStructuredLog* s_omniStructuredLog = nullptr;                                              \
    }                                                                                                                  \
    OMNI_MODULE_DEFINE_LOCATION_FUNCTIONS()                                                                            \
    OMNI_MODULE_GLOBALS_BUILD_CONFIG_SYMBOLS();                                                                        \
    OMNI_API void* omniGetBuiltInWithoutAcquire(OmniBuiltIn type)                                                      \
    {                                                                                                                  \
        switch (type)                                                                                                  \
        {                                                                                                              \
            case ::OmniBuiltIn::eITypeFactory:                                                                         \
                return s_omniTypeFactory;                                                                              \
            case ::OmniBuiltIn::eILog:                                                                                 \
                return s_omniLog;                                                                                      \
            case ::OmniBuiltIn::eIStructuredLog:                                                                       \
                return s_omniStructuredLog;                                                                            \
            default:                                                                                                   \
                return nullptr;                                                                                        \
        }                                                                                                              \
    }

using OmniCarbStartupFn = const char* (*)(carb::Framework*);

using OmniCarbShutdownFn = void (*)();

#define OMNI_MODULE_DEFINE_CARB_FUNCTIONS()                                                                            \
    OMNI_EXPORT const char* omniCarbStartup(carb::Framework* framework)                                                \
    {                                                                                                                  \
        g_carbFramework = framework;                                                                                   \
        carb::pluginInitialize();                                                                                      \
        return g_carbClientName;                                                                                       \
    }                                                                                                                  \
    OMNI_EXPORT void omniCarbShutdown()                                                                                \
    {                                                                                                                  \
        carb::pluginDeinitialize();                                                                                    \
    }

#define OMNI_GLOBALS_ADD_DEFAULT_CHANNEL_1(chan_, name_, desc_) OMNI_LOG_ADD_CHANNEL(chan_, name_, desc_)

#define OMNI_GLOBALS_ADD_DEFAULT_CHANNEL(name_, desc_)                                                                 \
    OMNI_GLOBALS_ADD_DEFAULT_CHANNEL_1(OMNI_LOG_DEFAULT_CHANNEL, name_, desc_)

#define OMNI_MODULE_GLOBALS_WITHOUT_CARB(name_, desc_)                                                                 \
    OMNI_MODULE_DEFINE_OMNI_FUNCTIONS()                                                                                \
    OMNI_GLOBALS_ADD_DEFAULT_CHANNEL(name_, desc_)

#define OMNI_MODULE_GLOBALS(name_, desc_)                                                                              \
    OMNI_MODULE_DEFINE_OMNI_FUNCTIONS()                                                                                \
    OMNI_MODULE_DEFINE_CARB_FUNCTIONS()                                                                                \
    CARB_GLOBALS_EX(name_, desc_)

#define OMNI_MODULE_SET_EXPORTS_WITHOUT_CARB(out_)                                                                     \
    do                                                                                                                 \
    {                                                                                                                  \
        OMNI_RETURN_IF_FAILED(out_->checkVersion(omni::core::kModuleExportsMagic, omni::core::kModuleExportsVersion)); \
        OMNI_RETURN_IF_FAILED(out_->addITypeFactory(&s_omniTypeFactory));                                              \
        OMNI_RETURN_IF_FAILED(out_->addILog(&s_omniLog));                                                              \
        OMNI_RETURN_IF_FAILED(out_->addIStructuredLog(&s_omniStructuredLog));                                          \
        for (auto channel = omni::log::getModuleLogChannels(); channel; channel = channel->next)                       \
        {                                                                                                              \
            OMNI_MODULE_ADD_LOG_CHANNEL(out_, channel->name, &channel->level, channel->description);                   \
        }                                                                                                              \
        for (auto& schema : omni::structuredlog::getModuleSchemas())                                                   \
        {                                                                                                              \
            OMNI_MODULE_ADD_STRUCTURED_LOG_SCHEMA(out_, schema);                                                       \
        }                                                                                                              \
    } while (0)

#define OMNI_MODULE_SET_EXPORTS(out_)                                                                                  \
    OMNI_MODULE_SET_EXPORTS_WITHOUT_CARB(out_);                                                                        \
    OMNI_MODULE_SET_CARB_EXPORTS(out_)

#define OMNI_MODULE_SET_CARB_EXPORTS(out_)                                                                             \
    OMNI_RETURN_IF_FAILED(out_->addCarbClientName(g_carbClientName));                                                  \
    OMNI_RETURN_IF_FAILED(out_->addCarbFramework(&g_carbFramework, carb::kFrameworkVersion));                          \
    OMNI_RETURN_IF_FAILED(out_->addCarbIAssert(&g_carbAssert, carb::assert::IAssert::getInterfaceDesc()));             \
    OMNI_RETURN_IF_FAILED(out_->addCarbILogging(&g_carbLogging, &g_carbLogFn,                                          \
                                                [](int32_t logLevel) { g_carbLogLevel = logLevel; }, &g_carbLogLevel,  \
                                                carb::logging::ILogging::getInterfaceDesc()));                         \
    OMNI_RETURN_IF_FAILED(out_->addCarbIProfiler(&g_carbProfiler, carb::profiler::IProfiler::getInterfaceDesc()));     \
    OMNI_RETURN_IF_FAILED(                                                                                             \
        out_->addCarbIL10n(&g_carbLocalization, &g_localizationFn, carb::l10n::IL10n::getInterfaceDesc()))

#define OMNI_APP_GLOBALS(clientName, clientDescription) CARB_GLOBALS_EX(clientName, clientDescription)

#define OMNI_CORE_START(args_)                                                                                         \
    omniCoreStart(args_);                                                                                              \
    omni::log::addModulesChannels();                                                                                   \
    omni::structuredlog::addModulesSchemas();                                                                          \
    carb::detail::registerAtexitHandler()

#define OMNI_CORE_STOP()                                                                                               \
    omni::log::removeModulesChannels();                                                                                \
    omniCoreStop()

#define OMNI_CORE_STOP_FOR_BINDINGS()                                                                                  \
    omni::log::removeModulesChannels();                                                                                \
    omniCoreStopForBindings()

constexpr uint16_t kOmniCoreStartArgsVersion = 1;

using OmniCoreStartFlags = uint32_t;

constexpr OmniCoreStartFlags fStartFlagDisableILog = 0x00000001;

constexpr OmniCoreStartFlags fStartFlagDisableIStructuredLog = 0x00000002;

class OmniCoreStartArgs
{
public:
    uint16_t version;

    uint16_t byteCount;

    OmniCoreStartFlags flags;

    omni::core::ITypeFactory* typeFactory;

    omni::log::ILog* log;

    omni::structuredlog::IStructuredLog* structuredLog;

    void* reserved[12];

    OmniCoreStartArgs()
    {
        std::memset(this, 0, sizeof(*this));
        version = kOmniCoreStartArgsVersion;
        byteCount = sizeof(*this);
    }

    OmniCoreStartArgs(omni::core::ITypeFactory* factory_,
                      omni::log::ILog* log_ = nullptr,
                      omni::structuredlog::IStructuredLog* strucLog_ = nullptr)
        : OmniCoreStartArgs()
    {
        typeFactory = factory_;
        log = log_;
        structuredLog = strucLog_;
    }
};

CARB_ASSERT_INTEROP_SAFE(OmniCoreStartArgs);
static_assert((8 + 15 * sizeof(void*)) == sizeof(OmniCoreStartArgs), "OmniCoreStartArgs has an unexpected size");

OMNI_API void omniCoreStart(const OmniCoreStartArgs* args);

OMNI_API void omniCoreStop();

OMNI_API void omniCoreStopForBindings();

OMNI_API void omniReleaseStructuredLog();

#include "../../carb/ClientUtils.h"