2
0

BsGLPixelFormat.cpp 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325
  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_DXT1:
  46. return GL_COMPRESSED_RGBA_S3TC_DXT1_EXT;
  47. case PF_DXT3:
  48. return GL_COMPRESSED_RGBA_S3TC_DXT3_EXT;
  49. case PF_DXT5:
  50. return GL_COMPRESSED_RGBA_S3TC_DXT5_EXT;
  51. default:
  52. return 0;
  53. }
  54. }
  55. GLenum GLPixelUtil::getGLOriginDataType(PixelFormat format)
  56. {
  57. switch(format)
  58. {
  59. case PF_R8:
  60. case PF_R8G8B8:
  61. case PF_B8G8R8:
  62. case PF_R8G8:
  63. return GL_UNSIGNED_BYTE;
  64. case PF_X8B8G8R8:
  65. case PF_A8B8G8R8:
  66. case PF_X8R8G8B8:
  67. case PF_A8R8G8B8:
  68. return GL_UNSIGNED_INT_8_8_8_8;
  69. case PF_B8G8R8A8:
  70. case PF_B8G8R8X8:
  71. case PF_R8G8B8A8:
  72. case PF_R8G8B8X8:
  73. return GL_UNSIGNED_INT_8_8_8_8_REV;
  74. case PF_FLOAT16_R:
  75. case PF_FLOAT16_RG:
  76. case PF_FLOAT16_RGB:
  77. case PF_FLOAT16_RGBA:
  78. return GL_HALF_FLOAT;
  79. case PF_FLOAT32_R:
  80. case PF_FLOAT32_RG:
  81. case PF_FLOAT32_RGB:
  82. case PF_FLOAT32_RGBA:
  83. return GL_FLOAT;
  84. default:
  85. return 0;
  86. }
  87. }
  88. GLenum GLPixelUtil::getBaseFormatFromCompressedInternalFormat(GLenum internalFormat)
  89. {
  90. switch(internalFormat)
  91. {
  92. case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT:
  93. case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
  94. case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT:
  95. case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT:
  96. case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT:
  97. case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT:
  98. return GL_RGBA;
  99. case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
  100. case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT:
  101. return GL_RGB;
  102. case GL_COMPRESSED_RED_RGTC1:
  103. case GL_COMPRESSED_SIGNED_RED_RGTC1:
  104. return GL_RED;
  105. case GL_COMPRESSED_RG_RGTC2:
  106. case GL_COMPRESSED_SIGNED_RG_RGTC2:
  107. return GL_RG;
  108. }
  109. return GL_RGBA;
  110. }
  111. GLenum GLPixelUtil::getGLInternalFormat(PixelFormat mFormat, bool hwGamma)
  112. {
  113. switch(mFormat) {
  114. case PF_R8:
  115. return GL_R8;
  116. case PF_R8G8:
  117. return GL_RG8;
  118. case PF_R8G8B8:
  119. case PF_B8G8R8:
  120. case PF_B8G8R8X8:
  121. case PF_R8G8B8X8:
  122. if (hwGamma)
  123. return GL_SRGB8;
  124. else
  125. return GL_RGB8;
  126. case PF_B8G8R8A8:
  127. case PF_R8G8B8A8:
  128. if (hwGamma)
  129. return GL_SRGB8_ALPHA8;
  130. else
  131. return GL_RGBA8;
  132. case PF_FLOAT16_R:
  133. return GL_R16F;
  134. case PF_FLOAT16_RGB:
  135. return GL_RGB16F;
  136. case PF_FLOAT16_RG:
  137. return GL_RG16F;
  138. case PF_FLOAT16_RGBA:
  139. return GL_RGBA16F;
  140. case PF_FLOAT32_R:
  141. return GL_R32F;
  142. case PF_FLOAT32_RG:
  143. return GL_RG32F;
  144. case PF_FLOAT32_RGB:
  145. return GL_RGB32F;
  146. case PF_FLOAT32_RGBA:
  147. return GL_RGBA32F;
  148. case PF_DXT1:
  149. if (hwGamma)
  150. return GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT;
  151. else
  152. return GL_COMPRESSED_RGBA_S3TC_DXT1_EXT;
  153. case PF_DXT3:
  154. if (hwGamma)
  155. return GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT;
  156. else
  157. return GL_COMPRESSED_RGBA_S3TC_DXT3_EXT;
  158. case PF_DXT5:
  159. if (hwGamma)
  160. return GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT;
  161. else
  162. return GL_COMPRESSED_RGBA_S3TC_DXT5_EXT;
  163. case PF_D16:
  164. return GL_DEPTH_COMPONENT16;
  165. case PF_D32:
  166. return GL_DEPTH_COMPONENT32F;
  167. case PF_D24S8:
  168. return GL_DEPTH24_STENCIL8;
  169. case PF_D32_S8X24:
  170. return GL_DEPTH32F_STENCIL8;
  171. default:
  172. return GL_NONE;
  173. }
  174. }
  175. GLenum GLPixelUtil::getClosestGLInternalFormat(PixelFormat mFormat, bool hwGamma)
  176. {
  177. GLenum format = getGLInternalFormat(mFormat, hwGamma);
  178. if(format==GL_NONE)
  179. {
  180. if (hwGamma)
  181. return GL_SRGB8;
  182. else
  183. return GL_RGBA8;
  184. }
  185. else
  186. return format;
  187. }
  188. GLenum GLPixelUtil::getDepthStencilTypeFromFormat(PixelFormat mFormat)
  189. {
  190. switch(mFormat)
  191. {
  192. case PF_D32_S8X24:
  193. return GL_FLOAT_32_UNSIGNED_INT_24_8_REV;
  194. case PF_D24S8:
  195. return GL_UNSIGNED_INT_24_8;
  196. case PF_D32:
  197. return GL_FLOAT;
  198. case PF_D16:
  199. return GL_UNSIGNED_SHORT;
  200. }
  201. BS_EXCEPT(InvalidParametersException, "Invalid depth stencil format");
  202. }
  203. PixelFormat GLPixelUtil::getClosestEngineFormat(GLenum fmt)
  204. {
  205. switch(fmt)
  206. {
  207. case GL_R8:
  208. return PF_R8;
  209. case GL_RG8:
  210. return PF_R8G8;
  211. case GL_RGB8:
  212. case GL_SRGB8:
  213. return PF_R8G8B8X8;
  214. case GL_RGBA8:
  215. case GL_SRGB8_ALPHA8:
  216. return PF_R8G8B8A8;
  217. case GL_R16F:
  218. return PF_FLOAT16_R;
  219. case GL_RG16F:
  220. return PF_FLOAT16_RG;
  221. case GL_RG32F:
  222. return PF_FLOAT32_RG;
  223. case GL_R32F:
  224. return PF_FLOAT32_R;
  225. case GL_RGB16F:
  226. return PF_FLOAT16_RGB;
  227. case GL_RGBA16F:
  228. return PF_FLOAT16_RGBA;
  229. case GL_RGB32F:
  230. return PF_FLOAT32_RGB;
  231. case GL_RGBA32F:
  232. return PF_FLOAT32_RGBA;
  233. case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
  234. case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
  235. case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT:
  236. case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT:
  237. return PF_DXT1;
  238. case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT:
  239. case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT:
  240. return PF_DXT3;
  241. case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT:
  242. case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT:
  243. return PF_DXT5;
  244. case GL_DEPTH_COMPONENT16:
  245. return PF_D16;
  246. case GL_DEPTH_COMPONENT32F:
  247. return PF_D32;
  248. case GL_DEPTH24_STENCIL8:
  249. return PF_D24S8;
  250. case GL_DEPTH32F_STENCIL8:
  251. return PF_D32_S8X24;
  252. default:
  253. return PF_R8G8B8A8;
  254. };
  255. }
  256. PixelFormat GLPixelUtil::getClosestValidFormat(PixelFormat fmt)
  257. {
  258. switch(fmt)
  259. {
  260. case PF_R8:
  261. return PF_R8;
  262. case PF_R8G8:
  263. return PF_R8G8;
  264. case PF_R8G8B8:
  265. case PF_B8G8R8:
  266. case PF_B8G8R8X8:
  267. case PF_R8G8B8X8:
  268. return PF_R8G8B8X8;
  269. case PF_B8G8R8A8:
  270. case PF_R8G8B8A8:
  271. return PF_R8G8B8A8;
  272. case PF_FLOAT16_R:
  273. return PF_FLOAT16_R;
  274. case PF_FLOAT16_RGB:
  275. return PF_FLOAT16_RGB;
  276. case PF_FLOAT16_RG:
  277. return PF_FLOAT16_RG;
  278. case PF_FLOAT16_RGBA:
  279. return PF_FLOAT16_RGBA;
  280. case PF_FLOAT32_R:
  281. return PF_FLOAT32_R;
  282. case PF_FLOAT32_RG:
  283. return PF_FLOAT32_RG;
  284. case PF_FLOAT32_RGB:
  285. return PF_FLOAT32_RGB;
  286. case PF_FLOAT32_RGBA:
  287. return PF_FLOAT32_RGBA;
  288. case PF_DXT1:
  289. return PF_DXT1;
  290. case PF_DXT3:
  291. return PF_DXT3;
  292. case PF_DXT5:
  293. return PF_DXT5;
  294. case PF_D16:
  295. return PF_D16;
  296. case PF_D32:
  297. return PF_D32;
  298. case PF_D24S8:
  299. return PF_D24S8;
  300. case PF_D32_S8X24:
  301. return PF_D32_S8X24;
  302. default:
  303. return PF_UNKNOWN;
  304. }
  305. }
  306. UINT32 GLPixelUtil::optionalPO2(UINT32 value)
  307. {
  308. const RenderSystemCapabilities *caps = BansheeEngine::RenderSystem::instancePtr()->getCapabilities();
  309. if(caps->hasCapability(RSC_NON_POWER_OF_2_TEXTURES))
  310. return value;
  311. else
  312. return Bitwise::firstPO2From((UINT32)value);
  313. }
  314. };