BsRenderAPICapabilities.h 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #pragma once
  4. #include "BsCorePrerequisites.h"
  5. #include "BsGpuProgram.h"
  6. #define CAPS_CATEGORY_SIZE 8i64
  7. #define BS_CAPS_BITSHIFT (64i64 - CAPS_CATEGORY_SIZE)
  8. #define CAPS_CATEGORY_MASK (((1i64 << CAPS_CATEGORY_SIZE) - 1i64) << BS_CAPS_BITSHIFT)
  9. #define BS_CAPS_VALUE(cat, val) ((cat << BS_CAPS_BITSHIFT) | (1i64 << val))
  10. #define MAX_BOUND_VERTEX_BUFFERS 32
  11. namespace BansheeEngine
  12. {
  13. /** @addtogroup RenderAPI-Internal
  14. * @{
  15. */
  16. /** Categories of render API capabilities. */
  17. enum CapabilitiesCategory : UINT64
  18. {
  19. CAPS_CATEGORY_COMMON = 0,
  20. CAPS_CATEGORY_D3D9 = 1,
  21. CAPS_CATEGORY_GL = 2,
  22. CAPS_CATEGORY_D3D11 = 3,
  23. CAPS_CATEGORY_COUNT = 32 /**< Maximum number of categories. */
  24. };
  25. /** Enum describing the different hardware capabilities we can check for. */
  26. enum Capabilities : UINT64
  27. {
  28. RSC_AUTOMIPMAP = BS_CAPS_VALUE(CAPS_CATEGORY_COMMON, 0), /**< Supports generating mipmaps in hardware. */
  29. RSC_ANISOTROPY = BS_CAPS_VALUE(CAPS_CATEGORY_COMMON, 1), /**< Supports anisotropic texture filtering. */
  30. RSC_CUBEMAPPING = BS_CAPS_VALUE(CAPS_CATEGORY_COMMON, 2), /**< Supports cube mapping. */
  31. RSC_TWO_SIDED_STENCIL = BS_CAPS_VALUE(CAPS_CATEGORY_COMMON, 3), /**< Supports separate stencil updates for both front and back faces. */
  32. RSC_STENCIL_WRAP = BS_CAPS_VALUE(CAPS_CATEGORY_COMMON, 4), /**< Supports wrapping the stencil value at the range extremes. */
  33. RSC_HWOCCLUSION = BS_CAPS_VALUE(CAPS_CATEGORY_COMMON, 5), /**< Supports hardware occlusion queries. */
  34. RSC_USER_CLIP_PLANES = BS_CAPS_VALUE(CAPS_CATEGORY_COMMON, 6), /**< Supports user clipping planes. */
  35. RSC_VERTEX_FORMAT_UBYTE4 = BS_CAPS_VALUE(CAPS_CATEGORY_COMMON, 7), /**< Supports the VET_UBYTE4 vertex element type. */
  36. RSC_INFINITE_FAR_PLANE = BS_CAPS_VALUE(CAPS_CATEGORY_COMMON, 8), /**< Supports infinite far plane projection. */
  37. RSC_HWRENDER_TO_TEXTURE = BS_CAPS_VALUE(CAPS_CATEGORY_COMMON, 9), /**< Supports hardware render-to-texture. */
  38. RSC_TEXTURE_FLOAT = BS_CAPS_VALUE(CAPS_CATEGORY_COMMON, 10), /**< Supports float textures and render targets. */
  39. RSC_NON_POWER_OF_2_TEXTURES = BS_CAPS_VALUE(CAPS_CATEGORY_COMMON, 11), /**< Supports non-power of two textures. */
  40. RSC_TEXTURE_3D = BS_CAPS_VALUE(CAPS_CATEGORY_COMMON, 12), /**< Supports 3d (volume) textures. */
  41. RSC_POINT_SPRITES = BS_CAPS_VALUE(CAPS_CATEGORY_COMMON, 13), /**< Supports basic point sprite rendering. */
  42. RSC_POINT_EXTENDED_PARAMETERS = BS_CAPS_VALUE(CAPS_CATEGORY_COMMON, 14), /**< Supports extra point parameters (minsize, maxsize, attenuation). */
  43. RSC_VERTEX_TEXTURE_FETCH = BS_CAPS_VALUE(CAPS_CATEGORY_COMMON, 15), /**< Supports vertex texture fetch. */
  44. RSC_MIPMAP_LOD_BIAS = BS_CAPS_VALUE(CAPS_CATEGORY_COMMON, 16), /**< Supports mipmap LOD biasing. */
  45. RSC_GEOMETRY_PROGRAM = BS_CAPS_VALUE(CAPS_CATEGORY_COMMON, 17), /**< Supports hardware geometry programs. */
  46. RSC_TEXTURE_COMPRESSION = BS_CAPS_VALUE(CAPS_CATEGORY_COMMON, 18), /**< Supports compressed textures. */
  47. RSC_TEXTURE_COMPRESSION_DXT = BS_CAPS_VALUE(CAPS_CATEGORY_COMMON, 19), /**< Supports compressed textures in the DXT/ST3C formats. */
  48. RSC_TEXTURE_COMPRESSION_VTC = BS_CAPS_VALUE(CAPS_CATEGORY_COMMON, 20), /**< Supports compressed textures in the VTC format. */
  49. RSC_TEXTURE_COMPRESSION_PVRTC = BS_CAPS_VALUE(CAPS_CATEGORY_COMMON, 21), /**< Supports compressed textures in the PVRTC format. */
  50. RSC_MRT_DIFFERENT_BIT_DEPTHS = BS_CAPS_VALUE(CAPS_CATEGORY_COMMON, 22), /**< Supports multiple render targets with different bit depths. */
  51. RSC_ALPHA_TO_COVERAGE = BS_CAPS_VALUE(CAPS_CATEGORY_COMMON, 23), /**< Supports Alpha to Coverage. */
  52. RSC_ADVANCED_BLEND_OPERATIONS = BS_CAPS_VALUE(CAPS_CATEGORY_COMMON, 24), /**< Supports blend operations like subtract, min, max. */
  53. RSC_SHADER_SUBROUTINE = BS_CAPS_VALUE(CAPS_CATEGORY_COMMON, 25), /**< Supports dynamic shader linking. */
  54. RSC_HWOCCLUSION_ASYNCHRONOUS = BS_CAPS_VALUE(CAPS_CATEGORY_COMMON, 26), /**< Support for async occlusion queries. */
  55. RSC_HWRENDER_TO_VERTEX_BUFFER = BS_CAPS_VALUE(CAPS_CATEGORY_COMMON, 27), /**< Supports rendering to vertex buffers. */
  56. RSC_TESSELLATION_PROGRAM = BS_CAPS_VALUE(CAPS_CATEGORY_COMMON, 28), /**< Supports hardware tessellation programs. */
  57. RSC_COMPUTE_PROGRAM = BS_CAPS_VALUE(CAPS_CATEGORY_COMMON, 29), /**< Supports hardware compute programs. */
  58. // ***** DirectX 9 specific caps *****
  59. RSC_PERSTAGECONSTANT = BS_CAPS_VALUE(CAPS_CATEGORY_D3D9, 0), /**< Are per stage constants supported. */
  60. // ***** GL Specific caps *****
  61. RSC_FBO = BS_CAPS_VALUE(CAPS_CATEGORY_GL, 0), /**< Support for Frame Buffer Objects. */
  62. RSC_PBUFFER = BS_CAPS_VALUE(CAPS_CATEGORY_GL, 1), /**< Support for PBuffers. */
  63. };
  64. /** Holds data about render system driver version. */
  65. struct BS_CORE_EXPORT DriverVersion
  66. {
  67. int major;
  68. int minor;
  69. int release;
  70. int build;
  71. DriverVersion()
  72. {
  73. major = minor = release = build = 0;
  74. }
  75. /** Returns the driver version as a single string. */
  76. String toString() const
  77. {
  78. StringStream str;
  79. str << major << "." << minor << "." << release << "." << build;
  80. return str.str();
  81. }
  82. /** Parses a string in the major.minor.release.build format and stores the version numbers. */
  83. void fromString(const String& versionString)
  84. {
  85. Vector<BansheeEngine::String> tokens = StringUtil::split(versionString, ".");
  86. if(!tokens.empty())
  87. {
  88. major = parseINT32(tokens[0]);
  89. if (tokens.size() > 1)
  90. minor = parseINT32(tokens[1]);
  91. if (tokens.size() > 2)
  92. release = parseINT32(tokens[2]);
  93. if (tokens.size() > 3)
  94. build = parseINT32(tokens[3]);
  95. }
  96. }
  97. };
  98. /** Types of GPU vendors. */
  99. enum GPUVendor
  100. {
  101. GPU_UNKNOWN = 0,
  102. GPU_NVIDIA = 1,
  103. GPU_AMD = 2,
  104. GPU_INTEL = 3,
  105. GPU_VENDOR_COUNT = 4
  106. };
  107. /**
  108. * Holds information about render hardware and driver capabilities and allows you to easily set and query those
  109. * capabilities.
  110. */
  111. class BS_CORE_EXPORT RenderAPICapabilities
  112. {
  113. public:
  114. RenderAPICapabilities ();
  115. virtual ~RenderAPICapabilities ();
  116. /** Sets the current driver version. */
  117. void setDriverVersion(const DriverVersion& version)
  118. {
  119. mDriverVersion = version;
  120. }
  121. /** Returns current driver version. */
  122. DriverVersion getDriverVersion() const
  123. {
  124. return mDriverVersion;
  125. }
  126. /** Returns vendor of the currently used GPU. */
  127. GPUVendor getVendor() const
  128. {
  129. return mVendor;
  130. }
  131. /** Sets the GPU vendor. */
  132. void setVendor(GPUVendor v)
  133. {
  134. mVendor = v;
  135. }
  136. /** Parses a vendor string and returns an enum with the vendor if parsed succesfully. */
  137. static GPUVendor vendorFromString(const String& vendorString);
  138. /** Converts a vendor enum to a string. */
  139. static String vendorToString(GPUVendor v);
  140. /** Sets the maximum number of texture units per pipeline stage. */
  141. void setNumTextureUnits(GpuProgramType type, UINT16 num)
  142. {
  143. mNumTextureUnitsPerStage[type] = num;
  144. }
  145. /** Sets the maximum number of texture units in all pipeline stages. */
  146. void setNumCombinedTextureUnits(UINT16 num)
  147. {
  148. mNumCombinedTextureUnits = num;
  149. }
  150. /** Sets the maximum number of GPU param block buffers per pipeline stage. */
  151. void setNumGpuParamBlockBuffers(GpuProgramType type, UINT16 num)
  152. {
  153. mNumGpuParamBlocksPerStage[type] = num;
  154. }
  155. /** Sets the maximum number of GPU param block buffers in all pipeline stages. */
  156. void setNumCombinedGpuParamBlockBuffers(UINT16 num)
  157. {
  158. mNumCombinedUniformBlocks = num;
  159. }
  160. /** Sets maximum stencil buffer depth in bits. */
  161. void setStencilBufferBitDepth(UINT16 num)
  162. {
  163. mStencilBufferBitDepth = num;
  164. }
  165. /** Sets maximum number of bound vertex buffers. */
  166. void setMaxBoundVertexBuffers(UINT32 num)
  167. {
  168. mMaxBoundVertexBuffers = num;
  169. }
  170. /** Sets maximum number of simultaneously set render targets. */
  171. void setNumMultiRenderTargets(UINT16 num)
  172. {
  173. mNumMultiRenderTargets = num;
  174. }
  175. /** Returns the number of texture units supported per pipeline stage. */
  176. UINT16 getNumTextureUnits(GpuProgramType type) const
  177. {
  178. auto iterFind = mNumTextureUnitsPerStage.find(type);
  179. if(iterFind != mNumTextureUnitsPerStage.end())
  180. return iterFind->second;
  181. else
  182. return 0;
  183. }
  184. /** Returns the number of texture units supported in all pipeline stages. */
  185. UINT16 getNumCombinedTextureUnits() const
  186. {
  187. return mNumCombinedTextureUnits;
  188. }
  189. /** Returns the maximum number of bound GPU program param block buffers per pipeline stage. */
  190. UINT16 getNumGpuParamBlockBuffers(GpuProgramType type) const
  191. {
  192. auto iterFind = mNumGpuParamBlocksPerStage.find(type);
  193. if(iterFind != mNumGpuParamBlocksPerStage.end())
  194. return iterFind->second;
  195. else
  196. return 0;
  197. }
  198. /** Returns the maximum number of bound GPU program param block buffers in all pipeline stages. */
  199. UINT16 getNumCombinedGpuParamBlockBuffers() const
  200. {
  201. return mNumCombinedUniformBlocks;
  202. }
  203. /** Returns the maximum number of bits available for the stencil buffer. */
  204. UINT16 getStencilBufferBitDepth() const
  205. {
  206. return mStencilBufferBitDepth;
  207. }
  208. /** Returns the maximum number of vertex buffers that can be bound at once. */
  209. UINT32 getMaxBoundVertexBuffers() const
  210. {
  211. return mMaxBoundVertexBuffers;
  212. }
  213. /** Returns the maximum number of render targets we can render to simultaneously. */
  214. UINT16 getNumMultiRenderTargets() const
  215. {
  216. return mNumMultiRenderTargets;
  217. }
  218. /** Sets a capability flag indicating this capability is supported. */
  219. void setCapability(const Capabilities c)
  220. {
  221. UINT64 index = (CAPS_CATEGORY_MASK & c) >> BS_CAPS_BITSHIFT;
  222. mCapabilities[index] |= (c & ~CAPS_CATEGORY_MASK);
  223. }
  224. /** Remove a capability flag indicating this capability is not supported (default). */
  225. void unsetCapability(const Capabilities c)
  226. {
  227. UINT64 index = (CAPS_CATEGORY_MASK & c) >> BS_CAPS_BITSHIFT;
  228. mCapabilities[index] &= (~c | CAPS_CATEGORY_MASK);
  229. }
  230. /** Checks is the specified capability supported. */
  231. bool hasCapability(const Capabilities c) const
  232. {
  233. UINT64 index = (CAPS_CATEGORY_MASK & c) >> BS_CAPS_BITSHIFT;
  234. return (mCapabilities[index] & (c & ~CAPS_CATEGORY_MASK)) != 0;
  235. }
  236. /** Adds a shader profile to the list of render-system specific supported profiles. */
  237. void addShaderProfile(const String& profile)
  238. {
  239. mSupportedShaderProfiles.insert(profile);
  240. }
  241. /** Adds a mapping between GPU program profile enum and render-system specific profile name. */
  242. void addGpuProgramProfile(GpuProgramProfile gpuProgProfile, const String& rsSpecificProfile)
  243. {
  244. mGenericToSpecificShaderProfileMap[gpuProgProfile] = rsSpecificProfile;
  245. }
  246. /** Returns true if the provided profile is supported. */
  247. bool isShaderProfileSupported(const String& profile) const
  248. {
  249. return (mSupportedShaderProfiles.end() != mSupportedShaderProfiles.find(profile));
  250. }
  251. /** Returns a set of all supported shader profiles. */
  252. const Set<String>& getSupportedShaderProfiles() const
  253. {
  254. return mSupportedShaderProfiles;
  255. }
  256. /**
  257. * Converts a generic GpuProgramProfile identifier into a render-system specific one. Returns an empty string if
  258. * conversion cannot be done.
  259. */
  260. String gpuProgProfileToRSSpecificProfile(GpuProgramProfile gpuProgProfile) const
  261. {
  262. auto iterFind = mGenericToSpecificShaderProfileMap.find(gpuProgProfile);
  263. if(mGenericToSpecificShaderProfileMap.end() != iterFind)
  264. {
  265. return iterFind->second;
  266. }
  267. return "";
  268. }
  269. /** Gets the number of floating-point constants vertex programs support. */
  270. UINT16 getVertexProgramConstantFloatCount() const
  271. {
  272. return mVertexProgramConstantFloatCount;
  273. }
  274. /** Gets the number of integer constants vertex programs support. */
  275. UINT16 getVertexProgramConstantIntCount() const
  276. {
  277. return mVertexProgramConstantIntCount;
  278. }
  279. /** Gets the number of boolean constants vertex programs support. */
  280. UINT16 getVertexProgramConstantBoolCount() const
  281. {
  282. return mVertexProgramConstantBoolCount;
  283. }
  284. /** Gets the number of floating-point constants geometry programs support. */
  285. UINT16 getGeometryProgramConstantFloatCount() const
  286. {
  287. return mGeometryProgramConstantFloatCount;
  288. }
  289. /** Gets the number of integer constants geometry programs support. */
  290. UINT16 getGeometryProgramConstantIntCount() const
  291. {
  292. return mGeometryProgramConstantIntCount;
  293. }
  294. /** Gets the number of boolean constants geometry programs support. */
  295. UINT16 getGeometryProgramConstantBoolCount() const
  296. {
  297. return mGeometryProgramConstantBoolCount;
  298. }
  299. /** Gets the number of floating-point constants fragment programs support. */
  300. UINT16 getFragmentProgramConstantFloatCount() const
  301. {
  302. return mFragmentProgramConstantFloatCount;
  303. }
  304. /** Gets the number of integer constants fragment programs support. */
  305. UINT16 getFragmentProgramConstantIntCount() const
  306. {
  307. return mFragmentProgramConstantIntCount;
  308. }
  309. /** Gets the number of boolean constants fragment programs support. */
  310. UINT16 getFragmentProgramConstantBoolCount() const
  311. {
  312. return mFragmentProgramConstantBoolCount;
  313. }
  314. /** Sets the current GPU device name. */
  315. void setDeviceName(const String& name)
  316. {
  317. mDeviceName = name;
  318. }
  319. /** Gets the current GPU device name. */
  320. String getDeviceName() const
  321. {
  322. return mDeviceName;
  323. }
  324. /** Sets the number of floating-point constants vertex programs support. */
  325. void setVertexProgramConstantFloatCount(UINT16 c)
  326. {
  327. mVertexProgramConstantFloatCount = c;
  328. }
  329. /** Sets the number of integer constants vertex programs support. */
  330. void setVertexProgramConstantIntCount(UINT16 c)
  331. {
  332. mVertexProgramConstantIntCount = c;
  333. }
  334. /** Sets the number of boolean constants vertex programs support. */
  335. void setVertexProgramConstantBoolCount(UINT16 c)
  336. {
  337. mVertexProgramConstantBoolCount = c;
  338. }
  339. /** Sets the number of floating-point constants geometry programs support. */
  340. void setGeometryProgramConstantFloatCount(UINT16 c)
  341. {
  342. mGeometryProgramConstantFloatCount = c;
  343. }
  344. /** Sets the number of integer constants geometry programs support. */
  345. void setGeometryProgramConstantIntCount(UINT16 c)
  346. {
  347. mGeometryProgramConstantIntCount = c;
  348. }
  349. /** Sets the number of boolean constants geometry programs support. */
  350. void setGeometryProgramConstantBoolCount(UINT16 c)
  351. {
  352. mGeometryProgramConstantBoolCount = c;
  353. }
  354. /** Sets the number of floating-point constants fragment programs support. */
  355. void setFragmentProgramConstantFloatCount(UINT16 c)
  356. {
  357. mFragmentProgramConstantFloatCount = c;
  358. }
  359. /** Sets the number of integer constants fragment programs support. */
  360. void setFragmentProgramConstantIntCount(UINT16 c)
  361. {
  362. mFragmentProgramConstantIntCount = c;
  363. }
  364. /** Sets the number of boolean constants fragment programs support. */
  365. void setFragmentProgramConstantBoolCount(UINT16 c)
  366. {
  367. mFragmentProgramConstantBoolCount = c;
  368. }
  369. /** Sets the maximum point screen size in pixels. */
  370. void setMaxPointSize(float s)
  371. {
  372. mMaxPointSize = s;
  373. }
  374. /** Gets the maximum point screen size in pixels. */
  375. float getMaxPointSize(void) const
  376. {
  377. return mMaxPointSize;
  378. }
  379. /** Sets the number of vertices a single geometry program run can emit. */
  380. void setGeometryProgramNumOutputVertices(int numOutputVertices)
  381. {
  382. mGeometryProgramNumOutputVertices = numOutputVertices;
  383. }
  384. /** Gets the number of vertices a single geometry program run can emit. */
  385. int getGeometryProgramNumOutputVertices(void) const
  386. {
  387. return mGeometryProgramNumOutputVertices;
  388. }
  389. /** Get the identifier of the render system from which these capabilities were generated. */
  390. StringID getRenderAPIName() const
  391. {
  392. return mRenderAPIName;
  393. }
  394. /** Set the identifier of the render system from which these capabilities were generated. */
  395. void setRenderAPIName(const StringID& rs)
  396. {
  397. mRenderAPIName = rs;
  398. }
  399. private:
  400. /** Initializes vendor enum -> vendor name mappings. */
  401. static void initVendorStrings();
  402. private:
  403. static Vector<String> msGPUVendorStrings;
  404. DriverVersion mDriverVersion;
  405. GPUVendor mVendor = GPU_UNKNOWN;
  406. // The number of texture units available per stage
  407. Map<GpuProgramType, UINT16> mNumTextureUnitsPerStage;
  408. // Total number of texture units available
  409. UINT16 mNumCombinedTextureUnits = 0;
  410. // The number of uniform blocks available per stage
  411. Map<GpuProgramType, UINT16> mNumGpuParamBlocksPerStage;
  412. // Total number of uniform blocks available
  413. UINT16 mNumCombinedUniformBlocks = 0;
  414. // The stencil buffer bit depth
  415. UINT16 mStencilBufferBitDepth = 0;
  416. // Maximum number of vertex buffers we can bind at once
  417. UINT32 mMaxBoundVertexBuffers = 0;
  418. // Stores the capabilities flags.
  419. UINT32 mCapabilities[CAPS_CATEGORY_COUNT];
  420. // The name of the device as reported by the render system
  421. String mDeviceName;
  422. // The identifier associated with the render API for which these capabilities are valid
  423. StringID mRenderAPIName;
  424. // The number of floating-point constants vertex programs support
  425. UINT16 mVertexProgramConstantFloatCount = 0;
  426. // The number of integer constants vertex programs support
  427. UINT16 mVertexProgramConstantIntCount = 0;
  428. // The number of boolean constants vertex programs support
  429. UINT16 mVertexProgramConstantBoolCount = 0;
  430. // The number of floating-point constants geometry programs support
  431. UINT16 mGeometryProgramConstantFloatCount = 0;
  432. // The number of integer constants vertex geometry support
  433. UINT16 mGeometryProgramConstantIntCount = 0;
  434. // The number of boolean constants vertex geometry support
  435. UINT16 mGeometryProgramConstantBoolCount = 0;
  436. // The number of floating-point constants fragment programs support
  437. UINT16 mFragmentProgramConstantFloatCount = 0;
  438. // The number of integer constants fragment programs support
  439. UINT16 mFragmentProgramConstantIntCount = 0;
  440. // The number of boolean constants fragment programs support
  441. UINT16 mFragmentProgramConstantBoolCount = 0;
  442. // The number of simultaneous render targets supported
  443. UINT16 mNumMultiRenderTargets = 0;
  444. // The maximum point size in pixels
  445. float mMaxPointSize = 0.0f;
  446. // The number of vertices a geometry program can emit in a single run
  447. UINT32 mGeometryProgramNumOutputVertices = 0;
  448. // The list of supported shader profiles
  449. Set<String> mSupportedShaderProfiles;
  450. // Allows us to convert a generic shader profile to a render-system specific one
  451. UnorderedMap<GpuProgramProfile, String> mGenericToSpecificShaderProfileMap;
  452. };
  453. /** @} */
  454. }