Nav apraksta
Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

BuddyAllocatorTests.cs 7.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. using System.Collections.Generic;
  2. using System.Linq;
  3. using NUnit.Framework;
  4. using Unity.Collections;
  5. using Unity.Mathematics;
  6. namespace UnityEngine.Rendering.Universal.Tests
  7. {
  8. class BuddyAllocatorTests
  9. {
  10. static IEnumerable<int> levelsCounts1D = Enumerable.Range(1, 24);
  11. [TestCaseSource(nameof(levelsCounts1D))]
  12. public void Empty1D(int levelCount)
  13. {
  14. var allocator = new BuddyAllocator(levelCount, 1, Allocator.Temp);
  15. allocator.Dispose();
  16. }
  17. static IEnumerable<int> levelsCounts2D = Enumerable.Range(1, 12);
  18. [TestCaseSource(nameof(levelsCounts2D))]
  19. public void Empty2D(int levelCount)
  20. {
  21. var allocator = new BuddyAllocator(levelCount, 2, Allocator.Temp);
  22. allocator.Dispose();
  23. }
  24. static IEnumerable<int> levelsCounts3D = Enumerable.Range(1, 8);
  25. [TestCaseSource(nameof(levelsCounts3D))]
  26. public void Empty3D(int levelCount)
  27. {
  28. var allocator = new BuddyAllocator(levelCount, 3, Allocator.Temp);
  29. allocator.Dispose();
  30. }
  31. [Test]
  32. public void Allocate1()
  33. {
  34. using var allocator = new BuddyAllocator(8, 2);
  35. Assert.IsTrue(allocator.TryAllocate(0, out var allocation));
  36. Assert.AreEqual(0, allocation.index);
  37. }
  38. [Test]
  39. public void Allocate6()
  40. {
  41. using var allocator = new BuddyAllocator(8, 2);
  42. Assert.IsTrue(allocator.TryAllocate(1, out var a0));
  43. Assert.AreEqual(math.uint2(0, 0), a0.index2D);
  44. Assert.IsTrue(allocator.TryAllocate(1, out var a1));
  45. Assert.AreEqual(math.uint2(1, 0), a1.index2D);
  46. Assert.IsTrue(allocator.TryAllocate(1, out var a2));
  47. Assert.AreEqual(math.uint2(0, 1), a2.index2D);
  48. Assert.IsTrue(allocator.TryAllocate(1, out var a3));
  49. Assert.AreEqual(math.uint2(1, 1), a3.index2D);
  50. Assert.IsTrue(allocator.TryAllocate(1, out var a4));
  51. Assert.AreEqual(math.uint2(2, 0), a4.index2D);
  52. Assert.IsTrue(allocator.TryAllocate(1, out var a5));
  53. Assert.AreEqual(math.uint2(3, 0), a5.index2D);
  54. }
  55. [Test]
  56. public void Allocate6Recycle2()
  57. {
  58. using var allocator = new BuddyAllocator(3, 2);
  59. Assert.IsTrue(allocator.TryAllocate(1, out var a0));
  60. Assert.AreEqual(math.uint2(0, 0), a0.index2D);
  61. Assert.IsTrue(allocator.TryAllocate(1, out var a1));
  62. Assert.AreEqual(math.uint2(1, 0), a1.index2D);
  63. Assert.IsTrue(allocator.TryAllocate(1, out var a2));
  64. Assert.AreEqual(math.uint2(0, 1), a2.index2D);
  65. Assert.IsTrue(allocator.TryAllocate(1, out var a3));
  66. Assert.AreEqual(math.uint2(1, 1), a3.index2D);
  67. allocator.Free(a3);
  68. allocator.Free(a2);
  69. Assert.IsTrue(allocator.TryAllocate(1, out a2));
  70. Assert.AreEqual(math.uint2(0, 1), a2.index2D);
  71. Assert.IsTrue(allocator.TryAllocate(1, out a3));
  72. Assert.AreEqual(math.uint2(1, 1), a3.index2D);
  73. Assert.IsTrue(allocator.TryAllocate(1, out var a4));
  74. Assert.AreEqual(math.uint2(2, 0), a4.index2D);
  75. Assert.IsTrue(allocator.TryAllocate(1, out var a5));
  76. Assert.AreEqual(math.uint2(3, 0), a5.index2D);
  77. }
  78. [Test]
  79. public void Allocate6Recycle4()
  80. {
  81. using var allocator = new BuddyAllocator(3, 2);
  82. Assert.IsTrue(allocator.TryAllocate(1, out var a0));
  83. Assert.AreEqual(math.uint2(0, 0), a0.index2D);
  84. Assert.IsTrue(allocator.TryAllocate(1, out var a1));
  85. Assert.AreEqual(math.uint2(1, 0), a1.index2D);
  86. Assert.IsTrue(allocator.TryAllocate(1, out var a2));
  87. Assert.AreEqual(math.uint2(0, 1), a2.index2D);
  88. Assert.IsTrue(allocator.TryAllocate(1, out var a3));
  89. Assert.AreEqual(math.uint2(1, 1), a3.index2D);
  90. Assert.IsTrue(allocator.TryAllocate(1, out var a4));
  91. Assert.AreEqual(math.uint2(2, 0), a4.index2D);
  92. Assert.IsTrue(allocator.TryAllocate(1, out var a5));
  93. Assert.AreEqual(math.uint2(3, 0), a5.index2D);
  94. allocator.Free(a0);
  95. allocator.Free(a1);
  96. allocator.Free(a2);
  97. allocator.Free(a3);
  98. Assert.IsTrue(allocator.TryAllocate(0, out var a6));
  99. Assert.AreEqual(math.uint2(0, 0), a6.index2D);
  100. }
  101. [Test]
  102. public void CubemapScenario1()
  103. {
  104. using var allocator = new BuddyAllocator(3, 2);
  105. // Allocate 6 items on level 2. This will use up (0, 0) and (1, 0) on level 1.
  106. Assert.IsTrue(allocator.TryAllocate(2, out var a00));
  107. Assert.IsTrue(allocator.TryAllocate(2, out var a01));
  108. Assert.IsTrue(allocator.TryAllocate(2, out var a02));
  109. Assert.IsTrue(allocator.TryAllocate(2, out var a03));
  110. Assert.IsTrue(allocator.TryAllocate(2, out var a04));
  111. Assert.IsTrue(allocator.TryAllocate(2, out var a05));
  112. Assert.AreEqual(math.uint2(0, 0), a00.index2D);
  113. Assert.AreEqual(math.uint2(1, 0), a01.index2D);
  114. Assert.AreEqual(math.uint2(0, 1), a02.index2D);
  115. Assert.AreEqual(math.uint2(1, 1), a03.index2D);
  116. Assert.AreEqual(math.uint2(2, 0), a04.index2D);
  117. Assert.AreEqual(math.uint2(3, 0), a05.index2D);
  118. Assert.IsTrue(allocator.TryAllocate(1, out var a10));
  119. Assert.IsTrue(allocator.TryAllocate(1, out var a11));
  120. Assert.IsTrue(allocator.TryAllocate(1, out var a12));
  121. Assert.IsTrue(allocator.TryAllocate(1, out var a13));
  122. Assert.IsTrue(allocator.TryAllocate(1, out var a14));
  123. Assert.IsTrue(allocator.TryAllocate(1, out var a15));
  124. Assert.AreEqual(math.uint2(0, 1), a10.index2D);
  125. Assert.AreEqual(math.uint2(1, 1), a11.index2D);
  126. Assert.AreEqual(math.uint2(2, 0), a12.index2D);
  127. Assert.AreEqual(math.uint2(3, 0), a13.index2D);
  128. Assert.AreEqual(math.uint2(2, 1), a14.index2D);
  129. Assert.AreEqual(math.uint2(3, 1), a15.index2D);
  130. // This should make (0, 0) and (1, 0) available on level 1 again.
  131. allocator.Free(a05);
  132. allocator.Free(a04);
  133. allocator.Free(a03);
  134. allocator.Free(a02);
  135. allocator.Free(a01);
  136. allocator.Free(a00);
  137. Assert.IsTrue(allocator.TryAllocate(1, out var a20));
  138. Assert.IsTrue(allocator.TryAllocate(1, out var a21));
  139. Assert.IsTrue(allocator.TryAllocate(1, out var a22));
  140. Assert.IsTrue(allocator.TryAllocate(1, out var a23));
  141. Assert.IsTrue(allocator.TryAllocate(1, out var a24));
  142. Assert.IsTrue(allocator.TryAllocate(1, out var a25));
  143. Assert.AreEqual(math.uint2(0, 0), a20.index2D);
  144. Assert.AreEqual(math.uint2(1, 0), a21.index2D);
  145. Assert.AreEqual(math.uint2(0, 2), a22.index2D);
  146. Assert.AreEqual(math.uint2(1, 2), a23.index2D);
  147. Assert.AreEqual(math.uint2(0, 3), a24.index2D);
  148. Assert.AreEqual(math.uint2(1, 3), a25.index2D);
  149. }
  150. }
  151. }