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