aboutsummaryrefslogtreecommitdiff
path: root/demo/DemoApp/loader.h
blob: 3028325cb7907b017a718e0842a186d01cfe70f4 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
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() {}
};