BsGLPixelFormat.cpp 8.7 KB

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