gl_discardable_textures_unittest.cc 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. // Copyright 2018 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include <GLES2/gl2.h>
  5. #include <GLES2/gl2ext.h>
  6. #include <GLES2/gl2extchromium.h>
  7. #include <stdint.h>
  8. #include "gpu/command_buffer/client/gles2_implementation.h"
  9. #include "gpu/command_buffer/tests/gl_manager.h"
  10. #include "gpu/command_buffer/tests/gl_test_utils.h"
  11. #include "testing/gtest/include/gtest/gtest.h"
  12. namespace gpu {
  13. class DiscardableTextureTest : public testing::Test {
  14. protected:
  15. void SetUp() override { gl_.Initialize(GLManager::Options()); }
  16. void TearDown() override { gl_.Destroy(); }
  17. void SetCacheSizeLimitForTesting(size_t cache_size_limit) {
  18. gl_.discardable_manager()->SetCacheSizeLimitForTesting(cache_size_limit);
  19. gl_.passthrough_discardable_manager()->SetCacheSizeLimitForTesting(
  20. cache_size_limit);
  21. }
  22. size_t DiscardableManagerTotalSizeForTesting() {
  23. size_t discardable_manager_size =
  24. gl_.discardable_manager()->TotalSizeForTesting();
  25. size_t passthough_discardable_manager_size =
  26. gl_.passthrough_discardable_manager()->TotalSizeForTesting();
  27. // Only one discardable manager is in use at a time
  28. EXPECT_TRUE(discardable_manager_size == 0 ||
  29. passthough_discardable_manager_size == 0);
  30. return discardable_manager_size + passthough_discardable_manager_size;
  31. }
  32. size_t DiscardableManagerNumCacheEntriesForTesting() {
  33. size_t discardable_manager_entries =
  34. gl_.discardable_manager()->NumCacheEntriesForTesting();
  35. size_t passthough_discardable_manager_entries =
  36. gl_.passthrough_discardable_manager()->NumCacheEntriesForTesting();
  37. // Only one discardable manager is in use at a time
  38. EXPECT_TRUE(discardable_manager_entries == 0 ||
  39. passthough_discardable_manager_entries == 0);
  40. return discardable_manager_entries + passthough_discardable_manager_entries;
  41. }
  42. GLManager gl_;
  43. };
  44. TEST_F(DiscardableTextureTest, BasicUsage) {
  45. GLuint texture = 0;
  46. glGenTextures(1, &texture);
  47. glBindTexture(GL_TEXTURE_2D, texture);
  48. glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 32, 32, 0, GL_RGBA, GL_UNSIGNED_BYTE,
  49. nullptr);
  50. GLTestHelper::CheckGLError("no errors", __LINE__);
  51. gl_.gles2_implementation()->InitializeDiscardableTextureCHROMIUM(texture);
  52. GLTestHelper::CheckGLError("no errors", __LINE__);
  53. EXPECT_GT(DiscardableManagerTotalSizeForTesting(), 0u);
  54. gl_.gles2_implementation()->UnlockDiscardableTextureCHROMIUM(texture);
  55. GLTestHelper::CheckGLError("no errors", __LINE__);
  56. }
  57. TEST_F(DiscardableTextureTest, Limits) {
  58. // Each texture will be 32x32 RGBA unsigned byte
  59. constexpr GLsizei texture_dimension_size = 32;
  60. constexpr size_t texture_size =
  61. texture_dimension_size * texture_dimension_size * 4;
  62. // Set a size limit that should only fit one texture
  63. constexpr size_t cache_size_limit = texture_size + 10;
  64. SetCacheSizeLimitForTesting(cache_size_limit);
  65. constexpr size_t texture_count = 2;
  66. GLuint textures[texture_count] = {};
  67. glGenTextures(texture_count, textures);
  68. for (size_t i = 0; i < texture_count; i++) {
  69. glBindTexture(GL_TEXTURE_2D, textures[i]);
  70. glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, texture_dimension_size,
  71. texture_dimension_size, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
  72. GLTestHelper::CheckGLError("no errors", __LINE__);
  73. gl_.gles2_implementation()->InitializeDiscardableTextureCHROMIUM(
  74. textures[i]);
  75. GLTestHelper::CheckGLError("no errors", __LINE__);
  76. EXPECT_EQ(i + 1, DiscardableManagerNumCacheEntriesForTesting());
  77. }
  78. // Make sure the discardable manager has gone over it's cache size limit
  79. EXPECT_GT(DiscardableManagerTotalSizeForTesting(), cache_size_limit);
  80. // Unlock the textures, verify that they are still tracked
  81. for (size_t i = 0; i < texture_count; i++) {
  82. gl_.gles2_implementation()->UnlockDiscardableTextureCHROMIUM(textures[i]);
  83. GLTestHelper::CheckGLError("no errors", __LINE__);
  84. EXPECT_EQ(texture_count, DiscardableManagerNumCacheEntriesForTesting());
  85. }
  86. // Add a new, large texture the cache and verify that the original textures
  87. // have been removed
  88. constexpr GLsizei large_texture_dimension = texture_dimension_size * 2;
  89. GLuint large_texture = 0;
  90. glGenTextures(1, &large_texture);
  91. glBindTexture(GL_TEXTURE_2D, large_texture);
  92. glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, large_texture_dimension,
  93. large_texture_dimension, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
  94. GLTestHelper::CheckGLError("no errors", __LINE__);
  95. gl_.gles2_implementation()->InitializeDiscardableTextureCHROMIUM(
  96. large_texture);
  97. GLTestHelper::CheckGLError("no errors", __LINE__);
  98. EXPECT_EQ(1u, DiscardableManagerNumCacheEntriesForTesting());
  99. }
  100. TEST_F(DiscardableTextureTest, CompressedTexImage2D) {
  101. if (!GLTestHelper::HasExtension("GL_ANGLE_texture_compression_dxt1")) {
  102. LOG(INFO)
  103. << "GL_ANGLE_texture_compression_dxt1 not supported. Skipping test...";
  104. return;
  105. }
  106. GLuint texture = 0;
  107. glGenTextures(1, &texture);
  108. glBindTexture(GL_TEXTURE_2D, texture);
  109. constexpr GLubyte data[8] = {};
  110. glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGB_S3TC_DXT1_EXT, 4,
  111. 4, 0, 8, data);
  112. GLTestHelper::CheckGLError("no errors", __LINE__);
  113. gl_.gles2_implementation()->InitializeDiscardableTextureCHROMIUM(texture);
  114. GLTestHelper::CheckGLError("no errors", __LINE__);
  115. EXPECT_GT(DiscardableManagerTotalSizeForTesting(), 0u);
  116. gl_.gles2_implementation()->UnlockDiscardableTextureCHROMIUM(texture);
  117. GLTestHelper::CheckGLError("no errors", __LINE__);
  118. }
  119. TEST_F(DiscardableTextureTest, TexStorage2D) {
  120. if (!GLTestHelper::HasExtension("GL_EXT_texture_storage")) {
  121. LOG(INFO) << "GL_EXT_texture_storage not supported. Skipping test...";
  122. return;
  123. }
  124. GLuint texture = 0;
  125. glGenTextures(1, &texture);
  126. glBindTexture(GL_TEXTURE_2D, texture);
  127. glTexStorage2DEXT(GL_TEXTURE_2D, 1, GL_ALPHA8_EXT, 1, 1);
  128. GLTestHelper::CheckGLError("no errors", __LINE__);
  129. gl_.gles2_implementation()->InitializeDiscardableTextureCHROMIUM(texture);
  130. GLTestHelper::CheckGLError("no errors", __LINE__);
  131. EXPECT_GT(DiscardableManagerTotalSizeForTesting(), 0u);
  132. gl_.gles2_implementation()->UnlockDiscardableTextureCHROMIUM(texture);
  133. GLTestHelper::CheckGLError("no errors", __LINE__);
  134. }
  135. TEST_F(DiscardableTextureTest, CopyTexImage2D) {
  136. GLuint fbo = 0;
  137. glGenFramebuffers(1, &fbo);
  138. glBindFramebuffer(GL_FRAMEBUFFER, fbo);
  139. GLuint textures[2] = {};
  140. glGenTextures(2, textures);
  141. glBindTexture(GL_TEXTURE_2D, textures[0]);
  142. glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE,
  143. nullptr);
  144. glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
  145. textures[0], 0);
  146. GLTestHelper::CheckGLError("no errors", __LINE__);
  147. glBindTexture(GL_TEXTURE_2D, textures[1]);
  148. glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, 1, 1, 0);
  149. gl_.gles2_implementation()->InitializeDiscardableTextureCHROMIUM(textures[1]);
  150. GLTestHelper::CheckGLError("no errors", __LINE__);
  151. EXPECT_GT(DiscardableManagerTotalSizeForTesting(), 0u);
  152. gl_.gles2_implementation()->UnlockDiscardableTextureCHROMIUM(textures[1]);
  153. GLTestHelper::CheckGLError("no errors", __LINE__);
  154. }
  155. } // namespace gpu