BsGLPixelFormat.cpp 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #include "BsGLPixelFormat.h"
  4. #include "BsRenderAPI.h"
  5. #include "BsBitwise.h"
  6. #include "BsDebug.h"
  7. namespace BansheeEngine
  8. {
  9. GLenum GLPixelUtil::getGLOriginFormat(PixelFormat mFormat)
  10. {
  11. switch(mFormat)
  12. {
  13. case PF_R8:
  14. return GL_RED;
  15. case PF_R8G8:
  16. return GL_RG;
  17. case PF_R8G8B8:
  18. return GL_RGB;
  19. case PF_B8G8R8:
  20. return GL_BGR;
  21. case PF_R8G8B8X8:
  22. case PF_R8G8B8A8:
  23. case PF_A8R8G8B8:
  24. case PF_X8R8G8B8:
  25. return GL_RGBA;
  26. case PF_B8G8R8A8:
  27. case PF_B8G8R8X8:
  28. case PF_A8B8G8R8:
  29. case PF_X8B8G8R8:
  30. return GL_BGRA;
  31. case PF_FLOAT16_R:
  32. return GL_RED;
  33. case PF_FLOAT16_RG:
  34. return GL_RG;
  35. case PF_FLOAT16_RGB:
  36. return GL_RGB;
  37. case PF_FLOAT16_RGBA:
  38. return GL_RGBA;
  39. case PF_FLOAT32_R:
  40. return GL_RED;
  41. case PF_FLOAT32_RG:
  42. return GL_RG;
  43. case PF_FLOAT32_RGB:
  44. return GL_RGB;
  45. case PF_FLOAT32_RGBA:
  46. return GL_RGBA;
  47. case PF_FLOAT_R11G11B10:
  48. return GL_RGB;
  49. case PF_UNORM_R10G10B10A2:
  50. return GL_RGBA;
  51. case PF_BC1:
  52. case PF_BC1a:
  53. case PF_BC3:
  54. case PF_BC7:
  55. return GL_RGBA;
  56. case PF_BC4:
  57. return GL_RED;
  58. case PF_BC5:
  59. return GL_RG;
  60. case PF_BC6H:
  61. return GL_RGB;
  62. default:
  63. return 0;
  64. }
  65. }
  66. GLenum GLPixelUtil::getGLOriginDataType(PixelFormat format)
  67. {
  68. switch(format)
  69. {
  70. case PF_R8:
  71. case PF_R8G8B8:
  72. case PF_B8G8R8:
  73. case PF_R8G8:
  74. return GL_UNSIGNED_BYTE;
  75. case PF_X8B8G8R8:
  76. case PF_A8B8G8R8:
  77. case PF_X8R8G8B8:
  78. case PF_A8R8G8B8:
  79. return GL_UNSIGNED_INT_8_8_8_8;
  80. case PF_B8G8R8A8:
  81. case PF_B8G8R8X8:
  82. case PF_R8G8B8A8:
  83. case PF_R8G8B8X8:
  84. return GL_UNSIGNED_INT_8_8_8_8_REV;
  85. case PF_FLOAT16_R:
  86. case PF_FLOAT16_RG:
  87. case PF_FLOAT16_RGB:
  88. case PF_FLOAT16_RGBA:
  89. return GL_HALF_FLOAT;
  90. case PF_FLOAT32_R:
  91. case PF_FLOAT32_RG:
  92. case PF_FLOAT32_RGB:
  93. case PF_FLOAT32_RGBA:
  94. return GL_FLOAT;
  95. case PF_FLOAT_R11G11B10:
  96. return GL_UNSIGNED_INT_10F_11F_11F_REV;
  97. case PF_UNORM_R10G10B10A2:
  98. return GL_UNSIGNED_INT_2_10_10_10_REV;
  99. default:
  100. return 0;
  101. }
  102. }
  103. GLenum GLPixelUtil::getBaseFormatFromCompressedInternalFormat(GLenum internalFormat)
  104. {
  105. switch(internalFormat)
  106. {
  107. case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT:
  108. case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
  109. case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT:
  110. case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT:
  111. case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT:
  112. case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT:
  113. case GL_COMPRESSED_RGBA_BPTC_UNORM:
  114. case GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM:
  115. return GL_RGBA;
  116. case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
  117. case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT:
  118. case GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT:
  119. case GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT:
  120. return GL_RGB;
  121. case GL_COMPRESSED_RED_RGTC1:
  122. case GL_COMPRESSED_SIGNED_RED_RGTC1:
  123. return GL_RED;
  124. case GL_COMPRESSED_RG_RGTC2:
  125. case GL_COMPRESSED_SIGNED_RG_RGTC2:
  126. return GL_RG;
  127. }
  128. return GL_RGBA;
  129. }
  130. GLenum GLPixelUtil::getGLInternalFormat(PixelFormat mFormat, bool hwGamma)
  131. {
  132. switch(mFormat) {
  133. case PF_R8:
  134. return GL_R8;
  135. case PF_R8G8:
  136. return GL_RG8;
  137. case PF_R8G8B8:
  138. case PF_B8G8R8:
  139. case PF_B8G8R8X8:
  140. case PF_R8G8B8X8:
  141. if (hwGamma)
  142. return GL_SRGB8;
  143. else
  144. return GL_RGB8;
  145. case PF_B8G8R8A8:
  146. case PF_R8G8B8A8:
  147. if (hwGamma)
  148. return GL_SRGB8_ALPHA8;
  149. else
  150. return GL_RGBA8;
  151. case PF_FLOAT16_R:
  152. return GL_R16F;
  153. case PF_FLOAT16_RGB:
  154. return GL_RGB16F;
  155. case PF_FLOAT16_RG:
  156. return GL_RG16F;
  157. case PF_FLOAT16_RGBA:
  158. return GL_RGBA16F;
  159. case PF_FLOAT32_R:
  160. return GL_R32F;
  161. case PF_FLOAT32_RG:
  162. return GL_RG32F;
  163. case PF_FLOAT32_RGB:
  164. return GL_RGB32F;
  165. case PF_FLOAT32_RGBA:
  166. return GL_RGBA32F;
  167. case PF_BC1a:
  168. case PF_BC1:
  169. if (hwGamma)
  170. return GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT;
  171. else
  172. return GL_COMPRESSED_RGBA_S3TC_DXT1_EXT;
  173. case PF_BC2:
  174. if (hwGamma)
  175. return GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT;
  176. else
  177. return GL_COMPRESSED_RGBA_S3TC_DXT3_EXT;
  178. case PF_BC3:
  179. if (hwGamma)
  180. return GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT;
  181. else
  182. return GL_COMPRESSED_RGBA_S3TC_DXT5_EXT;
  183. case PF_BC4:
  184. return GL_COMPRESSED_RED_RGTC1;
  185. case PF_BC5:
  186. return GL_COMPRESSED_RG_RGTC2;
  187. case PF_BC6H:
  188. return GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT;
  189. case PF_BC7:
  190. if (hwGamma)
  191. return GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM;
  192. else
  193. return GL_COMPRESSED_RGBA_BPTC_UNORM;
  194. case PF_D16:
  195. return GL_DEPTH_COMPONENT16;
  196. case PF_D32:
  197. return GL_DEPTH_COMPONENT32F;
  198. case PF_D24S8:
  199. return GL_DEPTH24_STENCIL8;
  200. case PF_D32_S8X24:
  201. return GL_DEPTH32F_STENCIL8;
  202. case PF_FLOAT_R11G11B10:
  203. return GL_R11F_G11F_B10F;
  204. case PF_UNORM_R10G10B10A2:
  205. return GL_RGB10_A2;
  206. default:
  207. return GL_NONE;
  208. }
  209. }
  210. GLenum GLPixelUtil::getClosestGLInternalFormat(PixelFormat mFormat, bool hwGamma)
  211. {
  212. GLenum format = getGLInternalFormat(mFormat, hwGamma);
  213. if(format == GL_NONE)
  214. {
  215. if (hwGamma)
  216. return GL_SRGB8;
  217. else
  218. return GL_RGBA8;
  219. }
  220. else
  221. return format;
  222. }
  223. GLenum GLPixelUtil::getDepthStencilTypeFromFormat(PixelFormat mFormat)
  224. {
  225. switch(mFormat)
  226. {
  227. case PF_D32_S8X24:
  228. return GL_FLOAT_32_UNSIGNED_INT_24_8_REV;
  229. case PF_D24S8:
  230. return GL_UNSIGNED_INT_24_8;
  231. case PF_D32:
  232. return GL_FLOAT;
  233. case PF_D16:
  234. return GL_UNSIGNED_SHORT;
  235. }
  236. BS_EXCEPT(InvalidParametersException, "Invalid depth stencil format");
  237. return PF_D24S8;
  238. }
  239. PixelFormat GLPixelUtil::getClosestEngineFormat(GLenum fmt)
  240. {
  241. switch(fmt)
  242. {
  243. case GL_R8:
  244. return PF_R8;
  245. case GL_RG8:
  246. return PF_R8G8;
  247. case GL_RGB8:
  248. case GL_SRGB8:
  249. return PF_R8G8B8X8;
  250. case GL_RGBA8:
  251. case GL_SRGB8_ALPHA8:
  252. return PF_R8G8B8A8;
  253. case GL_R16F:
  254. return PF_FLOAT16_R;
  255. case GL_RG16F:
  256. return PF_FLOAT16_RG;
  257. case GL_RG32F:
  258. return PF_FLOAT32_RG;
  259. case GL_R32F:
  260. return PF_FLOAT32_R;
  261. case GL_RGB16F:
  262. return PF_FLOAT16_RGB;
  263. case GL_RGBA16F:
  264. return PF_FLOAT16_RGBA;
  265. case GL_RGB32F:
  266. return PF_FLOAT32_RGB;
  267. case GL_RGBA32F:
  268. return PF_FLOAT32_RGBA;
  269. case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
  270. case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
  271. case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT:
  272. case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT:
  273. return PF_BC1;
  274. case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT:
  275. case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT:
  276. return PF_BC2;
  277. case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT:
  278. case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT:
  279. return PF_BC3;
  280. case GL_COMPRESSED_RED_RGTC1:
  281. case GL_COMPRESSED_SIGNED_RED_RGTC1:
  282. return PF_BC4;
  283. case GL_COMPRESSED_RG_RGTC2:
  284. case GL_COMPRESSED_SIGNED_RG_RGTC2:
  285. return PF_BC5;
  286. case GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT:
  287. case GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT:
  288. return PF_BC6H;
  289. case GL_COMPRESSED_RGBA_BPTC_UNORM:
  290. case GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM:
  291. return PF_BC7;
  292. case GL_DEPTH_COMPONENT16:
  293. return PF_D16;
  294. case GL_DEPTH_COMPONENT32F:
  295. return PF_D32;
  296. case GL_DEPTH24_STENCIL8:
  297. return PF_D24S8;
  298. case GL_DEPTH32F_STENCIL8:
  299. return PF_D32_S8X24;
  300. case GL_RGB10_A2:
  301. return PF_UNORM_R10G10B10A2;
  302. case GL_R11F_G11F_B10F:
  303. return PF_FLOAT_R11G11B10;
  304. default:
  305. return PF_R8G8B8A8;
  306. };
  307. }
  308. PixelFormat GLPixelUtil::getClosestValidFormat(PixelFormat fmt)
  309. {
  310. switch(fmt)
  311. {
  312. case PF_R8:
  313. return PF_R8;
  314. case PF_R8G8:
  315. return PF_R8G8;
  316. case PF_R8G8B8:
  317. case PF_B8G8R8:
  318. case PF_B8G8R8X8:
  319. case PF_R8G8B8X8:
  320. return PF_R8G8B8X8;
  321. case PF_B8G8R8A8:
  322. case PF_R8G8B8A8:
  323. return PF_R8G8B8A8;
  324. case PF_FLOAT16_R:
  325. return PF_FLOAT16_R;
  326. case PF_FLOAT16_RGB:
  327. return PF_FLOAT16_RGB;
  328. case PF_FLOAT16_RG:
  329. return PF_FLOAT16_RG;
  330. case PF_FLOAT16_RGBA:
  331. return PF_FLOAT16_RGBA;
  332. case PF_FLOAT32_R:
  333. return PF_FLOAT32_R;
  334. case PF_FLOAT32_RG:
  335. return PF_FLOAT32_RG;
  336. case PF_FLOAT32_RGB:
  337. return PF_FLOAT32_RGB;
  338. case PF_FLOAT32_RGBA:
  339. return PF_FLOAT32_RGBA;
  340. case PF_BC1:
  341. return PF_BC1;
  342. case PF_BC1a:
  343. return PF_BC1;
  344. case PF_BC3:
  345. return PF_BC3;
  346. case PF_BC4:
  347. return PF_BC4;
  348. case PF_BC5:
  349. return PF_BC5;
  350. case PF_BC6H:
  351. return PF_BC6H;
  352. case PF_BC7:
  353. return PF_BC7;
  354. case PF_D16:
  355. return PF_D16;
  356. case PF_D32:
  357. return PF_D32;
  358. case PF_D24S8:
  359. return PF_D24S8;
  360. case PF_D32_S8X24:
  361. return PF_D32_S8X24;
  362. case PF_UNORM_R10G10B10A2:
  363. return PF_UNORM_R10G10B10A2;
  364. case PF_FLOAT_R11G11B10:
  365. return PF_FLOAT_R11G11B10;
  366. default:
  367. return PF_UNKNOWN;
  368. }
  369. }
  370. };