summaryrefslogtreecommitdiffstats
path: root/source/slang/slang.cpp
diff options
context:
space:
mode:
authorjsmall-nvidia <jsmall@nvidia.com>2018-11-06 14:28:25 -0500
committerGitHub <noreply@github.com>2018-11-06 14:28:25 -0500
commit1185bd464092f372430cbfaa15a7be4dcaa90752 (patch)
treeb3b68f2d9de00c0845f4912a797f10b27741031f /source/slang/slang.cpp
parent453331951b0df2a612f9bc0d68eab2ad786ec5bf (diff)
Feature/shared library refactor (#712)
* * Added ISlangSharedLibraryLoader and ISlangSharedLibrary * Implemented default implementations * Added slang API function to get/set the ISlangSharedLibraryLoader on the session * Put function caching onto the Session - so that if the loader is chaged, its easy to reset the shared libraries, and functions * Run premake. * Fix problem with setting null, would cause an unnecessary function/shared lib flush. * * Unload SharedLibrary when DefaultSharedLibrary is deleted. * Make SharedLibrary handle unload safely if already unloaded. * Refactor SharedLibrary, such that it becomes a utility class - simplifying it's semantics. * Simplified ISlangSharedLibrary such that doesn't have unload and isLoaded so easier to implement. Use updated SharedLibrary impl. * Disable aarch64 on windows * Premake windows files without aarch64 build. * Moved slang-shared-library to core (so can be used in code outside of main slang) Fixed problem in premake5 where on windows projects were incorrectly constructed * Allowed RefObject to base class of com types Added ConfigurableSharedLibraryLoader Added -dxc-path -fxc-path -glslang-path Fix problem with dxc-path not honoring it's path when loading dxil * Added documentation for command line control of dll loading paths. * Remove some tabbing issues. * Change name of include guard.
Diffstat (limited to 'source/slang/slang.cpp')
-rw-r--r--source/slang/slang.cpp50
1 files changed, 42 insertions, 8 deletions
diff --git a/source/slang/slang.cpp b/source/slang/slang.cpp
index 1e3d1e716..28b504831 100644
--- a/source/slang/slang.cpp
+++ b/source/slang/slang.cpp
@@ -2,6 +2,7 @@
#include "../core/slang-io.h"
#include "../core/slang-string-util.h"
+#include "../core/slang-shared-library.h"
#include "parameter-binding.h"
#include "lower-to-ir.h"
@@ -28,11 +29,16 @@
namespace Slang {
+
Session::Session()
{
// Initialize name pool
getNamePool()->setRootNamePool(getRootNamePool());
+ sharedLibraryLoader = DefaultSharedLibraryLoader::getSingleton();
+ // Set all the shared library function pointers to nullptr
+ ::memset(sharedLibraryFunctions, 0, sizeof(sharedLibraryFunctions));
+
// Initialize the lookup table of syntax classes:
#define SYNTAX_CLASS(NAME, BASE) \
@@ -310,17 +316,11 @@ static const Guid IID_ISlangBlob = SLANG_UUID_ISlangBlob;
/** Base class for simple blobs.
*/
-class BlobBase : public ISlangBlob
+class BlobBase : public ISlangBlob, public RefObject
{
public:
- uint32_t m_refCount = 0;
-
// ISlangUnknown
- SLANG_IUNKNOWN_ALL
-
- /// Need virtual dtor, because BlobBase is derived from and release impl used is the one in the base class (that doesn't know the derived type)
- /// Alternatively could be implemented by always using SLANG_IUNKNOWN_RELEASE in derived types - this would make derived types slightly smaller/faster
- virtual ~BlobBase() {}
+ SLANG_REF_OBJECT_IUNKNOWN_ALL
protected:
SLANG_FORCE_INLINE ISlangUnknown* getInterface(const Guid& guid)
@@ -1112,6 +1112,40 @@ SLANG_API void spAddBuiltins(
sourceString);
}
+SLANG_API void spSessionSetSharedLibraryLoader(
+ SlangSession* session,
+ ISlangSharedLibraryLoader* loader)
+{
+ auto s = SESSION(session);
+
+ if (!loader)
+ {
+ // If null set the default
+ loader = Slang::DefaultSharedLibraryLoader::getSingleton();
+ }
+
+ if (s->sharedLibraryLoader != loader)
+ {
+ // Need to clear all of the libraries
+ for (int i = 0; i < SLANG_COUNT_OF(s->sharedLibraries); ++i)
+ {
+ s->sharedLibraries[i].setNull();
+ }
+
+ // Clear all of the functions
+ ::memset(s->sharedLibraryFunctions, 0, sizeof(s->sharedLibraryFunctions));
+
+ // Set the loader
+ s->sharedLibraryLoader = loader;
+ }
+}
+
+SLANG_API ISlangSharedLibraryLoader* spSessionGetSharedLibraryLoader(
+ SlangSession* session)
+{
+ auto s = SESSION(session);
+ return (s->sharedLibraryLoader == Slang::DefaultSharedLibraryLoader::getSingleton()) ? nullptr : s->sharedLibraryLoader.get();
+}
SLANG_API SlangCompileRequest* spCreateCompileRequest(
SlangSession* session)