yum-mirror/slang

Making it easier to work with shaders

git clone https://git.yummers.dev/yum-mirror/slang

Jay KwakDisable Link-Time-Optimization by default (#7345)7f04adbfb

master
3.2 KiB114 linesraw
1#ifndef SLANG_CORE_SHARED_LIBRARY_H
2#define SLANG_CORE_SHARED_LIBRARY_H
3
4#include "../core/slang-com-object.h"
5#include "../core/slang-common.h"
6#include "../core/slang-dictionary.h"
7#include "../core/slang-io.h"
8#include "../core/slang-platform.h"
9#include "slang-com-helper.h"
10#include "slang-com-ptr.h"
11#include "slang.h"
12
13namespace Slang
14{
15
16class DefaultSharedLibraryLoader : public ISlangSharedLibraryLoader
17{
18public:
19    // ISlangUnknown
20    // override ref counting, as DefaultSharedLibraryLoader is singleton
21    SLANG_IUNKNOWN_QUERY_INTERFACE
22    SLANG_NO_THROW uint32_t SLANG_MCALL addRef() SLANG_OVERRIDE { return 1; }
23    SLANG_NO_THROW uint32_t SLANG_MCALL release() SLANG_OVERRIDE { return 1; }
24
25    // ISlangSharedLibraryLoader
26    virtual SLANG_NO_THROW SlangResult SLANG_MCALL
27    loadSharedLibrary(const char* path, ISlangSharedLibrary** outSharedLibrary) SLANG_OVERRIDE;
28
29    SlangResult loadPlatformSharedLibrary(const char* path, ISlangSharedLibrary** outSharedLibrary);
30
31    /// Get the singleton
32    static DefaultSharedLibraryLoader* getSingleton() { return &s_singleton; }
33
34
35    static SlangResult load(
36        ISlangSharedLibraryLoader* loader,
37        const String& path,
38        const String& name,
39        ISlangSharedLibrary** outLibrary);
40
41private:
42    /// Make so not constructible
43    DefaultSharedLibraryLoader() {}
44    virtual ~DefaultSharedLibraryLoader() {}
45
46    ISlangUnknown* getInterface(const Guid& guid);
47
48    static DefaultSharedLibraryLoader s_singleton;
49};
50
51class DefaultSharedLibrary : public ComBaseObject, public ISlangSharedLibrary
52{
53public:
54    SLANG_CLASS_GUID(0xe7f2597b, 0xf803, 0x4b6e, {0xaf, 0x8b, 0xcb, 0xe3, 0xa2, 0x21, 0xfd, 0x5a})
55
56    // ISlangUnknown
57    SLANG_COM_BASE_IUNKNOWN_ALL
58    // ICastable
59    virtual SLANG_NO_THROW void* SLANG_MCALL castAs(const SlangUUID& guid) SLANG_OVERRIDE;
60    // ISlangSharedLibrary
61    virtual SLANG_NO_THROW void* SLANG_MCALL findSymbolAddressByName(char const* name)
62        SLANG_OVERRIDE;
63
64    /// Ctor.
65    DefaultSharedLibrary(const SharedLibrary::Handle sharedLibraryHandle)
66        : m_sharedLibraryHandle(sharedLibraryHandle)
67    {
68        SLANG_ASSERT(sharedLibraryHandle);
69    }
70
71    /// Need virtual dtor to keep delete this happy
72    virtual ~DefaultSharedLibrary();
73
74protected:
75    void* getInterface(const Guid& guid);
76    void* getObject(const Guid& guid);
77
78    SharedLibrary::Handle m_sharedLibraryHandle = nullptr;
79};
80
81class ScopeSharedLibrary : public DefaultSharedLibrary
82{
83public:
84    typedef DefaultSharedLibrary Super;
85
86    static ComPtr<ISlangSharedLibrary> create(
87        const SharedLibrary::Handle sharedLibraryHandle,
88        ISlangUnknown* scope)
89    {
90        return ComPtr<ISlangSharedLibrary>(new ScopeSharedLibrary(sharedLibraryHandle, scope));
91    }
92
93    /// Ctor
94    ScopeSharedLibrary(const SharedLibrary::Handle sharedLibraryHandle, ISlangUnknown* scope)
95        : Super(sharedLibraryHandle), m_scope(scope)
96    {
97    }
98
99    virtual ~ScopeSharedLibrary();
100
101protected:
102    ComPtr<ISlangUnknown> m_scope;
103};
104
105class SharedLibraryUtils
106{
107public:
108    static String getSharedLibraryFileName(void* symbolInLib);
109    static uint64_t getSharedLibraryTimestamp(void* symbolInLib);
110};
111
112} // namespace Slang
113
114#endif // SLANG_SHARED_LIBRARY_H_INCLUDED