BsGLPixelFormat.cpp 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356
  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_BC2a:
  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_BC1:
  158. if (hwGamma)
  159. return GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT;
  160. else
  161. return GL_COMPRESSED_RGBA_S3TC_DXT1_EXT;
  162. case PF_BC2a:
  163. if (hwGamma)
  164. return GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT;
  165. else
  166. return GL_COMPRESSED_RGBA_S3TC_DXT3_EXT;
  167. case PF_BC3:
  168. if (hwGamma)
  169. return GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT;
  170. else
  171. return GL_COMPRESSED_RGBA_S3TC_DXT5_EXT;
  172. case PF_BC4:
  173. return GL_COMPRESSED_RED_RGTC1;
  174. case PF_BC5:
  175. return GL_COMPRESSED_RG_RGTC2;
  176. case PF_BC6H:
  177. return GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT;
  178. case PF_BC7:
  179. if (hwGamma)
  180. return GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM;
  181. else
  182. return GL_COMPRESSED_RGBA_BPTC_UNORM;
  183. case PF_D16:
  184. return GL_DEPTH_COMPONENT16;
  185. case PF_D32:
  186. return GL_DEPTH_COMPONENT32F;
  187. case PF_D24S8:
  188. return GL_DEPTH24_STENCIL8;
  189. case PF_D32_S8X24:
  190. return GL_DEPTH32F_STENCIL8;
  191. default:
  192. return GL_NONE;
  193. }
  194. }
  195. GLenum GLPixelUtil::getClosestGLInternalFormat(PixelFormat mFormat, bool hwGamma)
  196. {
  197. GLenum format = getGLInternalFormat(mFormat, hwGamma);
  198. if(format == GL_NONE)
  199. {
  200. if (hwGamma)
  201. return GL_SRGB8;
  202. else
  203. return GL_RGBA8;
  204. }
  205. else
  206. return format;
  207. }
  208. GLenum GLPixelUtil::getDepthStencilTypeFromFormat(PixelFormat mFormat)
  209. {
  210. switch(mFormat)
  211. {
  212. case PF_D32_S8X24:
  213. return GL_FLOAT_32_UNSIGNED_INT_24_8_REV;
  214. case PF_D24S8:
  215. return GL_UNSIGNED_INT_24_8;
  216. case PF_D32:
  217. return GL_FLOAT;
  218. case PF_D16:
  219. return GL_UNSIGNED_SHORT;
  220. }
  221. BS_EXCEPT(InvalidParametersException, "Invalid depth stencil format");
  222. }
  223. PixelFormat GLPixelUtil::getClosestEngineFormat(GLenum fmt)
  224. {
  225. switch(fmt)
  226. {
  227. case GL_R8:
  228. return PF_R8;
  229. case GL_RG8:
  230. return PF_R8G8;
  231. case GL_RGB8:
  232. case GL_SRGB8:
  233. return PF_R8G8B8X8;
  234. case GL_RGBA8:
  235. case GL_SRGB8_ALPHA8:
  236. return PF_R8G8B8A8;
  237. case GL_R16F:
  238. return PF_FLOAT16_R;
  239. case GL_RG16F:
  240. return PF_FLOAT16_RG;
  241. case GL_RG32F:
  242. return PF_FLOAT32_RG;
  243. case GL_R32F:
  244. return PF_FLOAT32_R;
  245. case GL_RGB16F:
  246. return PF_FLOAT16_RGB;
  247. case GL_RGBA16F:
  248. return PF_FLOAT16_RGBA;
  249. case GL_RGB32F:
  250. return PF_FLOAT32_RGB;
  251. case GL_RGBA32F:
  252. return PF_FLOAT32_RGBA;
  253. case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
  254. case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
  255. case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT:
  256. case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT:
  257. return PF_BC1;
  258. case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT:
  259. case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT:
  260. return PF_BC2;
  261. case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT:
  262. case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT:
  263. return PF_BC3;
  264. case GL_COMPRESSED_RED_RGTC1:
  265. case GL_COMPRESSED_SIGNED_RED_RGTC1:
  266. return PF_BC4;
  267. case GL_COMPRESSED_RG_RGTC2:
  268. case GL_COMPRESSED_SIGNED_RG_RGTC2:
  269. return PF_BC5;
  270. case GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT:
  271. case GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT:
  272. return PF_BC6H;
  273. case GL_COMPRESSED_RGBA_BPTC_UNORM:
  274. case GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM:
  275. return PF_BC7;
  276. case GL_DEPTH_COMPONENT16:
  277. return PF_D16;
  278. case GL_DEPTH_COMPONENT32F:
  279. return PF_D32;
  280. case GL_DEPTH24_STENCIL8:
  281. return PF_D24S8;
  282. case GL_DEPTH32F_STENCIL8:
  283. return PF_D32_S8X24;
  284. default:
  285. return PF_R8G8B8A8;
  286. };
  287. }
  288. PixelFormat GLPixelUtil::getClosestValidFormat(PixelFormat fmt)
  289. {
  290. switch(fmt)
  291. {
  292. case PF_R8:
  293. return PF_R8;
  294. case PF_R8G8:
  295. return PF_R8G8;
  296. case PF_R8G8B8:
  297. case PF_B8G8R8:
  298. case PF_B8G8R8X8:
  299. case PF_R8G8B8X8:
  300. return PF_R8G8B8X8;
  301. case PF_B8G8R8A8:
  302. case PF_R8G8B8A8:
  303. return PF_R8G8B8A8;
  304. case PF_FLOAT16_R:
  305. return PF_FLOAT16_R;
  306. case PF_FLOAT16_RGB:
  307. return PF_FLOAT16_RGB;
  308. case PF_FLOAT16_RG:
  309. return PF_FLOAT16_RG;
  310. case PF_FLOAT16_RGBA:
  311. return PF_FLOAT16_RGBA;
  312. case PF_FLOAT32_R:
  313. return PF_FLOAT32_R;
  314. case PF_FLOAT32_RG:
  315. return PF_FLOAT32_RG;
  316. case PF_FLOAT32_RGB:
  317. return PF_FLOAT32_RGB;
  318. case PF_FLOAT32_RGBA:
  319. return PF_FLOAT32_RGBA;
  320. case PF_BC1:
  321. return PF_BC1;
  322. case PF_BC2a:
  323. return PF_BC2a;
  324. case PF_BC3:
  325. return PF_BC3;
  326. case PF_BC4:
  327. return PF_BC4;
  328. case PF_BC5:
  329. return PF_BC5;
  330. case PF_BC6H:
  331. return PF_BC6H;
  332. case PF_BC7:
  333. return PF_BC7;
  334. case PF_D16:
  335. return PF_D16;
  336. case PF_D32:
  337. return PF_D32;
  338. case PF_D24S8:
  339. return PF_D24S8;
  340. case PF_D32_S8X24:
  341. return PF_D32_S8X24;
  342. default:
  343. return PF_UNKNOWN;
  344. }
  345. }
  346. };