Common.cpp 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455
  1. // Copyright (C) 2009-2018, Panagiotis Christopoulos Charitos and contributors.
  2. // All rights reserved.
  3. // Code licensed under the BSD License.
  4. // http://www.anki3d.org/LICENSE
  5. #include <anki/gr/gl/Common.h>
  6. namespace anki
  7. {
  8. GLenum convertCompareOperation(CompareOperation in)
  9. {
  10. GLenum out = GL_NONE;
  11. switch(in)
  12. {
  13. case CompareOperation::ALWAYS:
  14. out = GL_ALWAYS;
  15. break;
  16. case CompareOperation::LESS:
  17. out = GL_LESS;
  18. break;
  19. case CompareOperation::EQUAL:
  20. out = GL_EQUAL;
  21. break;
  22. case CompareOperation::LESS_EQUAL:
  23. out = GL_LEQUAL;
  24. break;
  25. case CompareOperation::GREATER:
  26. out = GL_GREATER;
  27. break;
  28. case CompareOperation::GREATER_EQUAL:
  29. out = GL_GEQUAL;
  30. break;
  31. case CompareOperation::NOT_EQUAL:
  32. out = GL_NOTEQUAL;
  33. break;
  34. case CompareOperation::NEVER:
  35. out = GL_NEVER;
  36. break;
  37. default:
  38. ANKI_ASSERT(0);
  39. }
  40. return out;
  41. }
  42. GLenum convertStencilOperation(StencilOperation in)
  43. {
  44. GLenum out = GL_NONE;
  45. switch(in)
  46. {
  47. case StencilOperation::KEEP:
  48. out = GL_KEEP;
  49. break;
  50. case StencilOperation::ZERO:
  51. out = GL_ZERO;
  52. break;
  53. case StencilOperation::REPLACE:
  54. out = GL_REPLACE;
  55. break;
  56. case StencilOperation::INCREMENT_AND_CLAMP:
  57. out = GL_INCR;
  58. break;
  59. case StencilOperation::DECREMENT_AND_CLAMP:
  60. out = GL_DECR;
  61. break;
  62. case StencilOperation::INVERT:
  63. out = GL_INVERT;
  64. break;
  65. case StencilOperation::INCREMENT_AND_WRAP:
  66. out = GL_INCR_WRAP;
  67. break;
  68. case StencilOperation::DECREMENT_AND_WRAP:
  69. out = GL_DECR_WRAP;
  70. break;
  71. default:
  72. ANKI_ASSERT(0);
  73. }
  74. return out;
  75. }
  76. void convertFilter(SamplingFilter minMagFilter, SamplingFilter mipFilter, GLenum& minFilter, GLenum& magFilter)
  77. {
  78. switch(minMagFilter)
  79. {
  80. case SamplingFilter::NEAREST:
  81. magFilter = GL_NEAREST;
  82. switch(mipFilter)
  83. {
  84. case SamplingFilter::NEAREST:
  85. minFilter = GL_NEAREST_MIPMAP_NEAREST;
  86. break;
  87. case SamplingFilter::LINEAR:
  88. minFilter = GL_NEAREST_MIPMAP_LINEAR;
  89. break;
  90. case SamplingFilter::BASE:
  91. minFilter = GL_NEAREST;
  92. break;
  93. default:
  94. ANKI_ASSERT(0);
  95. }
  96. break;
  97. case SamplingFilter::LINEAR:
  98. magFilter = GL_LINEAR;
  99. switch(mipFilter)
  100. {
  101. case SamplingFilter::NEAREST:
  102. minFilter = GL_LINEAR_MIPMAP_NEAREST;
  103. break;
  104. case SamplingFilter::LINEAR:
  105. minFilter = GL_LINEAR_MIPMAP_LINEAR;
  106. break;
  107. case SamplingFilter::BASE:
  108. minFilter = GL_LINEAR;
  109. break;
  110. default:
  111. ANKI_ASSERT(0);
  112. }
  113. break;
  114. default:
  115. ANKI_ASSERT(0);
  116. break;
  117. }
  118. }
  119. void convertVertexFormat(Format fmt, U& compCount, GLenum& type, Bool& normalized)
  120. {
  121. switch(fmt)
  122. {
  123. case Format::R32_SFLOAT:
  124. compCount = 1;
  125. type = GL_FLOAT;
  126. normalized = false;
  127. break;
  128. case Format::R32G32_SFLOAT:
  129. compCount = 2;
  130. type = GL_FLOAT;
  131. normalized = false;
  132. break;
  133. case Format::R32G32B32_SFLOAT:
  134. compCount = 3;
  135. type = GL_FLOAT;
  136. normalized = false;
  137. break;
  138. case Format::R32G32B32A32_SFLOAT:
  139. compCount = 4;
  140. type = GL_FLOAT;
  141. normalized = false;
  142. break;
  143. case Format::R16G16_SFLOAT:
  144. compCount = 2;
  145. type = GL_HALF_FLOAT;
  146. normalized = false;
  147. break;
  148. case Format::R16G16_UNORM:
  149. compCount = 2;
  150. type = GL_UNSIGNED_SHORT;
  151. normalized = true;
  152. break;
  153. case Format::R16G16B16_SFLOAT:
  154. compCount = 3;
  155. type = GL_HALF_FLOAT;
  156. normalized = false;
  157. break;
  158. case Format::R16G16B16_UNORM:
  159. compCount = 3;
  160. type = GL_UNSIGNED_SHORT;
  161. normalized = true;
  162. break;
  163. case Format::A2B10G10R10_SNORM_PACK32:
  164. compCount = 4;
  165. type = GL_INT_2_10_10_10_REV;
  166. normalized = true;
  167. break;
  168. case Format::R8G8B8A8_UNORM:
  169. compCount = 4;
  170. type = GL_UNSIGNED_BYTE;
  171. normalized = true;
  172. break;
  173. case Format::R8G8B8_UNORM:
  174. compCount = 3;
  175. type = GL_UNSIGNED_BYTE;
  176. normalized = true;
  177. break;
  178. case Format::R16G16B16A16_UINT:
  179. compCount = 4;
  180. type = GL_UNSIGNED_SHORT;
  181. normalized = false;
  182. break;
  183. default:
  184. ANKI_ASSERT(!"TODO");
  185. }
  186. }
  187. GLenum convertBlendFactor(BlendFactor in)
  188. {
  189. GLenum out;
  190. switch(in)
  191. {
  192. case BlendFactor::ZERO:
  193. out = GL_ZERO;
  194. break;
  195. case BlendFactor::ONE:
  196. out = GL_ONE;
  197. break;
  198. case BlendFactor::SRC_COLOR:
  199. out = GL_SRC_COLOR;
  200. break;
  201. case BlendFactor::ONE_MINUS_SRC_COLOR:
  202. out = GL_ONE_MINUS_SRC_COLOR;
  203. break;
  204. case BlendFactor::DST_COLOR:
  205. out = GL_DST_COLOR;
  206. break;
  207. case BlendFactor::ONE_MINUS_DST_COLOR:
  208. out = GL_ONE_MINUS_DST_COLOR;
  209. break;
  210. case BlendFactor::SRC_ALPHA:
  211. out = GL_SRC_ALPHA;
  212. break;
  213. case BlendFactor::ONE_MINUS_SRC_ALPHA:
  214. out = GL_ONE_MINUS_SRC_ALPHA;
  215. break;
  216. case BlendFactor::DST_ALPHA:
  217. out = GL_DST_ALPHA;
  218. break;
  219. case BlendFactor::ONE_MINUS_DST_ALPHA:
  220. out = GL_ONE_MINUS_DST_ALPHA;
  221. break;
  222. case BlendFactor::CONSTANT_COLOR:
  223. out = GL_CONSTANT_COLOR;
  224. break;
  225. case BlendFactor::ONE_MINUS_CONSTANT_COLOR:
  226. out = GL_ONE_MINUS_CONSTANT_COLOR;
  227. break;
  228. case BlendFactor::CONSTANT_ALPHA:
  229. out = GL_CONSTANT_ALPHA;
  230. break;
  231. case BlendFactor::ONE_MINUS_CONSTANT_ALPHA:
  232. out = GL_ONE_MINUS_CONSTANT_ALPHA;
  233. break;
  234. case BlendFactor::SRC_ALPHA_SATURATE:
  235. out = GL_SRC_ALPHA_SATURATE;
  236. break;
  237. case BlendFactor::SRC1_COLOR:
  238. out = GL_SRC1_COLOR;
  239. break;
  240. case BlendFactor::ONE_MINUS_SRC1_COLOR:
  241. out = GL_ONE_MINUS_SRC1_COLOR;
  242. break;
  243. case BlendFactor::SRC1_ALPHA:
  244. out = GL_SRC1_ALPHA;
  245. break;
  246. case BlendFactor::ONE_MINUS_SRC1_ALPHA:
  247. out = GL_ONE_MINUS_SRC1_ALPHA;
  248. break;
  249. default:
  250. ANKI_ASSERT(0);
  251. out = 0;
  252. }
  253. return out;
  254. }
  255. void convertTextureInformation(
  256. Format pf, Bool8& compressed, GLenum& format, GLenum& internalFormat, GLenum& type, DepthStencilAspectBit& dsAspect)
  257. {
  258. compressed = formatIsCompressed(pf);
  259. dsAspect = computeFormatAspect(pf);
  260. format = GL_NONE;
  261. internalFormat = GL_NONE;
  262. type = GL_NONE;
  263. switch(pf)
  264. {
  265. case Format::BC1_RGB_UNORM_BLOCK:
  266. format = GL_COMPRESSED_RGB_S3TC_DXT1_EXT;
  267. internalFormat = format;
  268. type = GL_UNSIGNED_BYTE;
  269. break;
  270. case Format::BC3_UNORM_BLOCK:
  271. format = GL_COMPRESSED_RGBA_S3TC_DXT5_EXT;
  272. internalFormat = format;
  273. type = GL_UNSIGNED_BYTE;
  274. break;
  275. case Format::BC6H_UFLOAT_BLOCK:
  276. format = GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT;
  277. internalFormat = format;
  278. type = GL_FLOAT;
  279. break;
  280. case Format::R8_UNORM:
  281. format = GL_RED;
  282. internalFormat = GL_R8;
  283. type = GL_UNSIGNED_BYTE;
  284. break;
  285. case Format::R8_SNORM:
  286. format = GL_RED;
  287. internalFormat = GL_R8_SNORM;
  288. type = GL_BYTE;
  289. break;
  290. case Format::R8G8_UNORM:
  291. format = GL_RG;
  292. internalFormat = GL_RG8;
  293. type = GL_UNSIGNED_BYTE;
  294. break;
  295. case Format::R8G8_SNORM:
  296. format = GL_RG;
  297. internalFormat = GL_RG8_SNORM;
  298. type = GL_BYTE;
  299. break;
  300. case Format::R8G8B8_UNORM:
  301. format = GL_RGB;
  302. internalFormat = GL_RGB8;
  303. type = GL_UNSIGNED_BYTE;
  304. break;
  305. case Format::R8G8B8_SNORM:
  306. format = GL_RGB;
  307. internalFormat = GL_RGB8_SNORM;
  308. type = GL_BYTE;
  309. break;
  310. case Format::R8G8B8_UINT:
  311. format = GL_RGB;
  312. internalFormat = GL_RGB8UI;
  313. type = GL_RGB_INTEGER;
  314. break;
  315. case Format::R8G8B8_SINT:
  316. format = GL_RGB;
  317. internalFormat = GL_RGB8I;
  318. type = GL_RGB_INTEGER;
  319. break;
  320. case Format::R8G8B8A8_UNORM:
  321. format = GL_RGBA;
  322. internalFormat = GL_RGBA8;
  323. type = GL_UNSIGNED_BYTE;
  324. break;
  325. case Format::R8G8B8A8_SNORM:
  326. format = GL_RGBA;
  327. internalFormat = GL_RGBA8_SNORM;
  328. type = GL_BYTE;
  329. break;
  330. case Format::R16_SFLOAT:
  331. format = GL_R;
  332. internalFormat = GL_R16F;
  333. type = GL_FLOAT;
  334. break;
  335. case Format::R16_UINT:
  336. format = GL_R;
  337. internalFormat = GL_R16UI;
  338. type = GL_UNSIGNED_SHORT;
  339. break;
  340. case Format::R16_UNORM:
  341. format = GL_R;
  342. internalFormat = GL_R16;
  343. type = GL_UNSIGNED_SHORT;
  344. break;
  345. case Format::R16G16B16_SFLOAT:
  346. format = GL_RGB;
  347. internalFormat = GL_RGB16F;
  348. type = GL_FLOAT;
  349. break;
  350. case Format::R16G16B16_UINT:
  351. format = GL_RGB_INTEGER;
  352. internalFormat = GL_RGB16UI;
  353. type = GL_UNSIGNED_INT;
  354. break;
  355. case Format::R16G16B16A16_SFLOAT:
  356. format = GL_RGBA;
  357. internalFormat = GL_RGBA16F;
  358. type = GL_FLOAT;
  359. break;
  360. case Format::R16G16B16A16_UINT:
  361. format = GL_RGBA;
  362. internalFormat = GL_RGBA16UI;
  363. type = GL_UNSIGNED_SHORT;
  364. break;
  365. case Format::R32_SFLOAT:
  366. format = GL_R;
  367. internalFormat = GL_R32F;
  368. type = GL_FLOAT;
  369. break;
  370. case Format::R32_UINT:
  371. format = GL_RG_INTEGER;
  372. internalFormat = GL_R32UI;
  373. type = GL_UNSIGNED_INT;
  374. break;
  375. case Format::R32G32_SFLOAT:
  376. format = GL_RG;
  377. internalFormat = GL_RG32F;
  378. type = GL_FLOAT;
  379. break;
  380. case Format::R32G32_UINT:
  381. format = GL_RG_INTEGER;
  382. internalFormat = GL_RG32UI;
  383. type = GL_UNSIGNED_INT;
  384. break;
  385. case Format::R32G32B32_SFLOAT:
  386. format = GL_RGB;
  387. internalFormat = GL_RGB32F;
  388. type = GL_FLOAT;
  389. break;
  390. case Format::R32G32B32_UINT:
  391. format = GL_RGB_INTEGER;
  392. internalFormat = GL_RGB32UI;
  393. type = GL_UNSIGNED_INT;
  394. break;
  395. case Format::R32G32B32A32_SFLOAT:
  396. format = GL_RGBA;
  397. internalFormat = GL_RGBA32F;
  398. type = GL_FLOAT;
  399. break;
  400. case Format::R32G32B32A32_UINT:
  401. format = GL_RGBA_INTEGER;
  402. internalFormat = GL_RGBA32UI;
  403. type = GL_UNSIGNED_INT;
  404. break;
  405. case Format::B10G11R11_UFLOAT_PACK32:
  406. format = GL_RGB;
  407. internalFormat = GL_R11F_G11F_B10F;
  408. type = GL_FLOAT;
  409. break;
  410. case Format::A2B10G10R10_UNORM_PACK32:
  411. format = GL_RGBA;
  412. internalFormat = GL_RGB10_A2;
  413. type = GL_UNSIGNED_INT;
  414. break;
  415. case Format::D24_UNORM_S8_UINT:
  416. format = GL_DEPTH_STENCIL;
  417. internalFormat = GL_DEPTH24_STENCIL8;
  418. type = GL_UNSIGNED_INT;
  419. break;
  420. case Format::D16_UNORM_S8_UINT:
  421. format = GL_DEPTH_COMPONENT;
  422. internalFormat = GL_DEPTH_COMPONENT16;
  423. type = GL_UNSIGNED_SHORT;
  424. break;
  425. case Format::D32_SFLOAT:
  426. format = GL_DEPTH_COMPONENT;
  427. internalFormat = GL_DEPTH_COMPONENT32;
  428. type = GL_UNSIGNED_INT;
  429. break;
  430. case Format::S8_UINT:
  431. format = GL_STENCIL_INDEX;
  432. internalFormat = GL_STENCIL_INDEX8;
  433. type = GL_BYTE;
  434. break;
  435. default:
  436. ANKI_ASSERT(!"TODO");
  437. }
  438. }
  439. } // end namespace anki