aboutsummaryrefslogtreecommitdiff
path: root/demo/DemoApp/loader.h
diff options
context:
space:
mode:
Diffstat (limited to 'demo/DemoApp/loader.h')
-rw-r--r--demo/DemoApp/loader.h112
1 files changed, 112 insertions, 0 deletions
diff --git a/demo/DemoApp/loader.h b/demo/DemoApp/loader.h
new file mode 100644
index 0000000..3028325
--- /dev/null
+++ b/demo/DemoApp/loader.h
@@ -0,0 +1,112 @@
+/*
+ * Copyright (c) 2014-2017, 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.
+ */
+
+enum AppGraphCtxType
+{
+ APP_CONTEXT_D3D11 = 1,
+ APP_CONTEXT_D3D12 = 2
+};
+
+#ifndef DEMOAPP_STR
+#define XDEMOAPP_STR(s) DEMOAPP_STR(s)
+#define DEMOAPP_STR(s) #s
+#endif
+
+namespace
+{
+ const char* demoAppDLLName(AppGraphCtxType type)
+ {
+ return (type == APP_CONTEXT_D3D12) ?
+ "DemoAppD3D12" XDEMOAPP_STR(DLL_SUFFIX) ".dll" :
+ "DemoAppD3D11" XDEMOAPP_STR(DLL_SUFFIX) ".dll";
+ }
+
+ const char* nvFlowDLLName(AppGraphCtxType type)
+ {
+ return (type == APP_CONTEXT_D3D12) ?
+ "NvFlowD3D12" XDEMOAPP_STR(DLL_SUFFIX) ".dll" :
+ "NvFlowD3D11" XDEMOAPP_STR(DLL_SUFFIX) ".dll";
+ }
+}
+
+void loadModules(AppGraphCtxType type);
+void unloadModules();
+
+void loadAppGraphCtx(AppGraphCtxType type);
+void unloadAppGraphCtx();
+
+void loadNvFlowInterop(AppGraphCtxType type);
+void unloadNvFlowInterop();
+
+void loadMesh(AppGraphCtxType type);
+void unloadMesh();
+
+void loadImgui(AppGraphCtxType type);
+void unloadImgui();
+
+void loadComputeContext(AppGraphCtxType type);
+void unloadComputeContext();
+
+template<unsigned int maxFunctionCount, void* loadobject(const char*), void unloadobject(void*), void* loadfunction(void*,const char*)>
+struct ModuleLoader
+{
+ static const int m_functionCount = maxFunctionCount;
+ void** m_functionPtrs[m_functionCount] = { nullptr };
+ const char* m_functionNames[m_functionCount] = { nullptr };
+
+ void* m_module = nullptr;
+
+ void* loadFunction(const char* name, int uid, void** ptr)
+ {
+ m_functionPtrs[uid] = ptr;
+ m_functionNames[uid] = name;
+ return SDL_LoadFunction(m_module, name);
+ }
+
+ template <int uid, class ret, class ...Args>
+ ret function(ret(*)(Args...args), const char* name, Args...args)
+ {
+ static void* func = loadFunction(name, uid, &func);
+
+ return ((ret(*)(Args...args))func)(args...);
+ }
+
+ void loadModule(const char* moduleName)
+ {
+ m_module = loadobject(moduleName);
+
+ // load functions with non-null names
+ for (int i = 0; i < m_functionCount; i++)
+ {
+ const char* name = m_functionNames[i];
+ void** funcPtr = m_functionPtrs[i];
+ if (name && funcPtr)
+ {
+ *funcPtr = loadfunction(m_module, name);
+ }
+ }
+ }
+
+ void unloadModule()
+ {
+ unloadobject(m_module);
+
+ for (int i = 0; i < m_functionCount; i++)
+ {
+ void** funcPtr = m_functionPtrs[i];
+ if (funcPtr)
+ {
+ *funcPtr = nullptr;
+ }
+ }
+ }
+
+ ModuleLoader() {}
+}; \ No newline at end of file