test_fbprops.py 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266
  1. from panda3d.core import FrameBufferProperties
  2. def test_fbprops_copy_ctor():
  3. default = FrameBufferProperties.get_default()
  4. fbprops = FrameBufferProperties(default)
  5. assert fbprops == default
  6. def test_fbquality_depth():
  7. # We check common framebuffer depth configurations to make sure they
  8. # are rated predictably with respect to each other when requesting 1 bit.
  9. # In particular, we make sure that we don't get a 16-bit depth buffer if
  10. # the driver only gives extra depth in combination with a stencil buffer.
  11. req = FrameBufferProperties()
  12. req.depth_bits = 1
  13. #NB. we need to set rgb_color=True when testing the quality of framebuffer
  14. # properties, lest it return a quality of 0.
  15. fb_d16s8 = FrameBufferProperties()
  16. fb_d16s8.rgb_color = True
  17. fb_d16s8.depth_bits = 16
  18. fb_d16s8.stencil_bits = 8
  19. fb_d24s8 = FrameBufferProperties()
  20. fb_d24s8.rgb_color = True
  21. fb_d24s8.depth_bits = 24
  22. fb_d24s8.stencil_bits = 8
  23. fb_d32 = FrameBufferProperties()
  24. fb_d32.rgb_color = True
  25. fb_d32.depth_bits = 32
  26. fb_d32s8 = FrameBufferProperties()
  27. fb_d32s8.rgb_color = True
  28. fb_d32s8.depth_bits = 32
  29. fb_d32s8.stencil_bits = 8
  30. # 16-bit depth is terrible for most applications and should not be chosen.
  31. assert fb_d16s8.get_quality(req) < fb_d24s8.get_quality(req)
  32. assert fb_d16s8.get_quality(req) < fb_d32.get_quality(req)
  33. assert fb_d16s8.get_quality(req) < fb_d32s8.get_quality(req)
  34. # Getting extra depth should be better than getting an unwanted bitplane.
  35. assert fb_d32.get_quality(req) > fb_d16s8.get_quality(req)
  36. assert fb_d32.get_quality(req) > fb_d24s8.get_quality(req)
  37. # If we're getting stencil anyway, we'll prefer to maximize our depth.
  38. assert fb_d32s8.get_quality(req) > fb_d24s8.get_quality(req)
  39. # However, unnecessary stencil bits are still a waste.
  40. assert fb_d32s8.get_quality(req) < fb_d32.get_quality(req)
  41. def test_fbquality_rgba64():
  42. # Make sure that we don't get a 64-bit configuration if we request
  43. # an unspecific number of color bits. See:
  44. # https://www.panda3d.org/forums/viewtopic.php?t=20192
  45. # This issue occurs if we are requesting 1 bit, not if we are requesting
  46. # a specific amount. There are several ways to do that, so we want to
  47. # assert that none of them will yield a 64-bit color buffer.
  48. req_color0 = FrameBufferProperties()
  49. req_color0.color_bits = 0
  50. req_color1 = FrameBufferProperties()
  51. req_color1.color_bits = 1
  52. req_color0_alpha0 = FrameBufferProperties()
  53. req_color0_alpha0.color_bits = 0
  54. req_color0_alpha0.alpha_bits = 0
  55. req_color1_alpha1 = FrameBufferProperties()
  56. req_color1_alpha1.color_bits = 1
  57. req_color1_alpha1.alpha_bits = 1
  58. req_rgb0 = FrameBufferProperties()
  59. req_rgb0.set_rgba_bits(0, 0, 0, 0)
  60. req_rgb1 = FrameBufferProperties()
  61. req_rgb1.set_rgba_bits(1, 1, 1, 0)
  62. req_rgb0_alpha0 = FrameBufferProperties()
  63. req_rgb0_alpha0.set_rgba_bits(0, 0, 0, 0)
  64. req_rgb1_alpha1 = FrameBufferProperties()
  65. req_rgb1_alpha1.set_rgba_bits(1, 1, 1, 1)
  66. fb_rgba8 = FrameBufferProperties()
  67. fb_rgba8.rgb_color = True
  68. fb_rgba8.set_rgba_bits(8, 8, 8, 8)
  69. fb_rgba16 = FrameBufferProperties()
  70. fb_rgba16.rgb_color = True
  71. fb_rgba16.set_rgba_bits(16, 16, 16, 16)
  72. assert fb_rgba8.get_quality(req_color0) > fb_rgba16.get_quality(req_color0)
  73. assert fb_rgba8.get_quality(req_color1) > fb_rgba16.get_quality(req_color1)
  74. assert fb_rgba8.get_quality(req_color0_alpha0) > fb_rgba16.get_quality(req_color0_alpha0)
  75. assert fb_rgba8.get_quality(req_color1_alpha1) > fb_rgba16.get_quality(req_color1_alpha1)
  76. assert fb_rgba8.get_quality(req_rgb0) > fb_rgba16.get_quality(req_rgb0)
  77. assert fb_rgba8.get_quality(req_rgb1) > fb_rgba16.get_quality(req_rgb1)
  78. assert fb_rgba8.get_quality(req_rgb0_alpha0) > fb_rgba16.get_quality(req_rgb0_alpha0)
  79. assert fb_rgba8.get_quality(req_rgb1_alpha1) > fb_rgba16.get_quality(req_rgb1_alpha1)
  80. def test_fbquality_multi_samples():
  81. # Make sure that we get appropriate quality levels for different sample requests
  82. fb_0_samples = FrameBufferProperties()
  83. fb_0_samples.set_rgb_color(1)
  84. fb_0_samples.set_multisamples(0)
  85. fb_2_samples = FrameBufferProperties()
  86. fb_2_samples.set_rgb_color(1)
  87. fb_2_samples.set_multisamples(2)
  88. fb_4_samples = FrameBufferProperties()
  89. fb_4_samples.set_rgb_color(1)
  90. fb_4_samples.set_multisamples(4)
  91. fb_8_samples = FrameBufferProperties()
  92. fb_8_samples.set_rgb_color(1)
  93. fb_8_samples.set_multisamples(8)
  94. fb_16_samples = FrameBufferProperties()
  95. fb_16_samples.set_rgb_color(1)
  96. fb_16_samples.set_multisamples(16)
  97. req_0_samples = FrameBufferProperties()
  98. req_0_samples.set_multisamples(0)
  99. req_1_samples = FrameBufferProperties()
  100. req_1_samples.set_multisamples(1)
  101. req_2_samples = FrameBufferProperties()
  102. req_2_samples.set_multisamples(2)
  103. req_4_samples = FrameBufferProperties()
  104. req_4_samples.set_multisamples(4)
  105. req_8_samples = FrameBufferProperties()
  106. req_8_samples.set_multisamples(8)
  107. req_16_samples = FrameBufferProperties()
  108. req_16_samples.set_multisamples(16)
  109. # a fb which does not provide the requested number of samples should always
  110. # have a lower quality than another
  111. assert fb_2_samples.get_quality(req_4_samples) < fb_2_samples.get_quality(req_2_samples)
  112. assert fb_2_samples.get_quality(req_4_samples) < fb_4_samples.get_quality(req_2_samples)
  113. assert fb_2_samples.get_quality(req_4_samples) < fb_8_samples.get_quality(req_2_samples)
  114. assert fb_2_samples.get_quality(req_4_samples) < fb_16_samples.get_quality(req_2_samples)
  115. assert fb_2_samples.get_quality(req_4_samples) < fb_16_samples.get_quality(req_16_samples)
  116. assert fb_8_samples.get_quality(req_16_samples) < fb_2_samples.get_quality(req_2_samples)
  117. # a fb which has more than the requested samples should have a
  118. # lower quality than one that matches exactly
  119. assert fb_2_samples.get_quality(req_2_samples) > fb_4_samples.get_quality(req_2_samples)
  120. assert fb_2_samples.get_quality(req_2_samples) > fb_8_samples.get_quality(req_2_samples)
  121. assert fb_2_samples.get_quality(req_2_samples) > fb_16_samples.get_quality(req_2_samples)
  122. assert fb_2_samples.get_quality(req_2_samples) > fb_16_samples.get_quality(req_8_samples)
  123. # the more additional samples the fb provides rather than what is requested,
  124. # the lower the quality should be
  125. assert fb_16_samples.get_quality(req_2_samples) < fb_8_samples.get_quality(req_2_samples)
  126. assert fb_8_samples.get_quality(req_2_samples) < fb_4_samples.get_quality(req_2_samples)
  127. # if the special value of 1 sample is requested, the fb with the highest samples should be
  128. # in favour
  129. assert fb_16_samples.get_quality(req_1_samples) > fb_8_samples.get_quality(req_1_samples)
  130. assert fb_16_samples.get_quality(req_1_samples) > fb_4_samples.get_quality(req_1_samples)
  131. assert fb_16_samples.get_quality(req_1_samples) > fb_2_samples.get_quality(req_1_samples)
  132. assert fb_8_samples.get_quality(req_1_samples) > fb_4_samples.get_quality(req_1_samples)
  133. assert fb_8_samples.get_quality(req_1_samples) > fb_2_samples.get_quality(req_1_samples)
  134. # if 0 samples are requested, the fb with the highest samples should get a reduced quality level
  135. assert fb_16_samples.get_quality(req_0_samples) < fb_8_samples.get_quality(req_0_samples)
  136. assert fb_16_samples.get_quality(req_0_samples) < fb_4_samples.get_quality(req_0_samples)
  137. assert fb_16_samples.get_quality(req_0_samples) < fb_2_samples.get_quality(req_0_samples)
  138. assert fb_8_samples.get_quality(req_0_samples) < fb_4_samples.get_quality(req_0_samples)
  139. assert fb_8_samples.get_quality(req_0_samples) < fb_2_samples.get_quality(req_0_samples)
  140. # if samples are requested we prefer the ones with samples instead of having none
  141. assert fb_0_samples.get_quality(req_2_samples) < fb_2_samples.get_quality(req_4_samples)
  142. assert fb_0_samples.get_quality(req_2_samples) < fb_2_samples.get_quality(req_8_samples)
  143. assert fb_0_samples.get_quality(req_2_samples) < fb_2_samples.get_quality(req_16_samples)
  144. # we prefer buffers without samples if we don't request some
  145. assert fb_0_samples.get_quality(req_0_samples) > fb_2_samples.get_quality(req_0_samples)
  146. assert fb_0_samples.get_quality(req_0_samples) > fb_4_samples.get_quality(req_0_samples)
  147. assert fb_0_samples.get_quality(req_0_samples) > fb_8_samples.get_quality(req_0_samples)
  148. assert fb_0_samples.get_quality(req_0_samples) > fb_16_samples.get_quality(req_0_samples)
  149. def test_fbquality_coverage_samples():
  150. # Make sure that we get appropriate quality levels for different sample requests
  151. fb_2_samples = FrameBufferProperties()
  152. fb_2_samples.set_rgb_color(1)
  153. fb_2_samples.set_coverage_samples(2)
  154. fb_4_samples = FrameBufferProperties()
  155. fb_4_samples.set_rgb_color(1)
  156. fb_4_samples.set_coverage_samples(4)
  157. fb_8_samples = FrameBufferProperties()
  158. fb_8_samples.set_rgb_color(1)
  159. fb_8_samples.set_coverage_samples(8)
  160. fb_16_samples = FrameBufferProperties()
  161. fb_16_samples.set_rgb_color(1)
  162. fb_16_samples.set_coverage_samples(16)
  163. req_0_samples = FrameBufferProperties()
  164. req_0_samples.set_coverage_samples(0)
  165. req_1_samples = FrameBufferProperties()
  166. req_1_samples.set_coverage_samples(1)
  167. req_2_samples = FrameBufferProperties()
  168. req_2_samples.set_coverage_samples(2)
  169. req_4_samples = FrameBufferProperties()
  170. req_4_samples.set_coverage_samples(4)
  171. req_8_samples = FrameBufferProperties()
  172. req_8_samples.set_coverage_samples(8)
  173. req_16_samples = FrameBufferProperties()
  174. req_16_samples.set_coverage_samples(16)
  175. # a fb which does not provide the requested number of samples should always
  176. # have a lower quality than another
  177. assert fb_2_samples.get_quality(req_4_samples) < fb_2_samples.get_quality(req_2_samples)
  178. assert fb_2_samples.get_quality(req_4_samples) < fb_4_samples.get_quality(req_2_samples)
  179. assert fb_2_samples.get_quality(req_4_samples) < fb_8_samples.get_quality(req_2_samples)
  180. assert fb_2_samples.get_quality(req_4_samples) < fb_16_samples.get_quality(req_2_samples)
  181. assert fb_2_samples.get_quality(req_4_samples) < fb_16_samples.get_quality(req_16_samples)
  182. assert fb_8_samples.get_quality(req_16_samples) < fb_2_samples.get_quality(req_2_samples)
  183. # a fb which has more than the requested samples should have a
  184. # lower quality than one that matches exactly
  185. assert fb_2_samples.get_quality(req_2_samples) > fb_4_samples.get_quality(req_2_samples)
  186. assert fb_2_samples.get_quality(req_2_samples) > fb_8_samples.get_quality(req_2_samples)
  187. assert fb_2_samples.get_quality(req_2_samples) > fb_16_samples.get_quality(req_2_samples)
  188. assert fb_2_samples.get_quality(req_2_samples) > fb_16_samples.get_quality(req_8_samples)
  189. # the more additional samples the fb provides rather than what is requested,
  190. # the lower the quality should be
  191. assert fb_16_samples.get_quality(req_2_samples) < fb_8_samples.get_quality(req_2_samples)
  192. assert fb_8_samples.get_quality(req_2_samples) < fb_4_samples.get_quality(req_2_samples)
  193. # if the special value of 1 sample is requested, the fb with the highest samples should be
  194. # in favour
  195. assert fb_16_samples.get_quality(req_1_samples) > fb_8_samples.get_quality(req_1_samples)
  196. assert fb_16_samples.get_quality(req_1_samples) > fb_4_samples.get_quality(req_1_samples)
  197. assert fb_16_samples.get_quality(req_1_samples) > fb_2_samples.get_quality(req_1_samples)
  198. assert fb_8_samples.get_quality(req_1_samples) > fb_4_samples.get_quality(req_1_samples)
  199. assert fb_8_samples.get_quality(req_1_samples) > fb_2_samples.get_quality(req_1_samples)
  200. # if 0 samples are requested, the fb with the highest samples should get a reduced quality level
  201. assert fb_16_samples.get_quality(req_0_samples) < fb_8_samples.get_quality(req_0_samples)
  202. assert fb_16_samples.get_quality(req_0_samples) < fb_4_samples.get_quality(req_0_samples)
  203. assert fb_16_samples.get_quality(req_0_samples) < fb_2_samples.get_quality(req_0_samples)
  204. assert fb_8_samples.get_quality(req_0_samples) < fb_4_samples.get_quality(req_0_samples)
  205. assert fb_8_samples.get_quality(req_0_samples) < fb_2_samples.get_quality(req_0_samples)