diff options
| author | Ellie Hermaszewska <ellieh@nvidia.com> | 2024-10-29 14:49:26 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-10-29 14:49:26 +0800 |
| commit | f65d756bff8d4c5cbc15bd0322a2ae8e6b896a21 (patch) | |
| tree | ea1d61342cd29368e19135000ec2948813096205 /source/core/slang-platform.h | |
| parent | a729c15e9dce9f5116a38afc66329ab2ca4cea54 (diff) | |
format
* format
* Minor test fixes
* enable checking cpp format in ci
Diffstat (limited to 'source/core/slang-platform.h')
| -rw-r--r-- | source/core/slang-platform.h | 277 |
1 files changed, 142 insertions, 135 deletions
diff --git a/source/core/slang-platform.h b/source/core/slang-platform.h index 81bae88d6..0b97aca6d 100644 --- a/source/core/slang-platform.h +++ b/source/core/slang-platform.h @@ -7,150 +7,157 @@ namespace Slang { - enum class PlatformKind : uint8_t +enum class PlatformKind : uint8_t +{ + Unknown, + WinRT, + XBoxOne, + Win64, + Win32, + X360, + Android, + Linux, + IOS, + OSX, + PS3, + PS4, + PSP2, + WIIU, + CountOf, +}; + +typedef uint32_t PlatformFlags; +struct PlatformFlag +{ + enum Enum { - Unknown, - WinRT, - XBoxOne, - Win64, - Win32, - X360, - Android, - Linux, - IOS, - OSX, - PS3, - PS4, - PSP2, - WIIU, - CountOf, + Unknown = 1 << int(PlatformKind::Unknown), + WinRT = 1 << int(PlatformKind::WinRT), + XBoxOne = 1 << int(PlatformKind::XBoxOne), + Win64 = 1 << int(PlatformKind::Win64), + Win32 = 1 << int(PlatformKind::Win32), + X360 = 1 << int(PlatformKind::X360), + Android = 1 << int(PlatformKind::Android), + Linux = 1 << int(PlatformKind::Linux), + IOS = 1 << int(PlatformKind::IOS), + OSX = 1 << int(PlatformKind::OSX), + PS3 = 1 << int(PlatformKind::PS3), + PS4 = 1 << int(PlatformKind::PS4), + PSP2 = 1 << int(PlatformKind::PSP2), + WIIU = 1 << int(PlatformKind::WIIU), }; +}; - typedef uint32_t PlatformFlags; - struct PlatformFlag - { - enum Enum - { - Unknown = 1 << int(PlatformKind::Unknown), - WinRT = 1 << int(PlatformKind::WinRT), - XBoxOne = 1 << int(PlatformKind::XBoxOne), - Win64 = 1 << int(PlatformKind::Win64), - Win32 = 1 << int(PlatformKind::Win32), - X360 = 1 << int(PlatformKind::X360), - Android = 1 << int(PlatformKind::Android), - Linux = 1 << int(PlatformKind::Linux), - IOS = 1 << int(PlatformKind::IOS), - OSX = 1 << int(PlatformKind::OSX), - PS3 = 1 << int(PlatformKind::PS3), - PS4 = 1 << int(PlatformKind::PS4), - PSP2 = 1 << int(PlatformKind::PSP2), - WIIU = 1 << int(PlatformKind::WIIU), - }; - }; +enum class PlatformFamily : uint8_t +{ + Unknown, + Windows, + Microsoft, + Linux, + Apple, + Unix, + CountOf, +}; + +// Interface for working with shared libraries +// in a platform-independent fashion. +struct SharedLibrary +{ + typedef struct SharedLibraryImpl* Handle; + + typedef void (*FuncPtr)(void); + + /// Load via an unadorned path/filename. + /// + /// The unadorned path here means without a path without any platform specific filename + /// elements. This typically means no extension and no prefix. On windows this means without the + /// '.dll' extension. On linux this means without the 'lib' prefix and '.so' extension. To load + /// with a platform specific filename use the 'loadWithPlatformFilename' API Most platforms have + /// a built in mechanism to search for shared libraries, such that shared libraries are often + /// just passed by filename. + /// + /// @param the unadorned filename/path + /// @return Returns a non null handle for the shared library on success. nullptr indicated + /// failure + static SlangResult load(const char* path, Handle& handleOut); + + /// Attempt to load a shared library for + /// the current platform. Returns null handle on failure + /// The platform specific filename can be generated from a call to appendPlatformFileName + /// + /// @param platform the platform specific file name/ or path + /// @return Returns a non null handle for the shared library on success. nullptr indicated + /// failure + static SlangResult loadWithPlatformPath(char const* platformPath, Handle& handleOut); + + /// Unload the library that was returned from load as handle + /// @param The valid handle returned from load + static void unload(Handle handle); + + /// Given a shared library handle and a name, return the associated object + /// Return nullptr if object is not found + /// @param The shared library handle as returned by loadPlatformLibrary + static void* findSymbolAddressByName(Handle handle, char const* name); + + /// Append to the end of dst, the name, with any platform specific additions + /// The input name should be unadorned with any 'lib' prefix or extension + static void appendPlatformFileName(const UnownedStringSlice& name, StringBuilder& dst); + + /// Given a path, calculate that path with the filename replaced with the platform filename + /// (using appendPlatformFilename) + static String calcPlatformPath(const UnownedStringSlice& path); + static void calcPlatformPath(const UnownedStringSlice& path, StringBuilder& outBuilder); + + +private: + /// Not constructible! + SharedLibrary(); +}; + +struct PlatformUtil +{ + /// Appends a text interpretation of a result (as defined by supporting OS) + /// @param res Result to produce a string for + /// @param builderOut Append the string produced to builderOut + /// @return SLANG_OK if string is found and appended. Fail otherwise. SLANG_E_NOT_IMPLEMENTED if + /// there is no impl for this platform. + static SlangResult appendResult(SlangResult res, StringBuilder& builderOut); - enum class PlatformFamily : uint8_t - { - Unknown, - Windows, - Microsoft, - Linux, - Apple, - Unix, - CountOf, - }; + /// Get the platform kind as determined at compile time + static PlatformKind getPlatformKind(); - // Interface for working with shared libraries - // in a platform-independent fashion. - struct SharedLibrary - { - typedef struct SharedLibraryImpl* Handle; - - typedef void(*FuncPtr)(void); - - /// Load via an unadorned path/filename. - /// - /// The unadorned path here means without a path without any platform specific filename elements. - /// This typically means no extension and no prefix. - /// On windows this means without the '.dll' extension. - /// On linux this means without the 'lib' prefix and '.so' extension. - /// To load with a platform specific filename use the 'loadWithPlatformFilename' API - /// Most platforms have a built in mechanism to search for shared libraries, such that - /// shared libraries are often just passed by filename. - /// - /// @param the unadorned filename/path - /// @return Returns a non null handle for the shared library on success. nullptr indicated failure - static SlangResult load(const char* path, Handle& handleOut); - - /// Attempt to load a shared library for - /// the current platform. Returns null handle on failure - /// The platform specific filename can be generated from a call to appendPlatformFileName - /// - /// @param platform the platform specific file name/ or path - /// @return Returns a non null handle for the shared library on success. nullptr indicated failure - static SlangResult loadWithPlatformPath(char const* platformPath, Handle& handleOut); - - /// Unload the library that was returned from load as handle - /// @param The valid handle returned from load - static void unload(Handle handle); - - /// Given a shared library handle and a name, return the associated object - /// Return nullptr if object is not found - /// @param The shared library handle as returned by loadPlatformLibrary - static void* findSymbolAddressByName(Handle handle, char const* name); - - /// Append to the end of dst, the name, with any platform specific additions - /// The input name should be unadorned with any 'lib' prefix or extension - static void appendPlatformFileName(const UnownedStringSlice& name, StringBuilder& dst); - - /// Given a path, calculate that path with the filename replaced with the platform filename (using appendPlatformFilename) - static String calcPlatformPath(const UnownedStringSlice& path); - static void calcPlatformPath(const UnownedStringSlice& path, StringBuilder& outBuilder); - - - private: - /// Not constructible! - SharedLibrary(); - }; + /// Get the platforms that make up a family + static PlatformFlags getPlatformFlags(PlatformFamily family); - struct PlatformUtil + /// True if the kind is part of the family + static bool isFamily(PlatformFamily family, PlatformKind kind) { - /// Appends a text interpretation of a result (as defined by supporting OS) - /// @param res Result to produce a string for - /// @param builderOut Append the string produced to builderOut - /// @return SLANG_OK if string is found and appended. Fail otherwise. SLANG_E_NOT_IMPLEMENTED if there is no impl for this platform. - static SlangResult appendResult(SlangResult res, StringBuilder& builderOut); - - /// Get the platform kind as determined at compile time - static PlatformKind getPlatformKind(); - - /// Get the platforms that make up a family - static PlatformFlags getPlatformFlags(PlatformFamily family); - - /// True if the kind is part of the family - static bool isFamily(PlatformFamily family, PlatformKind kind) { return (getPlatformFlags(family) & (PlatformFlags(1) << int(kind))) != 0; } - - /// Given an environment name returns the set system variable. - /// Will return SLANG_E_NOT_FOUND if the variable is not set - static SlangResult getEnvironmentVariable(const UnownedStringSlice& name, StringBuilder& out); - - /// Get the path to this instance (the path to the dll/executable/shared library the call is in) - /// NOTE! This is not supported on all platforms, and will return SLANG_E_NOT_IMPLEMENTED in that scenario - static SlangResult getInstancePath(StringBuilder& out); - - /// Outputs message to a debug stream. Not all platforms support - /// this feature. - /// - /// @param text Text to be displayed in 'debugger output' - /// @return SLANG_E_NOT_AVAILABLE if not on this platform, and potentially other errors - static SlangResult outputDebugMessage(const char* text); - }; + return (getPlatformFlags(family) & (PlatformFlags(1) << int(kind))) != 0; + } + + /// Given an environment name returns the set system variable. + /// Will return SLANG_E_NOT_FOUND if the variable is not set + static SlangResult getEnvironmentVariable(const UnownedStringSlice& name, StringBuilder& out); + + /// Get the path to this instance (the path to the dll/executable/shared library the call is in) + /// NOTE! This is not supported on all platforms, and will return SLANG_E_NOT_IMPLEMENTED in + /// that scenario + static SlangResult getInstancePath(StringBuilder& out); + + /// Outputs message to a debug stream. Not all platforms support + /// this feature. + /// + /// @param text Text to be displayed in 'debugger output' + /// @return SLANG_E_NOT_AVAILABLE if not on this platform, and potentially other errors + static SlangResult outputDebugMessage(const char* text); +}; #ifndef _MSC_VER - #define _fileno fileno - #define _isatty isatty - #define _setmode setmode - #define _O_BINARY O_BINARY +#define _fileno fileno +#define _isatty isatty +#define _setmode setmode +#define _O_BINARY O_BINARY #endif -} +} // namespace Slang #endif |
