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