CmGLPixelFormat.cpp 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384
  1. /*
  2. -----------------------------------------------------------------------------
  3. This source file is part of OGRE
  4. (Object-oriented Graphics Rendering Engine)
  5. For the latest info, see http://www.ogre3d.org
  6. Copyright (c) 2000-2011 Torus Knot Software Ltd
  7. Permission is hereby granted, free of charge, to any person obtaining a copy
  8. of this software and associated documentation files (the "Software"), to deal
  9. in the Software without restriction, including without limitation the rights
  10. to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  11. copies of the Software, and to permit persons to whom the Software is
  12. furnished to do so, subject to the following conditions:
  13. The above copyright notice and this permission notice shall be included in
  14. all copies or substantial portions of the Software.
  15. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  16. IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  17. FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  18. AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  19. LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  20. OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  21. THE SOFTWARE.
  22. -----------------------------------------------------------------------------
  23. */
  24. #include "CmGLPixelFormat.h"
  25. #include "CmRenderSystem.h"
  26. #include "CmBitwise.h"
  27. #include "CmRenderSystemManager.h"
  28. namespace CamelotEngine {
  29. //-----------------------------------------------------------------------------
  30. GLenum GLPixelUtil::getGLOriginFormat(PixelFormat mFormat)
  31. {
  32. switch(mFormat)
  33. {
  34. case PF_A8:
  35. return GL_ALPHA;
  36. case PF_L8:
  37. return GL_LUMINANCE;
  38. case PF_L16:
  39. return GL_LUMINANCE;
  40. case PF_BYTE_LA:
  41. return GL_LUMINANCE_ALPHA;
  42. case PF_R3G3B2:
  43. return GL_RGB;
  44. case PF_A1R5G5B5:
  45. return GL_BGRA;
  46. case PF_R5G6B5:
  47. return GL_RGB;
  48. case PF_B5G6R5:
  49. return GL_BGR;
  50. case PF_A4R4G4B4:
  51. return GL_BGRA;
  52. #if CM_ENDIAN == CM_ENDIAN_BIG
  53. // Formats are in native endian, so R8G8B8 on little endian is
  54. // BGR, on big endian it is RGB.
  55. case PF_R8G8B8:
  56. return GL_RGB;
  57. case PF_B8G8R8:
  58. return GL_BGR;
  59. #else
  60. case PF_R8G8B8:
  61. return GL_BGR;
  62. case PF_B8G8R8:
  63. return GL_RGB;
  64. #endif
  65. case PF_X8R8G8B8:
  66. case PF_A8R8G8B8:
  67. return GL_BGRA;
  68. case PF_X8B8G8R8:
  69. case PF_A8B8G8R8:
  70. return GL_RGBA;
  71. case PF_B8G8R8A8:
  72. return GL_BGRA;
  73. case PF_R8G8B8A8:
  74. return GL_RGBA;
  75. case PF_A2R10G10B10:
  76. return GL_BGRA;
  77. case PF_A2B10G10R10:
  78. return GL_RGBA;
  79. case PF_FLOAT16_R:
  80. return GL_LUMINANCE;
  81. case PF_FLOAT16_GR:
  82. return GL_LUMINANCE_ALPHA;
  83. case PF_FLOAT16_RGB:
  84. return GL_RGB;
  85. case PF_FLOAT16_RGBA:
  86. return GL_RGBA;
  87. case PF_FLOAT32_R:
  88. return GL_LUMINANCE;
  89. case PF_FLOAT32_GR:
  90. return GL_LUMINANCE_ALPHA;
  91. case PF_FLOAT32_RGB:
  92. return GL_RGB;
  93. case PF_FLOAT32_RGBA:
  94. return GL_RGBA;
  95. case PF_SHORT_RGBA:
  96. return GL_RGBA;
  97. case PF_SHORT_RGB:
  98. return GL_RGB;
  99. case PF_SHORT_GR:
  100. return GL_LUMINANCE_ALPHA;
  101. case PF_DXT1:
  102. return GL_COMPRESSED_RGBA_S3TC_DXT1_EXT;
  103. case PF_DXT3:
  104. return GL_COMPRESSED_RGBA_S3TC_DXT3_EXT;
  105. case PF_DXT5:
  106. return GL_COMPRESSED_RGBA_S3TC_DXT5_EXT;
  107. default:
  108. return 0;
  109. }
  110. }
  111. //-----------------------------------------------------------------------------
  112. GLenum GLPixelUtil::getGLOriginDataType(PixelFormat mFormat)
  113. {
  114. switch(mFormat)
  115. {
  116. case PF_A8:
  117. case PF_L8:
  118. case PF_R8G8B8:
  119. case PF_B8G8R8:
  120. case PF_BYTE_LA:
  121. return GL_UNSIGNED_BYTE;
  122. case PF_R3G3B2:
  123. return GL_UNSIGNED_BYTE_3_3_2;
  124. case PF_A1R5G5B5:
  125. return GL_UNSIGNED_SHORT_1_5_5_5_REV;
  126. case PF_R5G6B5:
  127. case PF_B5G6R5:
  128. return GL_UNSIGNED_SHORT_5_6_5;
  129. case PF_A4R4G4B4:
  130. return GL_UNSIGNED_SHORT_4_4_4_4_REV;
  131. case PF_L16:
  132. return GL_UNSIGNED_SHORT;
  133. #if CM_ENDIAN == CM_ENDIAN_BIG
  134. case PF_X8B8G8R8:
  135. case PF_A8B8G8R8:
  136. return GL_UNSIGNED_INT_8_8_8_8_REV;
  137. case PF_X8R8G8B8:
  138. case PF_A8R8G8B8:
  139. return GL_UNSIGNED_INT_8_8_8_8_REV;
  140. case PF_B8G8R8A8:
  141. return GL_UNSIGNED_BYTE;
  142. case PF_R8G8B8A8:
  143. return GL_UNSIGNED_BYTE;
  144. #else
  145. case PF_X8B8G8R8:
  146. case PF_A8B8G8R8:
  147. return GL_UNSIGNED_BYTE;
  148. case PF_X8R8G8B8:
  149. case PF_A8R8G8B8:
  150. return GL_UNSIGNED_BYTE;
  151. case PF_B8G8R8A8:
  152. return GL_UNSIGNED_INT_8_8_8_8;
  153. case PF_R8G8B8A8:
  154. return GL_UNSIGNED_INT_8_8_8_8;
  155. #endif
  156. case PF_A2R10G10B10:
  157. return GL_UNSIGNED_INT_2_10_10_10_REV;
  158. case PF_A2B10G10R10:
  159. return GL_UNSIGNED_INT_2_10_10_10_REV;
  160. case PF_FLOAT16_R:
  161. case PF_FLOAT16_GR:
  162. case PF_FLOAT16_RGB:
  163. case PF_FLOAT16_RGBA:
  164. return GL_HALF_FLOAT_ARB;
  165. case PF_FLOAT32_R:
  166. case PF_FLOAT32_GR:
  167. case PF_FLOAT32_RGB:
  168. case PF_FLOAT32_RGBA:
  169. return GL_FLOAT;
  170. case PF_SHORT_RGBA:
  171. case PF_SHORT_RGB:
  172. case PF_SHORT_GR:
  173. return GL_UNSIGNED_SHORT;
  174. default:
  175. return 0;
  176. }
  177. }
  178. GLenum GLPixelUtil::getGLInternalFormat(PixelFormat mFormat, bool hwGamma)
  179. {
  180. switch(mFormat) {
  181. case PF_L8:
  182. return GL_LUMINANCE8;
  183. case PF_L16:
  184. return GL_LUMINANCE16;
  185. case PF_A8:
  186. return GL_ALPHA8;
  187. case PF_A4L4:
  188. return GL_LUMINANCE4_ALPHA4;
  189. case PF_BYTE_LA:
  190. return GL_LUMINANCE8_ALPHA8;
  191. case PF_R3G3B2:
  192. return GL_R3_G3_B2;
  193. case PF_A1R5G5B5:
  194. return GL_RGB5_A1;
  195. case PF_R5G6B5:
  196. case PF_B5G6R5:
  197. return GL_RGB5;
  198. case PF_A4R4G4B4:
  199. return GL_RGBA4;
  200. case PF_R8G8B8:
  201. case PF_B8G8R8:
  202. case PF_X8B8G8R8:
  203. case PF_X8R8G8B8:
  204. if (hwGamma)
  205. return GL_SRGB8;
  206. else
  207. return GL_RGB8;
  208. case PF_A8R8G8B8:
  209. case PF_B8G8R8A8:
  210. if (hwGamma)
  211. return GL_SRGB8_ALPHA8;
  212. else
  213. return GL_RGBA8;
  214. case PF_A2R10G10B10:
  215. case PF_A2B10G10R10:
  216. return GL_RGB10_A2;
  217. case PF_FLOAT16_R:
  218. return GL_LUMINANCE16F_ARB;
  219. case PF_FLOAT16_RGB:
  220. return GL_RGB16F_ARB;
  221. case PF_FLOAT16_GR:
  222. return GL_LUMINANCE_ALPHA16F_ARB;
  223. case PF_FLOAT16_RGBA:
  224. return GL_RGBA16F_ARB;
  225. case PF_FLOAT32_R:
  226. return GL_LUMINANCE32F_ARB;
  227. case PF_FLOAT32_GR:
  228. return GL_LUMINANCE_ALPHA32F_ARB;
  229. case PF_FLOAT32_RGB:
  230. return GL_RGB32F_ARB;
  231. case PF_FLOAT32_RGBA:
  232. return GL_RGBA32F_ARB;
  233. case PF_SHORT_RGBA:
  234. return GL_RGBA16;
  235. case PF_SHORT_RGB:
  236. return GL_RGB16;
  237. case PF_SHORT_GR:
  238. return GL_LUMINANCE16_ALPHA16;
  239. case PF_DXT1:
  240. if (hwGamma)
  241. return GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT;
  242. else
  243. return GL_COMPRESSED_RGBA_S3TC_DXT1_EXT;
  244. case PF_DXT3:
  245. if (hwGamma)
  246. return GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT;
  247. else
  248. return GL_COMPRESSED_RGBA_S3TC_DXT3_EXT;
  249. case PF_DXT5:
  250. if (hwGamma)
  251. return GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT;
  252. else
  253. return GL_COMPRESSED_RGBA_S3TC_DXT5_EXT;
  254. default:
  255. return GL_NONE;
  256. }
  257. }
  258. GLenum GLPixelUtil::getClosestGLInternalFormat(PixelFormat mFormat, bool hwGamma)
  259. {
  260. GLenum format = getGLInternalFormat(mFormat, hwGamma);
  261. if(format==GL_NONE)
  262. {
  263. if (hwGamma)
  264. return GL_SRGB8;
  265. else
  266. return GL_RGBA8;
  267. }
  268. else
  269. return format;
  270. }
  271. //-----------------------------------------------------------------------------
  272. PixelFormat GLPixelUtil::getClosestOGREFormat(GLenum fmt)
  273. {
  274. switch(fmt)
  275. {
  276. case GL_LUMINANCE8:
  277. return PF_L8;
  278. case GL_LUMINANCE16:
  279. return PF_L16;
  280. case GL_ALPHA8:
  281. return PF_A8;
  282. case GL_LUMINANCE4_ALPHA4:
  283. // Unsupported by GL as input format, use the byte packed format
  284. return PF_BYTE_LA;
  285. case GL_LUMINANCE8_ALPHA8:
  286. return PF_BYTE_LA;
  287. case GL_R3_G3_B2:
  288. return PF_R3G3B2;
  289. case GL_RGB5_A1:
  290. return PF_A1R5G5B5;
  291. case GL_RGB5:
  292. return PF_R5G6B5;
  293. case GL_RGBA4:
  294. return PF_A4R4G4B4;
  295. case GL_RGB8:
  296. case GL_SRGB8:
  297. return PF_X8R8G8B8;
  298. case GL_RGBA8:
  299. case GL_SRGB8_ALPHA8:
  300. return PF_A8R8G8B8;
  301. case GL_RGB10_A2:
  302. return PF_A2R10G10B10;
  303. case GL_RGBA16:
  304. return PF_SHORT_RGBA;
  305. case GL_RGB16:
  306. return PF_SHORT_RGB;
  307. case GL_LUMINANCE16_ALPHA16:
  308. return PF_SHORT_GR;
  309. case GL_LUMINANCE_FLOAT16_ATI:
  310. return PF_FLOAT16_R;
  311. case GL_LUMINANCE_ALPHA_FLOAT16_ATI:
  312. return PF_FLOAT16_GR;
  313. case GL_LUMINANCE_ALPHA_FLOAT32_ATI:
  314. return PF_FLOAT32_GR;
  315. case GL_LUMINANCE_FLOAT32_ATI:
  316. return PF_FLOAT32_R;
  317. case GL_RGB_FLOAT16_ATI: // GL_RGB16F_ARB
  318. return PF_FLOAT16_RGB;
  319. case GL_RGBA_FLOAT16_ATI:
  320. return PF_FLOAT16_RGBA;
  321. case GL_RGB_FLOAT32_ATI:
  322. return PF_FLOAT32_RGB;
  323. case GL_RGBA_FLOAT32_ATI:
  324. return PF_FLOAT32_RGBA;
  325. case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
  326. case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
  327. case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT:
  328. case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT:
  329. return PF_DXT1;
  330. case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT:
  331. case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT:
  332. return PF_DXT3;
  333. case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT:
  334. case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT:
  335. return PF_DXT5;
  336. default:
  337. return PF_A8R8G8B8;
  338. };
  339. }
  340. //-----------------------------------------------------------------------------
  341. size_t GLPixelUtil::getMaxMipmaps(size_t width, size_t height, size_t depth, PixelFormat format)
  342. {
  343. size_t count = 0;
  344. if((width > 0) && (height > 0))
  345. {
  346. do {
  347. if(width>1) width = width/2;
  348. if(height>1) height = height/2;
  349. if(depth>1) depth = depth/2;
  350. /*
  351. NOT needed, compressed formats will have mipmaps up to 1x1
  352. if(PixelUtil::isValidExtent(width, height, depth, format))
  353. count ++;
  354. else
  355. break;
  356. */
  357. count ++;
  358. } while(!(width == 1 && height == 1 && depth == 1));
  359. }
  360. return count;
  361. }
  362. //-----------------------------------------------------------------------------
  363. size_t GLPixelUtil::optionalPO2(size_t value)
  364. {
  365. const RenderSystemCapabilities *caps = CamelotEngine::RenderSystemManager::getActive()->getCapabilities();
  366. if(caps->hasCapability(RSC_NON_POWER_OF_2_TEXTURES))
  367. return value;
  368. else
  369. return Bitwise::firstPO2From((UINT32)value);
  370. }
  371. };