Flutter Impeller
ahb_texture_source_vk_unittests.cc
Go to the documentation of this file.
1 // Copyright 2013 The Flutter 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 
6 #include <memory>
7 
8 #include "flutter/testing/testing.h"
9 #include "gtest/gtest.h"
15 
17 
19  static AHardwareBuffer* InvalidValue() { return nullptr; }
20  static bool IsValid(AHardwareBuffer* value) { return value != nullptr; }
21  static void Free(AHardwareBuffer* value) { ::AHardwareBuffer_release(value); }
22 };
23 
25  fml::UniqueObject<AHardwareBuffer*, UniqueAHardwareBufferTraits>;
26 
28  const AHardwareBuffer_Desc& desc) {
29  AHardwareBuffer* buffer = nullptr;
30  EXPECT_EQ(AHardwareBuffer_allocate(&desc, &buffer), 0);
31  return UniqueAHardwareBuffer(buffer);
32 }
33 
34 // Set up context.
35 std::shared_ptr<ContextVK> CreateContext() {
36  auto vulkan_dylib = fml::NativeLibrary::Create("libvulkan.so");
37  auto instance_proc_addr =
38  vulkan_dylib->ResolveFunction<PFN_vkGetInstanceProcAddr>(
39  "vkGetInstanceProcAddr");
40 
41  if (!instance_proc_addr.has_value()) {
42  VALIDATION_LOG << "Could not setup Vulkan proc table.";
43  return nullptr;
44  }
45 
47  settings.proc_address_callback = instance_proc_addr.value();
48  settings.shader_libraries_data = {};
49  settings.enable_validation = false;
50  settings.enable_gpu_tracing = false;
51  settings.enable_surface_control = false;
52 
53  return ContextVK::Create(std::move(settings));
54 }
55 
56 TEST(AndroidVulkanTest, CanImportRGBA) {
58  GTEST_SKIP() << "Hardware buffers are not supported on this platform.";
59  }
60 
62  desc.size = ISize{1, 1};
65 
66  auto ahb = std::make_unique<HardwareBuffer>(desc);
67  ASSERT_TRUE(ahb);
68  auto context_vk = CreateContext();
69  ASSERT_TRUE(context_vk);
70 
71  AHBTextureSourceVK source(context_vk, std::move(ahb),
72  /*is_swapchain_image=*/false);
73 
74  EXPECT_TRUE(source.IsValid());
75  EXPECT_EQ(source.GetYUVConversion(), nullptr);
76 
77  context_vk->Shutdown();
78 }
79 
80 TEST(AndroidVulkanTest, CanImportWithYUB) {
82  GTEST_SKIP() << "Hardware buffers are not supported on this platform.";
83  }
84 
85  AHardwareBuffer_Desc desc;
86  desc.width = 16;
87  desc.height = 16;
88  desc.format = AHARDWAREBUFFER_FORMAT_Y8Cb8Cr8_420;
89  desc.stride = 0;
90  desc.layers = 1;
91  desc.rfu0 = 0;
92  desc.rfu1 = 0;
93  desc.usage = AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE |
94  AHARDWAREBUFFER_USAGE_CPU_WRITE_MASK |
95  AHARDWAREBUFFER_USAGE_CPU_READ_MASK;
96 
97  EXPECT_EQ(AHardwareBuffer_isSupported(&desc), 1);
98 
100  ASSERT_TRUE(buffer.is_valid());
101 
102  auto context_vk = CreateContext();
103  ASSERT_TRUE(context_vk);
104 
105  AHBTextureSourceVK source(context_vk, buffer.get(), desc);
106 
107  EXPECT_TRUE(source.IsValid());
108  EXPECT_NE(source.GetYUVConversion(), nullptr);
109 
110  context_vk->Shutdown();
111 }
112 
113 TEST(AndroidVulkanTest, CreateImageViewForOpaqueAlpha) {
115  GTEST_SKIP() << "Hardware buffers are not supported on this platform.";
116  }
117 
118  AHardwareBuffer_Desc desc;
119  desc.width = 16;
120  desc.height = 16;
121  desc.format = AHARDWAREBUFFER_FORMAT_R8G8B8X8_UNORM;
122  desc.stride = 0;
123  desc.layers = 1;
124  desc.rfu0 = 0;
125  desc.rfu1 = 0;
126  desc.usage = AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE |
127  AHARDWAREBUFFER_USAGE_CPU_WRITE_MASK |
128  AHARDWAREBUFFER_USAGE_CPU_READ_MASK;
129 
130  EXPECT_EQ(AHardwareBuffer_isSupported(&desc), 1);
131 
133  ASSERT_TRUE(buffer.is_valid());
134 
135  auto context_vk = CreateContext();
136  ASSERT_TRUE(context_vk);
137 
139  ASSERT_EQ(context_vk->GetDevice().getAndroidHardwareBufferPropertiesANDROID(
140  buffer.get(), &ahb_props.get()),
141  vk::Result::eSuccess);
142 
144  context_vk->GetDevice(), ahb_props, desc);
145  ASSERT_TRUE(image);
146 
147  auto image_info = AHBTextureSourceVK::CreateImageViewInfo(
148  image.get(), nullptr, ahb_props, desc);
149 
150  EXPECT_EQ(image_info.get().components.a, vk::ComponentSwizzle::eOne);
151 
152  context_vk->Shutdown();
153 }
154 
155 } // namespace impeller::android::testing
A texture source that wraps an instance of AHardwareBuffer.
static vk::UniqueImage CreateVKImageWrapperForAndroidHarwareBuffer(const vk::Device &device, const AHBProperties &ahb_props, const AHardwareBuffer_Desc &ahb_desc)
Create a VkImage that wraps an Android hardware buffer.
std::shared_ptr< YUVConversionVK > GetYUVConversion() const override
When sampling from textures whose formats are not known to Vulkan, a custom conversion is necessary t...
vk::StructureChain< vk::AndroidHardwareBufferPropertiesANDROID, vk::AndroidHardwareBufferFormatPropertiesANDROID > AHBProperties
static ImageViewInfo CreateImageViewInfo(const vk::Image &image, const std::shared_ptr< YUVConversionVK > &yuv_conversion_wrapper, const AHBProperties &ahb_props, const AHardwareBuffer_Desc &ahb_desc)
static std::shared_ptr< ContextVK > Create(Settings settings)
Definition: context_vk.cc:105
int32_t value
fml::UniqueObject< AHardwareBuffer *, UniqueAHardwareBufferTraits > UniqueAHardwareBuffer
UniqueAHardwareBuffer AllocateAHardwareBuffer(const AHardwareBuffer_Desc &desc)
std::shared_ptr< ContextVK > CreateContext()
TEST(AndroidVulkanTest, CanImportRGBA)
ScopedObject< Object > Create(CtorArgs &&... args)
Definition: object.h:161
std::vector< std::shared_ptr< fml::Mapping > > shader_libraries_data
Definition: context_vk.h:81
PFN_vkGetInstanceProcAddr proc_address_callback
Definition: context_vk.h:80
A descriptor use to specify hardware buffer allocations.
#define VALIDATION_LOG
Definition: validation.h:91