1 /*
2  * Copyright 2011-2019 Branimir Karadzic. All rights reserved.
3  * License: https://github.com/bkaradzic/bgfx/blob/master/LICENSE
4  */
5 
6 #ifndef BGFX_EMBEDDED_SHADER_H_HEADER_GUARD
7 #define BGFX_EMBEDDED_SHADER_H_HEADER_GUARD
8 
9 #include <bx/macros.h>
10 #include "bgfx.h"
11 
12 #define BGFX_EMBEDDED_SHADER_DXBC(...)
13 #define BGFX_EMBEDDED_SHADER_DX9BC(...)
14 #define BGFX_EMBEDDED_SHADER_PSSL(...)
15 #define BGFX_EMBEDDED_SHADER_ESSL(...)
16 #define BGFX_EMBEDDED_SHADER_GLSL(...)
17 #define BGFX_EMBEDDED_SHADER_METAL(...)
18 #define BGFX_EMBEDDED_SHADER_NVN(...)
19 #define BGFX_EMBEDDED_SHADER_SPIRV(...)
20 
21 #define BGFX_PLATFORM_SUPPORTS_DX9BC (0 \
22 		|| BX_PLATFORM_WINDOWS          \
23 		)
24 #define BGFX_PLATFORM_SUPPORTS_DXBC (0  \
25 		|| BX_PLATFORM_WINDOWS          \
26 		|| BX_PLATFORM_WINRT            \
27 		|| BX_PLATFORM_XBOXONE          \
28 		)
29 #define BGFX_PLATFORM_SUPPORTS_PSSL (0  \
30 		|| BX_PLATFORM_PS4              \
31 		)
32 #define BGFX_PLATFORM_SUPPORTS_ESSL (0  \
33 		|| BX_PLATFORM_ANDROID          \
34 		|| BX_PLATFORM_EMSCRIPTEN       \
35 		|| BX_PLATFORM_IOS              \
36 		|| BX_PLATFORM_LINUX            \
37 		|| BX_PLATFORM_OSX              \
38 		|| BX_PLATFORM_RPI              \
39 		|| BX_PLATFORM_STEAMLINK        \
40 		|| BX_PLATFORM_WINDOWS          \
41 		)
42 #define BGFX_PLATFORM_SUPPORTS_GLSL (0  \
43 		|| BX_PLATFORM_BSD              \
44 		|| BX_PLATFORM_LINUX            \
45 		|| BX_PLATFORM_OSX              \
46 		|| BX_PLATFORM_WINDOWS          \
47 		)
48 #define BGFX_PLATFORM_SUPPORTS_METAL (0 \
49 		|| BX_PLATFORM_IOS              \
50 		|| BX_PLATFORM_OSX              \
51 		)
52 #define BGFX_PLATFORM_SUPPORTS_NVN (0   \
53 		|| BX_PLATFORM_NX               \
54 		)
55 #define BGFX_PLATFORM_SUPPORTS_SPIRV (0 \
56 		|| BX_PLATFORM_ANDROID          \
57 		|| BX_PLATFORM_LINUX            \
58 		|| BX_PLATFORM_WINDOWS          \
59 		|| BX_PLATFORM_OSX              \
60 		)
61 
62 #if BGFX_PLATFORM_SUPPORTS_DX9BC
63 #	undef  BGFX_EMBEDDED_SHADER_DX9BC
64 #	define BGFX_EMBEDDED_SHADER_DX9BC(_renderer, _name) \
65 		{ _renderer, BX_CONCATENATE(_name, _dx9 ), BX_COUNTOF(BX_CONCATENATE(_name, _dx9 ) ) },
66 #endif // BGFX_PLATFORM_SUPPORTS_DX9BC
67 
68 #if BGFX_PLATFORM_SUPPORTS_DXBC
69 #	undef  BGFX_EMBEDDED_SHADER_DXBC
70 #	define BGFX_EMBEDDED_SHADER_DXBC(_renderer, _name) \
71 		{ _renderer, BX_CONCATENATE(_name, _dx11), BX_COUNTOF(BX_CONCATENATE(_name, _dx11) ) },
72 #endif // BGFX_PLATFORM_SUPPORTS_DXBC
73 
74 #if BGFX_PLATFORM_SUPPORTS_PSSL
75 #	undef  BGFX_EMBEDDED_SHADER_PSSL
76 #	define BGFX_EMBEDDED_SHADER_PSSL(_renderer, _name) \
77 		{ _renderer, BX_CONCATENATE(_name, _pssl), BX_CONCATENATE(_name, _pssl_size) },
78 #endif // BGFX_PLATFORM_SUPPORTS_PSSL
79 
80 #if BGFX_PLATFORM_SUPPORTS_ESSL
81 #	undef  BGFX_EMBEDDED_SHADER_ESSL
82 #	define BGFX_EMBEDDED_SHADER_ESSL(_renderer, _name) \
83 		{ _renderer, BX_CONCATENATE(_name, _glsl), BX_COUNTOF(BX_CONCATENATE(_name, _glsl) ) },
84 #endif // BGFX_PLATFORM_SUPPORTS_ESSL
85 
86 #if BGFX_PLATFORM_SUPPORTS_GLSL
87 #	undef  BGFX_EMBEDDED_SHADER_GLSL
88 #	define BGFX_EMBEDDED_SHADER_GLSL(_renderer, _name) \
89 		{ _renderer, BX_CONCATENATE(_name, _glsl), BX_COUNTOF(BX_CONCATENATE(_name, _glsl) ) },
90 #endif // BGFX_PLATFORM_SUPPORTS_GLSL
91 
92 #if BGFX_PLATFORM_SUPPORTS_SPIRV
93 #	undef  BGFX_EMBEDDED_SHADER_SPIRV
94 #	define BGFX_EMBEDDED_SHADER_SPIRV(_renderer, _name) \
95 		{ _renderer, BX_CONCATENATE(_name, _spv), BX_COUNTOF(BX_CONCATENATE(_name, _spv) ) },
96 #endif // BGFX_PLATFORM_SUPPORTS_SPIRV
97 
98 #if BGFX_PLATFORM_SUPPORTS_METAL
99 #	undef  BGFX_EMBEDDED_SHADER_METAL
100 #	define BGFX_EMBEDDED_SHADER_METAL(_renderer, _name) \
101 		{ _renderer, BX_CONCATENATE(_name, _mtl), BX_COUNTOF(BX_CONCATENATE(_name, _mtl) ) },
102 #endif // BGFX_PLATFORM_SUPPORTS_METAL
103 
104 #define BGFX_EMBEDDED_SHADER(_name)                                                                \
105 			{                                                                                      \
106 				#_name,                                                                            \
107 				{                                                                                  \
108 					BGFX_EMBEDDED_SHADER_DX9BC(bgfx::RendererType::Direct3D9,  _name)              \
109 					BGFX_EMBEDDED_SHADER_DXBC (bgfx::RendererType::Direct3D11, _name)              \
110 					BGFX_EMBEDDED_SHADER_DXBC (bgfx::RendererType::Direct3D12, _name)              \
111 					BGFX_EMBEDDED_SHADER_PSSL (bgfx::RendererType::Gnm,        _name)              \
112 					BGFX_EMBEDDED_SHADER_METAL(bgfx::RendererType::Metal,      _name)              \
113 					BGFX_EMBEDDED_SHADER_NVN  (bgfx::RendererType::Nvn,        _name)              \
114 					BGFX_EMBEDDED_SHADER_ESSL (bgfx::RendererType::OpenGLES,   _name)              \
115 					BGFX_EMBEDDED_SHADER_GLSL (bgfx::RendererType::OpenGL,     _name)              \
116 					BGFX_EMBEDDED_SHADER_SPIRV(bgfx::RendererType::Vulkan,     _name)              \
117 					{ bgfx::RendererType::Noop,  (const uint8_t*)"VSH\x5\x0\x0\x0\x0\x0\x0", 10 }, \
118 					{ bgfx::RendererType::Count, NULL, 0 }                                         \
119 				}                                                                                  \
120 			}
121 
122 #define BGFX_EMBEDDED_SHADER_END()                         \
123 			{                                              \
124 				NULL,                                      \
125 				{                                          \
126 					{ bgfx::RendererType::Count, NULL, 0 } \
127 				}                                          \
128 			}
129 
130 namespace bgfx
131 {
132 	struct EmbeddedShader
133 	{
134 		struct Data
135 		{
136 			RendererType::Enum type;
137 			const uint8_t* data;
138 			uint32_t size;
139 		};
140 
141 		const char* name;
142 		Data data[RendererType::Count];
143 	};
144 
145 	ShaderHandle createEmbeddedShader(const bgfx::EmbeddedShader* _es, RendererType::Enum _type, const char* _name);
146 
147 } // namespace bgfx
148 
149 #endif // BGFX_EMBEDDED_SHADER_H_HEADER_GUARD
150