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