gl_image_ahardwarebuffer_unittest.cc 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. // Copyright 2017 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 <stdint.h>
  5. #include <vector>
  6. #include "base/android/android_hardware_buffer_compat.h"
  7. #include "base/memory/scoped_refptr.h"
  8. #include "testing/gtest/include/gtest/gtest.h"
  9. #include "ui/gl/gl_image_ahardwarebuffer.h"
  10. #include "ui/gl/test/gl_image_bind_test_template.h"
  11. #include "ui/gl/test/gl_image_test_template.h"
  12. #include "ui/gl/test/gl_image_zero_initialize_test_template.h"
  13. namespace gl {
  14. namespace {
  15. const uint8_t kGreen[] = {0x0, 0xFF, 0x0, 0xFF};
  16. template <gfx::BufferFormat format>
  17. class GLImageAHardwareBufferTestDelegate : public GLImageTestDelegateBase {
  18. public:
  19. scoped_refptr<GLImage> CreateSolidColorImage(const gfx::Size& size,
  20. const uint8_t color[4]) const {
  21. CHECK(base::AndroidHardwareBufferCompat::IsSupportAvailable());
  22. // AHardwareBuffer_Desc's stride parameter is in pixels, not in bytes.
  23. //
  24. // We can't use the 3-byte-per-pixel AHARDWAREBUFFER_FORMAT_R8G8B8_UNORM
  25. // format in this test since there's no matching gfx::BufferFormat,
  26. // gfx::BufferFormat::RGBX_8888 assumes 4 bytes per pixel.
  27. const int kBytesPerPixel = 4;
  28. // cf. gpu_memory_buffer_impl_android_hardware_buffer
  29. AHardwareBuffer_Desc desc = {};
  30. desc.width = size.width();
  31. desc.height = size.height();
  32. desc.layers = 1; // number of images
  33. desc.usage = AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE |
  34. AHARDWAREBUFFER_USAGE_GPU_COLOR_OUTPUT |
  35. AHARDWAREBUFFER_USAGE_CPU_READ_RARELY |
  36. AHARDWAREBUFFER_USAGE_CPU_WRITE_RARELY;
  37. switch (format) {
  38. case gfx::BufferFormat::RGBA_8888:
  39. desc.format = AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM;
  40. break;
  41. case gfx::BufferFormat::RGBX_8888:
  42. desc.format = AHARDWAREBUFFER_FORMAT_R8G8B8X8_UNORM;
  43. break;
  44. default:
  45. NOTREACHED();
  46. }
  47. AHardwareBuffer* buffer = nullptr;
  48. base::AndroidHardwareBufferCompat::GetInstance().Allocate(&desc, &buffer);
  49. EXPECT_TRUE(buffer);
  50. uint8_t* data = nullptr;
  51. int lock_result = base::AndroidHardwareBufferCompat::GetInstance().Lock(
  52. buffer, AHARDWAREBUFFER_USAGE_CPU_WRITE_RARELY, -1, nullptr,
  53. reinterpret_cast<void**>(&data));
  54. EXPECT_EQ(lock_result, 0);
  55. EXPECT_TRUE(data);
  56. AHardwareBuffer_Desc desc_locked = {};
  57. base::AndroidHardwareBufferCompat::GetInstance().Describe(buffer,
  58. &desc_locked);
  59. GLImageTestSupport::SetBufferDataToColor(
  60. size.width(), size.height(), desc_locked.stride * kBytesPerPixel, 0,
  61. format, color, data);
  62. int unlock_result = base::AndroidHardwareBufferCompat::GetInstance().Unlock(
  63. buffer, nullptr);
  64. EXPECT_EQ(unlock_result, 0);
  65. auto image = base::MakeRefCounted<GLImageAHardwareBuffer>(size);
  66. bool rv = image->Initialize(buffer, /* preserved */ true);
  67. EXPECT_TRUE(rv);
  68. return image;
  69. }
  70. scoped_refptr<GLImage> CreateImage(const gfx::Size& size) const {
  71. const uint8_t kTransparentBlack[4] = {0, 0, 0, 0};
  72. return CreateSolidColorImage(size, kTransparentBlack);
  73. }
  74. unsigned GetTextureTarget() const { return GL_TEXTURE_2D; }
  75. const uint8_t* GetImageColor() { return kGreen; }
  76. int GetAdmissibleError() const { return 0; }
  77. };
  78. using GLImageTestTypes = testing::Types<
  79. GLImageAHardwareBufferTestDelegate<gfx::BufferFormat::RGBA_8888>,
  80. GLImageAHardwareBufferTestDelegate<gfx::BufferFormat::RGBX_8888>>;
  81. using GLImageRGBTestTypes = testing::Types<
  82. GLImageAHardwareBufferTestDelegate<gfx::BufferFormat::RGBA_8888>>;
  83. // Disable the tests by default for now since they require Android O,
  84. // the test bots don't generally have that yet. For manual testing,
  85. // add: --gtest_also_run_disabled_tests -f 'GLImageAHardwareBuffer/*'
  86. INSTANTIATE_TYPED_TEST_SUITE_P(DISABLED_GLImageAHardwareBuffer,
  87. GLImageTest,
  88. GLImageTestTypes);
  89. INSTANTIATE_TYPED_TEST_SUITE_P(DISABLED_GLImageAHardwareBuffer,
  90. GLImageOddSizeTest,
  91. GLImageTestTypes);
  92. INSTANTIATE_TYPED_TEST_SUITE_P(DISABLED_GLImageAHardwareBuffer,
  93. GLImageBindTest,
  94. GLImageTestTypes);
  95. INSTANTIATE_TYPED_TEST_SUITE_P(DISABLED_GLImageAHardwareBuffer,
  96. GLImageZeroInitializeTest,
  97. GLImageRGBTestTypes);
  98. } // namespace
  99. } // namespace gl