Flutter Impeller
ahb_texture_source_vk.h
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 
5 #ifndef FLUTTER_IMPELLER_RENDERER_BACKEND_VULKAN_ANDROID_AHB_TEXTURE_SOURCE_VK_H_
6 #define FLUTTER_IMPELLER_RENDERER_BACKEND_VULKAN_ANDROID_AHB_TEXTURE_SOURCE_VK_H_
7 
12 
14 #include <android/hardware_buffer_jni.h>
15 
16 namespace impeller {
17 
18 class ContextVK;
19 
20 //------------------------------------------------------------------------------
21 /// @brief A texture source that wraps an instance of AHardwareBuffer.
22 ///
23 /// The formats and conversions supported by Android Hardware
24 /// Buffers are a superset of those supported by Impeller (and
25 /// Vulkan for that matter). Impeller and Vulkan descriptors
26 /// obtained from the these texture sources are advisory and it
27 /// usually isn't possible to create copies of images and image
28 /// views held in these texture sources using the inferred
29 /// descriptors. The objects are meant to be used directly (either
30 /// as render targets or sources for sampling), not copied.
31 ///
32 class AHBTextureSourceVK final : public TextureSourceVK {
33  public:
34  AHBTextureSourceVK(const std::shared_ptr<Context>& context,
35  struct AHardwareBuffer* hardware_buffer,
36  const AHardwareBuffer_Desc& hardware_buffer_desc);
37 
38  AHBTextureSourceVK(const std::shared_ptr<Context>& context,
39  std::unique_ptr<android::HardwareBuffer> backing_store,
40  bool is_swapchain_image);
41 
42  // |TextureSourceVK|
43  ~AHBTextureSourceVK() override;
44 
45  // |TextureSourceVK|
46  vk::Image GetImage() const override;
47 
48  // |TextureSourceVK|
49  vk::ImageView GetImageView() const override;
50 
51  // |TextureSourceVK|
52  vk::ImageView GetRenderTargetView(uint32_t mip_level,
53  uint32_t array_layer) const override;
54 
55  bool IsValid() const;
56 
57  // |TextureSourceVK|
58  bool IsSwapchainImage() const override;
59 
60  // |TextureSourceVK|
61  std::shared_ptr<YUVConversionVK> GetYUVConversion() const override;
62 
64 
65  using AHBProperties = vk::StructureChain<
66  // For VK_ANDROID_external_memory_android_hardware_buffer
67  vk::AndroidHardwareBufferPropertiesANDROID,
68  // For VK_ANDROID_external_memory_android_hardware_buffer
69  vk::AndroidHardwareBufferFormatPropertiesANDROID>;
70 
71  using ImageViewInfo = vk::StructureChain<vk::ImageViewCreateInfo,
72  // Core in 1.1
73  vk::SamplerYcbcrConversionInfo>;
74 
75  /// Create a VkImage that wraps an Android hardware buffer.
76  static vk::UniqueImage CreateVKImageWrapperForAndroidHarwareBuffer(
77  const vk::Device& device,
78  const AHBProperties& ahb_props,
79  const AHardwareBuffer_Desc& ahb_desc);
80 
81  /// Create a VkImageViewCreateInfo that matches the properties of an Android
82  /// hardware buffer.
84  const vk::Image& image,
85  const std::shared_ptr<YUVConversionVK>& yuv_conversion_wrapper,
86  const AHBProperties& ahb_props,
87  const AHardwareBuffer_Desc& ahb_desc);
88 
89  private:
90  std::unique_ptr<android::HardwareBuffer> backing_store_;
91  vk::UniqueDeviceMemory device_memory_ = {};
92  vk::UniqueImage image_ = {};
93  vk::UniqueImageView image_view_ = {};
94  std::shared_ptr<YUVConversionVK> yuv_conversion_ = {};
95  bool needs_yuv_conversion_ = false;
96  bool is_swapchain_image_ = false;
97  bool is_valid_ = false;
98 
99  AHBTextureSourceVK(const AHBTextureSourceVK&) = delete;
100 
101  AHBTextureSourceVK& operator=(const AHBTextureSourceVK&) = delete;
102 };
103 
104 } // namespace impeller
105 
106 #endif // FLUTTER_IMPELLER_RENDERER_BACKEND_VULKAN_ANDROID_AHB_TEXTURE_SOURCE_VK_H_
A texture source that wraps an instance of AHardwareBuffer.
vk::StructureChain< vk::ImageViewCreateInfo, vk::SamplerYcbcrConversionInfo > ImageViewInfo
vk::ImageView GetRenderTargetView(uint32_t mip_level, uint32_t array_layer) const override
Retrieve the image view used to attach a specific subresource of this texture as a render target.
bool IsSwapchainImage() const override
Determines if swapchain image. That is, an image used as the root render target.
vk::Image GetImage() const override
Get the image handle for this texture source.
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.
const android::HardwareBuffer * GetBackingStore() const
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
AHBTextureSourceVK(const std::shared_ptr< Context > &context, struct AHardwareBuffer *hardware_buffer, const AHardwareBuffer_Desc &hardware_buffer_desc)
vk::ImageView GetImageView() const override
Retrieve the image view used for sampling/blitting/compute with this texture source.
static ImageViewInfo CreateImageViewInfo(const vk::Image &image, const std::shared_ptr< YUVConversionVK > &yuv_conversion_wrapper, const AHBProperties &ahb_props, const AHardwareBuffer_Desc &ahb_desc)
Abstract base class that represents a vkImage and an vkImageView.
A wrapper for AHardwareBuffer https://developer.android.com/ndk/reference/group/a-hardware-buffer.
std::shared_ptr< ContextGLES > context