gl_request_extension_unittest.cc 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. // Copyright 2016 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 <GLES3/gl3.h>
  8. #include "base/strings/string_split.h"
  9. #include "base/strings/string_util.h"
  10. #include "gpu/command_buffer/tests/gl_manager.h"
  11. #include "gpu/command_buffer/tests/gl_test_utils.h"
  12. #include "testing/gmock/include/gmock/gmock.h"
  13. #include "testing/gtest/include/gtest/gtest.h"
  14. namespace gpu {
  15. class RequestExtensionCHROMIUMTest
  16. : public testing::TestWithParam<ContextType> {
  17. protected:
  18. void SetUp() override {
  19. GLManager::Options options;
  20. options.context_type = GetParam();
  21. gl_.Initialize(options);
  22. }
  23. void TearDown() override { gl_.Destroy(); }
  24. bool IsApplicable() const { return gl_.IsInitialized(); }
  25. GLManager gl_;
  26. };
  27. TEST_P(RequestExtensionCHROMIUMTest, Basic) {
  28. if (!IsApplicable()) {
  29. return;
  30. }
  31. // Test to test that requesting an extension does not delete any extensions.
  32. // Also tests that WebGL2 and GLES3 contexts keep glGetString(GL_EXTENSIONS)
  33. // and glGetStringi(GL_EXTENSIONS, index) in sync.
  34. std::string requestable_extensions_string =
  35. reinterpret_cast<const char*>(glGetRequestableExtensionsCHROMIUM());
  36. std::vector<std::string> requestable =
  37. base::SplitString(requestable_extensions_string, base::kWhitespaceASCII,
  38. base::TRIM_WHITESPACE, base::SPLIT_WANT_NONEMPTY);
  39. for (const auto& to_request : requestable) {
  40. std::string extension_string =
  41. reinterpret_cast<const char*>(glGetString(GL_EXTENSIONS));
  42. extension_string += " ";
  43. size_t extensions_size_before_request =
  44. base::SplitString(extension_string, base::kWhitespaceASCII,
  45. base::TRIM_WHITESPACE, base::SPLIT_WANT_NONEMPTY)
  46. .size();
  47. if (extension_string.find(to_request + " ") != std::string::npos) {
  48. // Somewhat counterintuitively, requestable extensions contain every
  49. // extension available.
  50. continue;
  51. }
  52. glRequestExtensionCHROMIUM(to_request.c_str());
  53. extension_string =
  54. reinterpret_cast<const char*>(glGetString(GL_EXTENSIONS));
  55. std::vector<std::string> extensions =
  56. base::SplitString(extension_string, base::kWhitespaceASCII,
  57. base::TRIM_WHITESPACE, base::SPLIT_WANT_NONEMPTY);
  58. std::set<std::string> extensions_from_string(extensions.begin(),
  59. extensions.end());
  60. if (GetParam() == CONTEXT_TYPE_WEBGL2 ||
  61. GetParam() == CONTEXT_TYPE_OPENGLES3) {
  62. // Test that GetString(GL_EXTENSIONS) is consistent with
  63. // GetStringi(GL_EXTENSIONS, index)
  64. GLint num_extensions = 0;
  65. glGetIntegerv(GL_NUM_EXTENSIONS, &num_extensions);
  66. EXPECT_EQ(static_cast<size_t>(num_extensions), extensions.size());
  67. std::set<std::string> extensions_from_stringi;
  68. for (int i = 0; i < num_extensions; ++i) {
  69. extensions_from_stringi.insert(
  70. reinterpret_cast<const char*>(glGetStringi(GL_EXTENSIONS, i)));
  71. }
  72. EXPECT_EQ(extensions_from_string, extensions_from_stringi);
  73. }
  74. // Somewhat counterintuitively, requesting an extension that is offered
  75. // does not necessarily make it appear in the extensions list.
  76. // This is due to the fact that offered extensions list contains every
  77. // available extension, while WebGL2 filters extension list
  78. // based on what's in core WebGL2.
  79. // Test that RequestExtension does not erase any extensions.
  80. EXPECT_GE(extensions.size(), extensions_size_before_request);
  81. }
  82. }
  83. INSTANTIATE_TEST_SUITE_P(WithContextTypes,
  84. RequestExtensionCHROMIUMTest,
  85. ::testing::Values(CONTEXT_TYPE_WEBGL1,
  86. CONTEXT_TYPE_WEBGL2,
  87. CONTEXT_TYPE_OPENGLES2,
  88. CONTEXT_TYPE_OPENGLES3));
  89. }