gtc_packing.cpp 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685
  1. #include <glm/gtc/packing.hpp>
  2. #include <glm/gtc/epsilon.hpp>
  3. #include <cstdio>
  4. #include <vector>
  5. void print_bits(float const & s)
  6. {
  7. union
  8. {
  9. float f;
  10. unsigned int i;
  11. } uif;
  12. uif.f = s;
  13. printf("f32: ");
  14. for(std::size_t j = sizeof(s) * 8; j > 0; --j)
  15. {
  16. if(j == 23 || j == 31)
  17. printf(" ");
  18. printf("%d", (uif.i & (1 << (j - 1))) ? 1 : 0);
  19. }
  20. }
  21. void print_10bits(glm::uint const & s)
  22. {
  23. printf("10b: ");
  24. for(std::size_t j = 10; j > 0; --j)
  25. {
  26. if(j == 5)
  27. printf(" ");
  28. printf("%d", (s & (1 << (j - 1))) ? 1 : 0);
  29. }
  30. }
  31. void print_11bits(glm::uint const & s)
  32. {
  33. printf("11b: ");
  34. for(std::size_t j = 11; j > 0; --j)
  35. {
  36. if(j == 6)
  37. printf(" ");
  38. printf("%d", (s & (1 << (j - 1))) ? 1 : 0);
  39. }
  40. }
  41. void print_value(float const & s)
  42. {
  43. printf("%2.5f, ", s);
  44. print_bits(s);
  45. printf(", ");
  46. // print_11bits(detail::floatTo11bit(s));
  47. // printf(", ");
  48. // print_10bits(detail::floatTo10bit(s));
  49. printf("\n");
  50. }
  51. int test_Half1x16()
  52. {
  53. int Error = 0;
  54. std::vector<float> Tests;
  55. Tests.push_back(0.0f);
  56. Tests.push_back(1.0f);
  57. Tests.push_back(-1.0f);
  58. Tests.push_back(2.0f);
  59. Tests.push_back(-2.0f);
  60. Tests.push_back(1.9f);
  61. for(std::size_t i = 0; i < Tests.size(); ++i)
  62. {
  63. glm::uint32 p0 = glm::packHalf1x16(Tests[i]);
  64. float v0 = glm::unpackHalf1x16(p0);
  65. glm::uint32 p1 = glm::packHalf1x16(v0);
  66. float v1 = glm::unpackHalf1x16(p1);
  67. Error += (v0 == v1) ? 0 : 1;
  68. }
  69. return Error;
  70. }
  71. int test_Half4x16()
  72. {
  73. int Error = 0;
  74. std::vector<glm::vec4> Tests;
  75. Tests.push_back(glm::vec4(1.0f));
  76. Tests.push_back(glm::vec4(0.0f));
  77. Tests.push_back(glm::vec4(2.0f));
  78. Tests.push_back(glm::vec4(0.1f));
  79. Tests.push_back(glm::vec4(0.5f));
  80. Tests.push_back(glm::vec4(-0.9f));
  81. for(std::size_t i = 0; i < Tests.size(); ++i)
  82. {
  83. glm::uint64 p0 = glm::packHalf4x16(Tests[i]);
  84. glm::vec4 v0 = glm::unpackHalf4x16(p0);
  85. glm::uint64 p1 = glm::packHalf4x16(v0);
  86. glm::vec4 v1 = glm::unpackHalf4x16(p1);
  87. glm::u16vec4 p2 = glm::packHalf(v0);
  88. glm::vec4 v2 = glm::unpackHalf(p2);
  89. Error += glm::all(glm::equal(v0, v1)) ? 0 : 1;
  90. Error += glm::all(glm::equal(v0, v2)) ? 0 : 1;
  91. }
  92. return Error;
  93. }
  94. int test_I3x10_1x2()
  95. {
  96. int Error = 0;
  97. std::vector<glm::ivec4> Tests;
  98. Tests.push_back(glm::ivec4(0));
  99. Tests.push_back(glm::ivec4(1));
  100. Tests.push_back(glm::ivec4(-1));
  101. Tests.push_back(glm::ivec4(2));
  102. Tests.push_back(glm::ivec4(-2));
  103. Tests.push_back(glm::ivec4(3));
  104. for(std::size_t i = 0; i < Tests.size(); ++i)
  105. {
  106. glm::uint32 p0 = glm::packI3x10_1x2(Tests[i]);
  107. glm::ivec4 v0 = glm::unpackI3x10_1x2(p0);
  108. glm::uint32 p1 = glm::packI3x10_1x2(v0);
  109. glm::ivec4 v1 = glm::unpackI3x10_1x2(p1);
  110. Error += glm::all(glm::equal(v0, v1)) ? 0 : 1;
  111. }
  112. return Error;
  113. }
  114. int test_U3x10_1x2()
  115. {
  116. int Error = 0;
  117. std::vector<glm::uvec4> Tests;
  118. Tests.push_back(glm::uvec4(0));
  119. Tests.push_back(glm::uvec4(1));
  120. Tests.push_back(glm::uvec4(2));
  121. Tests.push_back(glm::uvec4(3));
  122. Tests.push_back(glm::uvec4(4));
  123. Tests.push_back(glm::uvec4(5));
  124. for(std::size_t i = 0; i < Tests.size(); ++i)
  125. {
  126. glm::uint32 p0 = glm::packU3x10_1x2(Tests[i]);
  127. glm::uvec4 v0 = glm::unpackU3x10_1x2(p0);
  128. glm::uint32 p1 = glm::packU3x10_1x2(v0);
  129. glm::uvec4 v1 = glm::unpackU3x10_1x2(p1);
  130. Error += glm::all(glm::equal(v0, v1)) ? 0 : 1;
  131. }
  132. return Error;
  133. }
  134. int test_Snorm3x10_1x2()
  135. {
  136. int Error = 0;
  137. std::vector<glm::vec4> Tests;
  138. Tests.push_back(glm::vec4(1.0f));
  139. Tests.push_back(glm::vec4(0.0f));
  140. Tests.push_back(glm::vec4(2.0f));
  141. Tests.push_back(glm::vec4(0.1f));
  142. Tests.push_back(glm::vec4(0.5f));
  143. Tests.push_back(glm::vec4(0.9f));
  144. for(std::size_t i = 0; i < Tests.size(); ++i)
  145. {
  146. glm::uint32 p0 = glm::packSnorm3x10_1x2(Tests[i]);
  147. glm::vec4 v0 = glm::unpackSnorm3x10_1x2(p0);
  148. glm::uint32 p1 = glm::packSnorm3x10_1x2(v0);
  149. glm::vec4 v1 = glm::unpackSnorm3x10_1x2(p1);
  150. Error += glm::all(glm::epsilonEqual(v0, v1, 0.01f)) ? 0 : 1;
  151. }
  152. return Error;
  153. }
  154. int test_Unorm3x10_1x2()
  155. {
  156. int Error = 0;
  157. std::vector<glm::vec4> Tests;
  158. Tests.push_back(glm::vec4(1.0f));
  159. Tests.push_back(glm::vec4(0.0f));
  160. Tests.push_back(glm::vec4(2.0f));
  161. Tests.push_back(glm::vec4(0.1f));
  162. Tests.push_back(glm::vec4(0.5f));
  163. Tests.push_back(glm::vec4(0.9f));
  164. for(std::size_t i = 0; i < Tests.size(); ++i)
  165. {
  166. glm::uint32 p0 = glm::packUnorm3x10_1x2(Tests[i]);
  167. glm::vec4 v0 = glm::unpackUnorm3x10_1x2(p0);
  168. glm::uint32 p1 = glm::packUnorm3x10_1x2(v0);
  169. glm::vec4 v1 = glm::unpackUnorm3x10_1x2(p1);
  170. Error += glm::all(glm::epsilonEqual(v0, v1, 0.001f)) ? 0 : 1;
  171. }
  172. return Error;
  173. }
  174. int test_F2x11_1x10()
  175. {
  176. int Error = 0;
  177. std::vector<glm::vec3> Tests;
  178. Tests.push_back(glm::vec3(1.0f));
  179. Tests.push_back(glm::vec3(0.0f));
  180. Tests.push_back(glm::vec3(2.0f));
  181. Tests.push_back(glm::vec3(0.1f));
  182. Tests.push_back(glm::vec3(0.5f));
  183. Tests.push_back(glm::vec3(0.9f));
  184. for(std::size_t i = 0; i < Tests.size(); ++i)
  185. {
  186. glm::uint32 p0 = glm::packF2x11_1x10(Tests[i]);
  187. glm::vec3 v0 = glm::unpackF2x11_1x10(p0);
  188. glm::uint32 p1 = glm::packF2x11_1x10(v0);
  189. glm::vec3 v1 = glm::unpackF2x11_1x10(p1);
  190. Error += glm::all(glm::equal(v0, v1)) ? 0 : 1;
  191. }
  192. return Error;
  193. }
  194. int test_F3x9_E1x5()
  195. {
  196. int Error = 0;
  197. std::vector<glm::vec3> Tests;
  198. Tests.push_back(glm::vec3(1.0f));
  199. Tests.push_back(glm::vec3(0.0f));
  200. Tests.push_back(glm::vec3(2.0f));
  201. Tests.push_back(glm::vec3(0.1f));
  202. Tests.push_back(glm::vec3(0.5f));
  203. Tests.push_back(glm::vec3(0.9f));
  204. for (std::size_t i = 0; i < Tests.size(); ++i)
  205. {
  206. glm::uint32 p0 = glm::packF3x9_E1x5(Tests[i]);
  207. glm::vec3 v0 = glm::unpackF3x9_E1x5(p0);
  208. glm::uint32 p1 = glm::packF3x9_E1x5(v0);
  209. glm::vec3 v1 = glm::unpackF3x9_E1x5(p1);
  210. Error += glm::all(glm::epsilonEqual(v0, v1, 0.01f)) ? 0 : 1;
  211. }
  212. return Error;
  213. }
  214. int test_packUnorm1x16()
  215. {
  216. int Error = 0;
  217. std::vector<glm::vec1> A;
  218. A.push_back(glm::vec1(1.0f));
  219. A.push_back(glm::vec1(0.5f));
  220. A.push_back(glm::vec1(0.1f));
  221. A.push_back(glm::vec1(0.0f));
  222. for(std::size_t i = 0; i < A.size(); ++i)
  223. {
  224. glm::vec1 B(A[i]);
  225. glm::uint32 C = glm::packUnorm1x16(B.x);
  226. glm::vec1 D(glm::unpackUnorm1x16(C));
  227. Error += glm::all(glm::epsilonEqual(B, D, 1.0f / 65535.f)) ? 0 : 1;
  228. assert(!Error);
  229. }
  230. return Error;
  231. }
  232. int test_packSnorm1x16()
  233. {
  234. int Error = 0;
  235. std::vector<glm::vec1> A;
  236. A.push_back(glm::vec1( 1.0f));
  237. A.push_back(glm::vec1( 0.0f));
  238. A.push_back(glm::vec1(-0.5f));
  239. A.push_back(glm::vec1(-0.1f));
  240. for(std::size_t i = 0; i < A.size(); ++i)
  241. {
  242. glm::vec1 B(A[i]);
  243. glm::uint32 C = glm::packSnorm1x16(B.x);
  244. glm::vec1 D(glm::unpackSnorm1x16(C));
  245. Error += glm::all(glm::epsilonEqual(B, D, 1.0f / 32767.0f * 2.0f)) ? 0 : 1;
  246. }
  247. return Error;
  248. }
  249. int test_packUnorm2x16()
  250. {
  251. int Error = 0;
  252. std::vector<glm::vec2> A;
  253. A.push_back(glm::vec2(1.0f, 0.0f));
  254. A.push_back(glm::vec2(0.5f, 0.7f));
  255. A.push_back(glm::vec2(0.1f, 0.2f));
  256. for(std::size_t i = 0; i < A.size(); ++i)
  257. {
  258. glm::vec2 B(A[i]);
  259. glm::uint32 C = glm::packUnorm2x16(B);
  260. glm::vec2 D = glm::unpackUnorm2x16(C);
  261. Error += glm::all(glm::epsilonEqual(B, D, 1.0f / 65535.f)) ? 0 : 1;
  262. assert(!Error);
  263. }
  264. return Error;
  265. }
  266. int test_packSnorm2x16()
  267. {
  268. int Error = 0;
  269. std::vector<glm::vec2> A;
  270. A.push_back(glm::vec2( 1.0f, 0.0f));
  271. A.push_back(glm::vec2(-0.5f,-0.7f));
  272. A.push_back(glm::vec2(-0.1f, 0.1f));
  273. for(std::size_t i = 0; i < A.size(); ++i)
  274. {
  275. glm::vec2 B(A[i]);
  276. glm::uint32 C = glm::packSnorm2x16(B);
  277. glm::vec2 D = glm::unpackSnorm2x16(C);
  278. Error += glm::all(glm::epsilonEqual(B, D, 1.0f / 32767.0f * 2.0f)) ? 0 : 1;
  279. assert(!Error);
  280. }
  281. return Error;
  282. }
  283. int test_packUnorm4x16()
  284. {
  285. int Error = 0;
  286. std::vector<glm::vec4> A;
  287. A.push_back(glm::vec4(1.0f));
  288. A.push_back(glm::vec4(0.5f));
  289. A.push_back(glm::vec4(0.1f));
  290. A.push_back(glm::vec4(0.0f));
  291. for(std::size_t i = 0; i < A.size(); ++i)
  292. {
  293. glm::vec4 B(A[i]);
  294. glm::uint64 C = glm::packUnorm4x16(B);
  295. glm::vec4 D(glm::unpackUnorm4x16(C));
  296. Error += glm::all(glm::epsilonEqual(B, D, 1.0f / 65535.f)) ? 0 : 1;
  297. assert(!Error);
  298. }
  299. return Error;
  300. }
  301. int test_packSnorm4x16()
  302. {
  303. int Error = 0;
  304. std::vector<glm::vec4> A;
  305. A.push_back(glm::vec4( 1.0f, 0.0f, -0.5f, 0.5f));
  306. A.push_back(glm::vec4(-0.3f,-0.7f, 0.3f, 0.7f));
  307. A.push_back(glm::vec4(-0.1f, 0.1f, -0.2f, 0.2f));
  308. for(std::size_t i = 0; i < A.size(); ++i)
  309. {
  310. glm::vec4 B(A[i]);
  311. glm::uint64 C = glm::packSnorm4x16(B);
  312. glm::vec4 D(glm::unpackSnorm4x16(C));
  313. Error += glm::all(glm::epsilonEqual(B, D, 1.0f / 32767.0f * 2.0f)) ? 0 : 1;
  314. assert(!Error);
  315. }
  316. return Error;
  317. }
  318. int test_packUnorm1x8()
  319. {
  320. int Error = 0;
  321. std::vector<glm::vec1> A;
  322. A.push_back(glm::vec1(1.0f));
  323. A.push_back(glm::vec1(0.5f));
  324. A.push_back(glm::vec1(0.0f));
  325. for(std::size_t i = 0; i < A.size(); ++i)
  326. {
  327. glm::vec1 B(A[i]);
  328. glm::uint8 C = glm::packUnorm1x8(B.x);
  329. glm::vec1 D(glm::unpackUnorm1x8(C));
  330. Error += glm::all(glm::epsilonEqual(B, D, 1.0f / 255.f)) ? 0 : 1;
  331. assert(!Error);
  332. }
  333. return Error;
  334. }
  335. int test_packSnorm1x8()
  336. {
  337. int Error = 0;
  338. std::vector<glm::vec1> A;
  339. A.push_back(glm::vec1( 1.0f));
  340. A.push_back(glm::vec1(-0.7f));
  341. A.push_back(glm::vec1(-1.0f));
  342. for(std::size_t i = 0; i < A.size(); ++i)
  343. {
  344. glm::vec1 B(A[i]);
  345. glm::uint8 C = glm::packSnorm1x8(B.x);
  346. glm::vec1 D(glm::unpackSnorm1x8(C));
  347. Error += glm::all(glm::epsilonEqual(B, D, 1.0f / 127.f)) ? 0 : 1;
  348. }
  349. return Error;
  350. }
  351. int test_packUnorm2x8()
  352. {
  353. int Error = 0;
  354. std::vector<glm::vec2> A;
  355. A.push_back(glm::vec2(1.0f, 0.7f));
  356. A.push_back(glm::vec2(0.5f, 0.1f));
  357. for(std::size_t i = 0; i < A.size(); ++i)
  358. {
  359. glm::vec2 B(A[i]);
  360. glm::uint16 C = glm::packUnorm2x8(B);
  361. glm::vec2 D = glm::unpackUnorm2x8(C);
  362. Error += glm::all(glm::epsilonEqual(B, D, 1.0f / 255.f)) ? 0 : 1;
  363. assert(!Error);
  364. }
  365. return Error;
  366. }
  367. int test_packSnorm2x8()
  368. {
  369. int Error = 0;
  370. std::vector<glm::vec2> A;
  371. A.push_back(glm::vec2( 1.0f, 0.0f));
  372. A.push_back(glm::vec2(-0.7f,-0.1f));
  373. for(std::size_t i = 0; i < A.size(); ++i)
  374. {
  375. glm::vec2 B(A[i]);
  376. glm::uint16 C = glm::packSnorm2x8(B);
  377. glm::vec2 D = glm::unpackSnorm2x8(C);
  378. Error += glm::all(glm::epsilonEqual(B, D, 1.0f / 127.f)) ? 0 : 1;
  379. }
  380. return Error;
  381. }
  382. int test_packUnorm4x8()
  383. {
  384. int Error = 0;
  385. std::vector<glm::vec4> A;
  386. A.push_back(glm::vec4(1.0f, 0.7f, 0.3f, 0.0f));
  387. A.push_back(glm::vec4(0.5f, 0.1f, 0.2f, 0.3f));
  388. for(std::size_t i = 0; i < A.size(); ++i)
  389. {
  390. glm::vec4 B(A[i]);
  391. glm::uint32 C = glm::packUnorm4x8(B);
  392. glm::vec4 D = glm::unpackUnorm4x8(C);
  393. Error += glm::all(glm::epsilonEqual(B, D, 1.0f / 255.f)) ? 0 : 1;
  394. assert(!Error);
  395. }
  396. return Error;
  397. }
  398. int test_packSnorm4x8()
  399. {
  400. int Error = 0;
  401. std::vector<glm::vec4> A;
  402. A.push_back(glm::vec4( 1.0f, 0.0f,-0.5f,-1.0f));
  403. A.push_back(glm::vec4(-0.7f,-0.1f, 0.1f, 0.7f));
  404. for(std::size_t i = 0; i < A.size(); ++i)
  405. {
  406. glm::vec4 B(A[i]);
  407. glm::uint32 C = glm::packSnorm4x8(B);
  408. glm::vec4 D = glm::unpackSnorm4x8(C);
  409. Error += glm::all(glm::epsilonEqual(B, D, 1.0f / 127.f)) ? 0 : 1;
  410. assert(!Error);
  411. }
  412. return Error;
  413. }
  414. int test_packUnorm()
  415. {
  416. int Error = 0;
  417. std::vector<glm::vec2> A;
  418. A.push_back(glm::vec2(1.0f, 0.7f));
  419. A.push_back(glm::vec2(0.5f, 0.1f));
  420. for(std::size_t i = 0; i < A.size(); ++i)
  421. {
  422. glm::vec2 B(A[i]);
  423. glm::u16vec2 C = glm::packUnorm<glm::uint16>(B);
  424. glm::vec2 D = glm::unpackUnorm<glm::uint16, float>(C);
  425. Error += glm::all(glm::epsilonEqual(B, D, 1.0f / 255.f)) ? 0 : 1;
  426. assert(!Error);
  427. }
  428. return Error;
  429. }
  430. int test_packSnorm()
  431. {
  432. int Error = 0;
  433. std::vector<glm::vec2> A;
  434. A.push_back(glm::vec2( 1.0f, 0.0f));
  435. A.push_back(glm::vec2(-0.5f,-0.7f));
  436. A.push_back(glm::vec2(-0.1f, 0.1f));
  437. for(std::size_t i = 0; i < A.size(); ++i)
  438. {
  439. glm::vec2 B(A[i]);
  440. glm::i16vec2 C = glm::packSnorm<glm::int16>(B);
  441. glm::vec2 D = glm::unpackSnorm<glm::int16, float>(C);
  442. Error += glm::all(glm::epsilonEqual(B, D, 1.0f / 32767.0f * 2.0f)) ? 0 : 1;
  443. assert(!Error);
  444. }
  445. return Error;
  446. }
  447. int test_packUnorm2x4()
  448. {
  449. int Error = 0;
  450. std::vector<glm::vec2> A;
  451. A.push_back(glm::vec2(1.0f, 0.7f));
  452. A.push_back(glm::vec2(0.5f, 0.0f));
  453. for(std::size_t i = 0; i < A.size(); ++i)
  454. {
  455. glm::vec2 B(A[i]);
  456. glm::uint8 C = glm::packUnorm2x4(B);
  457. glm::vec2 D = glm::unpackUnorm2x4(C);
  458. Error += glm::all(glm::epsilonEqual(B, D, 1.0f / 15.f)) ? 0 : 1;
  459. assert(!Error);
  460. }
  461. return Error;
  462. }
  463. int test_packUnorm4x4()
  464. {
  465. int Error = 0;
  466. std::vector<glm::vec4> A;
  467. A.push_back(glm::vec4(1.0f, 0.7f, 0.5f, 0.0f));
  468. A.push_back(glm::vec4(0.5f, 0.1f, 0.0f, 1.0f));
  469. for(std::size_t i = 0; i < A.size(); ++i)
  470. {
  471. glm::vec4 B(A[i]);
  472. glm::uint16 C = glm::packUnorm4x4(B);
  473. glm::vec4 D = glm::unpackUnorm4x4(C);
  474. Error += glm::all(glm::epsilonEqual(B, D, 1.0f / 15.f)) ? 0 : 1;
  475. assert(!Error);
  476. }
  477. return Error;
  478. }
  479. int test_packUnorm3x5_1x1()
  480. {
  481. int Error = 0;
  482. std::vector<glm::vec4> A;
  483. A.push_back(glm::vec4(1.0f, 0.7f, 0.5f, 0.0f));
  484. A.push_back(glm::vec4(0.5f, 0.1f, 0.0f, 1.0f));
  485. for(std::size_t i = 0; i < A.size(); ++i)
  486. {
  487. glm::vec4 B(A[i]);
  488. glm::uint16 C = glm::packUnorm3x5_1x1(B);
  489. glm::vec4 D = glm::unpackUnorm3x5_1x1(C);
  490. Error += glm::all(glm::epsilonEqual(B, D, 1.0f / 15.f)) ? 0 : 1;
  491. assert(!Error);
  492. }
  493. return Error;
  494. }
  495. int test_packUnorm1x5_1x6_1x5()
  496. {
  497. int Error = 0;
  498. std::vector<glm::vec3> A;
  499. A.push_back(glm::vec3(1.0f, 0.7f, 0.5f));
  500. A.push_back(glm::vec3(0.5f, 0.1f, 0.0f));
  501. for(std::size_t i = 0; i < A.size(); ++i)
  502. {
  503. glm::vec3 B(A[i]);
  504. glm::uint16 C = glm::packUnorm1x5_1x6_1x5(B);
  505. glm::vec3 D = glm::unpackUnorm1x5_1x6_1x5(C);
  506. Error += glm::all(glm::epsilonEqual(B, D, 1.0f / 15.f)) ? 0 : 1;
  507. assert(!Error);
  508. }
  509. return Error;
  510. }
  511. int test_packUnorm2x3_1x2()
  512. {
  513. int Error = 0;
  514. std::vector<glm::vec3> A;
  515. A.push_back(glm::vec3(1.0f, 0.7f, 0.5f));
  516. A.push_back(glm::vec3(0.5f, 0.1f, 0.0f));
  517. for(std::size_t i = 0; i < A.size(); ++i)
  518. {
  519. glm::vec3 B(A[i]);
  520. glm::uint8 C = glm::packUnorm2x3_1x2(B);
  521. glm::vec3 D = glm::unpackUnorm2x3_1x2(C);
  522. Error += glm::all(glm::epsilonEqual(B, D, 1.0f / 3.f)) ? 0 : 1;
  523. assert(!Error);
  524. }
  525. return Error;
  526. }
  527. int main()
  528. {
  529. int Error = 0;
  530. Error += test_packUnorm();
  531. Error += test_packSnorm();
  532. Error += test_packSnorm1x16();
  533. Error += test_packSnorm2x16();
  534. Error += test_packSnorm4x16();
  535. Error += test_packSnorm1x8();
  536. Error += test_packSnorm2x8();
  537. Error += test_packSnorm4x8();
  538. Error += test_packUnorm1x16();
  539. Error += test_packUnorm2x16();
  540. Error += test_packUnorm4x16();
  541. Error += test_packUnorm1x8();
  542. Error += test_packUnorm2x8();
  543. Error += test_packUnorm4x8();
  544. Error += test_packUnorm2x4();
  545. Error += test_packUnorm4x4();
  546. Error += test_packUnorm3x5_1x1();
  547. Error += test_packUnorm1x5_1x6_1x5();
  548. Error += test_packUnorm2x3_1x2();
  549. Error += test_F2x11_1x10();
  550. Error += test_F3x9_E1x5();
  551. Error += test_Snorm3x10_1x2();
  552. Error += test_Unorm3x10_1x2();
  553. Error += test_I3x10_1x2();
  554. Error += test_U3x10_1x2();
  555. Error += test_Half1x16();
  556. Error += test_Half4x16();
  557. return Error;
  558. }