Common.cpp 9.7 KB

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