BsGLPixelFormat.cpp 8.9 KB

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