BsGLPixelFormat.cpp 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #include "BsGLPixelFormat.h"
  4. #include "BsRenderAPI.h"
  5. #include "BsBitwise.h"
  6. #include "BsDebug.h"
  7. namespace bs { namespace ct
  8. {
  9. PixelFormat GLPixelUtil::getClosestSupportedPF(PixelFormat pf, TextureType texType, int usage)
  10. {
  11. // Check for any obvious issues first
  12. PixelUtil::checkFormat(pf, texType, usage);
  13. // We don't check for any platform-specific format issues, assumed all are supported
  14. return pf;
  15. }
  16. GLenum GLPixelUtil::getGLOriginFormat(PixelFormat mFormat)
  17. {
  18. switch(mFormat)
  19. {
  20. case PF_R8:
  21. return GL_RED;
  22. case PF_R8G8:
  23. return GL_RG;
  24. case PF_R8G8B8:
  25. return GL_RGB;
  26. case PF_B8G8R8:
  27. return GL_BGR;
  28. case PF_R8G8B8A8:
  29. return GL_RGBA;
  30. case PF_B8G8R8A8:
  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_FLOAT_R11G11B10:
  49. return GL_RGB;
  50. case PF_UNORM_R10G10B10A2:
  51. return GL_RGBA;
  52. case PF_BC1:
  53. case PF_BC1a:
  54. case PF_BC3:
  55. case PF_BC7:
  56. return GL_RGBA;
  57. case PF_BC4:
  58. return GL_RED;
  59. case PF_BC5:
  60. return GL_RG;
  61. case PF_BC6H:
  62. return GL_RGB;
  63. default:
  64. return 0;
  65. }
  66. }
  67. GLenum GLPixelUtil::getGLOriginDataType(PixelFormat format)
  68. {
  69. switch(format)
  70. {
  71. case PF_R8:
  72. case PF_R8G8B8:
  73. case PF_B8G8R8:
  74. case PF_R8G8:
  75. return GL_UNSIGNED_BYTE;
  76. case PF_B8G8R8A8:
  77. case PF_R8G8B8A8:
  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. case PF_FLOAT_R11G11B10:
  90. return GL_UNSIGNED_INT_10F_11F_11F_REV;
  91. case PF_UNORM_R10G10B10A2:
  92. return GL_UNSIGNED_INT_2_10_10_10_REV;
  93. default:
  94. return 0;
  95. }
  96. }
  97. GLenum GLPixelUtil::getGLInternalFormat(PixelFormat mFormat, bool hwGamma)
  98. {
  99. switch(mFormat) {
  100. case PF_R8:
  101. return GL_R8;
  102. case PF_R8G8:
  103. return GL_RG8;
  104. case PF_R8G8B8:
  105. case PF_B8G8R8:
  106. if (hwGamma)
  107. return GL_SRGB8;
  108. else
  109. return GL_RGB8;
  110. case PF_B8G8R8A8:
  111. case PF_R8G8B8A8:
  112. if (hwGamma)
  113. return GL_SRGB8_ALPHA8;
  114. else
  115. return GL_RGBA8;
  116. case PF_FLOAT16_R:
  117. return GL_R16F;
  118. case PF_FLOAT16_RGB:
  119. return GL_RGB16F;
  120. case PF_FLOAT16_RG:
  121. return GL_RG16F;
  122. case PF_FLOAT16_RGBA:
  123. return GL_RGBA16F;
  124. case PF_FLOAT32_R:
  125. return GL_R32F;
  126. case PF_FLOAT32_RG:
  127. return GL_RG32F;
  128. case PF_FLOAT32_RGB:
  129. return GL_RGB32F;
  130. case PF_FLOAT32_RGBA:
  131. return GL_RGBA32F;
  132. case PF_BC1a:
  133. case PF_BC1:
  134. if (hwGamma)
  135. return GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT;
  136. else
  137. return GL_COMPRESSED_RGBA_S3TC_DXT1_EXT;
  138. case PF_BC2:
  139. if (hwGamma)
  140. return GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT;
  141. else
  142. return GL_COMPRESSED_RGBA_S3TC_DXT3_EXT;
  143. case PF_BC3:
  144. if (hwGamma)
  145. return GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT;
  146. else
  147. return GL_COMPRESSED_RGBA_S3TC_DXT5_EXT;
  148. case PF_BC4:
  149. return GL_COMPRESSED_RED_RGTC1;
  150. case PF_BC5:
  151. return GL_COMPRESSED_RG_RGTC2;
  152. case PF_BC6H:
  153. return GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT;
  154. case PF_BC7:
  155. if (hwGamma)
  156. return GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM;
  157. else
  158. return GL_COMPRESSED_RGBA_BPTC_UNORM;
  159. case PF_D16:
  160. return GL_DEPTH_COMPONENT16;
  161. case PF_D32:
  162. return GL_DEPTH_COMPONENT32F;
  163. case PF_D24S8:
  164. return GL_DEPTH24_STENCIL8;
  165. case PF_D32_S8X24:
  166. return GL_DEPTH32F_STENCIL8;
  167. case PF_FLOAT_R11G11B10:
  168. return GL_R11F_G11F_B10F;
  169. case PF_UNORM_R10G10B10A2:
  170. return GL_RGB10_A2;
  171. default:
  172. return GL_NONE;
  173. }
  174. }
  175. GLenum GLPixelUtil::getDepthStencilTypeFromPF(PixelFormat mFormat)
  176. {
  177. switch(mFormat)
  178. {
  179. case PF_D32_S8X24:
  180. return GL_FLOAT_32_UNSIGNED_INT_24_8_REV;
  181. case PF_D24S8:
  182. return GL_UNSIGNED_INT_24_8;
  183. case PF_D32:
  184. return GL_FLOAT;
  185. case PF_D16:
  186. return GL_UNSIGNED_SHORT;
  187. default:
  188. break;
  189. }
  190. LOGERR("Invalid depth stencil format");
  191. return PF_D32_S8X24;
  192. }
  193. GLenum GLPixelUtil::getDepthStencilFormatFromPF(PixelFormat mFormat)
  194. {
  195. switch (mFormat)
  196. {
  197. case PF_D32_S8X24:
  198. return GL_DEPTH_STENCIL;
  199. case PF_D24S8:
  200. return GL_DEPTH_STENCIL;
  201. case PF_D32:
  202. return GL_DEPTH_COMPONENT;
  203. case PF_D16:
  204. return GL_DEPTH_COMPONENT;
  205. default:
  206. break;
  207. }
  208. LOGERR("Invalid depth stencil format");
  209. return GL_DEPTH_STENCIL;
  210. }
  211. GLenum GLPixelUtil::getBufferFormat(GpuBufferFormat format)
  212. {
  213. static bool lookupInitialized = false;
  214. static GLenum lookup[BF_COUNT];
  215. if (!lookupInitialized)
  216. {
  217. lookup[BF_16X1F] = GL_R16F;
  218. lookup[BF_16X2F] = GL_RG16F;
  219. lookup[BF_16X4F] = GL_RGBA16F;
  220. lookup[BF_32X1F] = GL_R32F;
  221. lookup[BF_32X2F] = GL_RG32F;
  222. lookup[BF_32X3F] = GL_RGB32F;
  223. lookup[BF_32X4F] = GL_RGBA32F;
  224. lookup[BF_8X1] = GL_R8;
  225. lookup[BF_8X2] = GL_RG8;
  226. lookup[BF_8X4] = GL_RGBA8;
  227. lookup[BF_16X1] = GL_R16;
  228. lookup[BF_16X2] = GL_RG16;
  229. lookup[BF_16X4] = GL_RGBA16;
  230. lookup[BF_8X1S] = GL_R8I;
  231. lookup[BF_8X2S] = GL_RG8I;
  232. lookup[BF_8X4S] = GL_RGBA8I;
  233. lookup[BF_16X1S] = GL_R16I;
  234. lookup[BF_16X2S] = GL_RG16I;
  235. lookup[BF_16X4S] = GL_RGBA16I;
  236. lookup[BF_32X1S] = GL_R32I;
  237. lookup[BF_32X2S] = GL_RG32I;
  238. lookup[BF_32X3S] = GL_RGB32I;
  239. lookup[BF_32X4S] = GL_RGBA32I;
  240. lookup[BF_8X1U] = GL_R8UI;
  241. lookup[BF_8X2U] = GL_RG8UI;
  242. lookup[BF_8X4U] = GL_RGBA8UI;
  243. lookup[BF_16X1U] = GL_R16UI;
  244. lookup[BF_16X2U] = GL_RG16UI;
  245. lookup[BF_16X4U] = GL_RGBA16UI;
  246. lookup[BF_32X1U] = GL_R32UI;
  247. lookup[BF_32X2U] = GL_RG32UI;
  248. lookup[BF_32X3U] = GL_RGB32UI;
  249. lookup[BF_32X4U] = GL_RGBA32UI;
  250. lookupInitialized = true;
  251. }
  252. if (format >= BF_COUNT)
  253. return GL_NONE;
  254. return lookup[(UINT32)format];
  255. }
  256. }}