BsGLPixelFormat.cpp 8.4 KB

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