Flutter Impeller
yuv_conversion_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_YUV_CONVERSION_VK_H_
6 #define FLUTTER_IMPELLER_RENDERER_BACKEND_VULKAN_YUV_CONVERSION_VK_H_
7 
8 #include <unordered_map>
9 
10 #include "flutter/fml/build_config.h"
12 #include "impeller/base/thread.h"
13 #include "impeller/core/sampler.h"
17 
18 namespace impeller {
19 
20 //------------------------------------------------------------------------------
21 /// A descriptor used to create a new YUV conversion in a conversion library.
22 ///
24  vk::StructureChain<vk::SamplerYcbcrConversionCreateInfo
25 #if FML_OS_ANDROID
26  // For VK_ANDROID_external_memory_android_hardware_buffer
27  ,
28  vk::ExternalFormatANDROID
29 #endif // FML_OS_ANDROID
30  >;
31 
33 
34 //------------------------------------------------------------------------------
35 /// @brief It is sometimes necessary to deal with formats not native to
36 /// Vulkan. In such cases, extra information is necessary to access
37 /// images. A YUV conversion object is needed in such instances.
38 ///
39 /// There are usually only a handful of viable conversions in a
40 /// given context. However, due to the way the Vulkan spec. treats
41 /// "identically defined" conversions, only a single conversion
42 /// object is valid for an equivalent `YUVConversionDescriptorVK`.
43 /// Because of this restriction, it is not possible to just create a
44 /// conversion from a descriptor (as the underlying handles will be
45 /// equivalent but different). Instead, a conversion may only be
46 /// obtained from a conversion library. Libraries handle hashing and
47 /// caching conversions by descriptor. Caller can find a library on
48 /// the top-level context. They may not create their own (the
49 /// constructor is private).
50 ///
51 class YUVConversionVK final {
52  public:
54 
55  YUVConversionVK(const YUVConversionVK&) = delete;
56 
57  YUVConversionVK& operator=(const YUVConversionVK&) = delete;
58 
59  //----------------------------------------------------------------------------
60  /// @return `true` if this conversion is valid for use with images and
61  /// samplers.
62  ///
63  bool IsValid() const;
64 
65  //----------------------------------------------------------------------------
66  /// @brief Get the descriptor used to create this conversion.
67  ///
69 
70  //----------------------------------------------------------------------------
71  /// @return The Vulkan handle of the YUV conversion.
72  ///
73  vk::SamplerYcbcrConversion GetConversion() const;
74 
75  private:
76  friend class YUVConversionLibraryVK;
77 
79  vk::UniqueSamplerYcbcrConversion conversion_;
80 
81  YUVConversionVK(const vk::Device& device,
82  const YUVConversionDescriptorVK& chain);
83 };
84 
86  std::size_t operator()(const YUVConversionDescriptorVK& object) const;
87 };
88 
90  bool operator()(const YUVConversionDescriptorVK& lhs,
91  const YUVConversionDescriptorVK& rhs) const;
92 };
93 
94 struct ImmutableSamplerKeyVK : public Comparable<ImmutableSamplerKeyVK> {
97 
98  explicit ImmutableSamplerKeyVK(const SamplerVK& sampler);
99 
100  // |Comparable<ImmutableSamplerKey>|
101  std::size_t GetHash() const override;
102 
103  // |Comparable<ImmutableSamplerKey>|
104  bool IsEqual(const ImmutableSamplerKeyVK& other) const override;
105 };
106 
107 } // namespace impeller
108 
109 #endif // FLUTTER_IMPELLER_RENDERER_BACKEND_VULKAN_YUV_CONVERSION_VK_H_
impeller::ImmutableSamplerKeyVK
Definition: yuv_conversion_vk.h:94
shared_object_vk.h
impeller::ImmutableSamplerKeyVK::ImmutableSamplerKeyVK
ImmutableSamplerKeyVK(const SamplerVK &sampler)
Definition: yuv_conversion_vk.cc:102
sampler.h
impeller::YUVConversionVK::IsValid
bool IsValid() const
Definition: yuv_conversion_vk.cc:28
impeller::SamplerVK
Definition: sampler_vk.h:19
impeller::YUVConversionVK::GetConversion
vk::SamplerYcbcrConversion GetConversion() const
Definition: yuv_conversion_vk.cc:32
vk.h
impeller::YUVConversionDescriptorVKHash
Definition: yuv_conversion_vk.h:85
impeller::SamplerDescriptor
Definition: sampler_descriptor.h:15
impeller::YUVConversionVK::YUVConversionVK
YUVConversionVK(const YUVConversionVK &)=delete
impeller::ImmutableSamplerKeyVK::IsEqual
bool IsEqual(const ImmutableSamplerKeyVK &other) const override
Definition: yuv_conversion_vk.cc:109
impeller::YUVConversionVK::GetDescriptor
const YUVConversionDescriptorVK & GetDescriptor() const
Get the descriptor used to create this conversion.
Definition: yuv_conversion_vk.cc:37
impeller::YUVConversionVK::~YUVConversionVK
~YUVConversionVK()
impeller::YUVConversionVK::operator=
YUVConversionVK & operator=(const YUVConversionVK &)=delete
impeller::YUVConversionVK
It is sometimes necessary to deal with formats not native to Vulkan. In such cases,...
Definition: yuv_conversion_vk.h:51
impeller::ImmutableSamplerKeyVK::GetHash
std::size_t GetHash() const override
Definition: yuv_conversion_vk.cc:114
impeller::YUVConversionLibraryVK
Due the way the Vulkan spec. treats "identically defined" conversions, creating two conversion with i...
Definition: yuv_conversion_library_vk.h:26
impeller::ImmutableSamplerKeyVK::yuv_conversion
YUVConversionDescriptorVK yuv_conversion
Definition: yuv_conversion_vk.h:96
impeller::YUVConversionDescriptorVKEqual
Definition: yuv_conversion_vk.h:89
impeller::YUVConversionDescriptorVKHash::operator()
std::size_t operator()(const YUVConversionDescriptorVK &object) const
Definition: yuv_conversion_vk.cc:41
impeller::Comparable
Definition: comparable.h:29
comparable.h
sampler_vk.h
impeller::YUVConversionDescriptorVKEqual::operator()
bool operator()(const YUVConversionDescriptorVK &lhs, const YUVConversionDescriptorVK &rhs) const
Definition: yuv_conversion_vk.cc:67
impeller::ImmutableSamplerKeyVK::sampler
SamplerDescriptor sampler
Definition: yuv_conversion_vk.h:95
impeller::YUVConversionDescriptorVK
vk::StructureChain< vk::SamplerYcbcrConversionCreateInfo > YUVConversionDescriptorVK
Definition: yuv_conversion_vk.h:30
thread.h
impeller
Definition: aiks_blur_unittests.cc:20