Flutter Impeller
capabilities_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_CAPABILITIES_VK_H_
6 #define FLUTTER_IMPELLER_RENDERER_BACKEND_VULKAN_CAPABILITIES_VK_H_
7 
8 #include <cstdint>
9 #include <map>
10 #include <optional>
11 #include <set>
12 #include <string>
13 #include <vector>
14 
20 
21 namespace impeller {
22 
23 class ContextVK;
24 
25 //------------------------------------------------------------------------------
26 /// @brief A device extension available on all platforms. Without the
27 /// presence of these extensions, context creation will fail.
28 ///
29 enum class RequiredCommonDeviceExtensionVK : uint32_t {
30  //----------------------------------------------------------------------------
31  /// For displaying content in the window system.
32  ///
33  /// https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VK_KHR_swapchain.html
34  ///
36 
37  kLast,
38 };
39 
40 //------------------------------------------------------------------------------
41 /// @brief A device extension available on all Android platforms. Without
42 /// the presence of these extensions on Android, context creation
43 /// will fail.
44 ///
45 /// Platform agnostic code can still check if these Android
46 /// extensions are present.
47 ///
48 enum class RequiredAndroidDeviceExtensionVK : uint32_t {
49  //----------------------------------------------------------------------------
50  /// For importing hardware buffers used in external texture composition.
51  ///
52  /// https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VK_ANDROID_external_memory_android_hardware_buffer.html
53  ///
55 
56  //----------------------------------------------------------------------------
57  /// Dependency of kANDROIDExternalMemoryAndroidHardwareBuffer.
58  ///
59  /// https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VK_KHR_sampler_ycbcr_conversion.html
60  ///
62 
63  //----------------------------------------------------------------------------
64  /// Dependency of kANDROIDExternalMemoryAndroidHardwareBuffer.
65  ///
66  /// https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VK_KHR_external_memory.html
67  ///
69 
70  //----------------------------------------------------------------------------
71  /// Dependency of kANDROIDExternalMemoryAndroidHardwareBuffer.
72  ///
73  /// https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VK_EXT_queue_family_foreign.html
74  ///
76 
77  //----------------------------------------------------------------------------
78  /// Dependency of kANDROIDExternalMemoryAndroidHardwareBuffer.
79  ///
80  /// https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VK_KHR_dedicated_allocation.html
81  ///
83 
84  //----------------------------------------------------------------------------
85  /// For exporting file descriptors from fences to interact with platform APIs.
86  ///
87  /// https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VK_KHR_external_fence_fd.html
88  ///
90 
91  //----------------------------------------------------------------------------
92  /// Dependency of kKHRExternalFenceFd.
93  ///
94  /// https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VK_KHR_external_fence.html
95  ///
97 
98  //----------------------------------------------------------------------------
99  /// For importing sync file descriptors as semaphores so the GPU can wait for
100  /// semaphore to be signaled.
101  ///
102  /// https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VK_KHR_external_semaphore_fd.html
104 
105  //----------------------------------------------------------------------------
106  /// Dependency of kKHRExternalSemaphoreFd
107  ///
108  /// https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VK_KHR_external_semaphore.html
110 
111  kLast,
112 };
113 
114 //------------------------------------------------------------------------------
115 /// @brief A device extension enabled if available. Subsystems cannot
116 /// assume availability and must check if these extensions are
117 /// available.
118 ///
119 /// @see `CapabilitiesVK::HasExtension`.
120 ///
121 enum class OptionalDeviceExtensionVK : uint32_t {
122  //----------------------------------------------------------------------------
123  /// To instrument and profile PSO creation.
124  ///
125  /// https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VK_EXT_pipeline_creation_feedback.html
126  ///
128 
129  //----------------------------------------------------------------------------
130  /// To enable context creation on MoltenVK. A non-conformant Vulkan
131  /// implementation.
132  ///
133  /// https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VK_KHR_portability_subset.html
134  ///
136 
137  //----------------------------------------------------------------------------
138  /// For fixed-rate compression of images.
139  ///
140  /// https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VK_EXT_image_compression_control.html
141  ///
143 
144  kLast,
145 };
146 
147 //------------------------------------------------------------------------------
148 /// @brief A pixel format and usage that is sufficient to check if images
149 /// of that format and usage are suitable for use with fixed-rate
150 /// compression.
151 ///
153  vk::Format format = vk::Format::eUndefined;
154  vk::ImageType type = {};
155  vk::ImageTiling tiling = {};
156  vk::ImageUsageFlags usage = {};
157  vk::ImageCreateFlags flags = {};
158 
159  explicit FRCFormatDescriptor(const vk::ImageCreateInfo& image_info)
160  : format(image_info.format),
161  type(image_info.imageType),
162  tiling(image_info.tiling),
163  usage(image_info.usage),
164  flags(image_info.flags) {}
165 };
166 
167 //------------------------------------------------------------------------------
168 /// @brief The Vulkan layers and extensions wrangler.
169 ///
170 class CapabilitiesVK final : public Capabilities,
171  public BackendCast<CapabilitiesVK, Capabilities> {
172  public:
173  explicit CapabilitiesVK(bool enable_validations,
174  bool fatal_missing_validations = false,
175  bool use_embedder_extensions = false,
176  std::vector<std::string> instance_extensions = {},
177  std::vector<std::string> device_extensions = {});
178 
180 
181  bool IsValid() const;
182 
183  bool AreValidationsEnabled() const;
184 
186 
188 
189  bool HasExtension(OptionalDeviceExtensionVK ext) const;
190 
191  std::optional<std::vector<std::string>> GetEnabledLayers() const;
192 
193  std::optional<std::vector<std::string>> GetEnabledInstanceExtensions() const;
194 
195  std::optional<std::vector<std::string>> GetEnabledDeviceExtensions(
196  const vk::PhysicalDevice& physical_device) const;
197 
199  vk::StructureChain<vk::PhysicalDeviceFeatures2,
200  vk::PhysicalDeviceSamplerYcbcrConversionFeaturesKHR,
201  vk::PhysicalDevice16BitStorageFeatures,
202  vk::PhysicalDeviceImageCompressionControlFeaturesEXT>;
203 
204  std::optional<PhysicalDeviceFeatures> GetEnabledDeviceFeatures(
205  const vk::PhysicalDevice& physical_device) const;
206 
207  [[nodiscard]] bool SetPhysicalDevice(
208  const vk::PhysicalDevice& physical_device,
209  const PhysicalDeviceFeatures& enabled_features);
210 
211  const vk::PhysicalDeviceProperties& GetPhysicalDeviceProperties() const;
212 
213  void SetOffscreenFormat(PixelFormat pixel_format) const;
214 
215  // |Capabilities|
216  bool SupportsOffscreenMSAA() const override;
217 
218  // |Capabilities|
219  bool SupportsImplicitResolvingMSAA() const override;
220 
221  // |Capabilities|
222  bool SupportsSSBO() const override;
223 
224  // |Capabilities|
225  bool SupportsTextureToTextureBlits() const override;
226 
227  // |Capabilities|
228  bool SupportsFramebufferFetch() const override;
229 
230  // |Capabilities|
231  bool SupportsCompute() const override;
232 
233  // |Capabilities|
234  bool SupportsComputeSubgroups() const override;
235 
236  // |Capabilities|
237  bool SupportsReadFromResolve() const override;
238 
239  // |Capabilities|
240  bool SupportsDecalSamplerAddressMode() const override;
241 
242  // |Capabilities|
243  bool SupportsDeviceTransientTextures() const override;
244 
245  // |Capabilities|
246  bool SupportsTriangleFan() const override;
247 
248  // |Capabilities|
249  bool SupportsPrimitiveRestart() const override;
250 
251  // |Capabilities|
252  PixelFormat GetDefaultColorFormat() const override;
253 
254  // |Capabilities|
255  PixelFormat GetDefaultStencilFormat() const override;
256 
257  // |Capabilities|
258  PixelFormat GetDefaultDepthStencilFormat() const override;
259 
260  // |Capabilities|
261  PixelFormat GetDefaultGlyphAtlasFormat() const override;
262 
263  // |Capabilities|
264  ISize GetMaximumRenderPassAttachmentSize() const override;
265 
266  //----------------------------------------------------------------------------
267  /// @return If fixed-rate compression for non-onscreen surfaces is
268  /// supported.
269  ///
271 
272  //----------------------------------------------------------------------------
273  /// @brief Get the fixed compression rate supported by the context for
274  /// the given format and usage.
275  ///
276  /// @param[in] compression_type The compression type.
277  /// @param[in] desc The format and usage of the image.
278  ///
279  /// @return The supported fixed compression rate.
280  ///
281  std::optional<vk::ImageCompressionFixedRateFlagBitsEXT> GetSupportedFRCRate(
282  CompressionType compression_type,
283  const FRCFormatDescriptor& desc) const;
284 
285  //----------------------------------------------------------------------------
286  /// @brief Update capabilities for the given set of workarounds.
287  void ApplyWorkarounds(const WorkaroundsVK& workarounds);
288 
289  private:
290  bool validations_enabled_ = false;
291  std::map<std::string, std::set<std::string>> exts_;
292  std::set<RequiredCommonDeviceExtensionVK> required_common_device_extensions_;
293  std::set<RequiredAndroidDeviceExtensionVK>
294  required_android_device_extensions_;
295  std::set<OptionalDeviceExtensionVK> optional_device_extensions_;
296  mutable PixelFormat default_color_format_ = PixelFormat::kUnknown;
297  PixelFormat default_stencil_format_ = PixelFormat::kUnknown;
298  PixelFormat default_depth_stencil_format_ = PixelFormat::kUnknown;
299  vk::PhysicalDevice physical_device_;
300  vk::PhysicalDeviceProperties device_properties_;
301  bool supports_compute_subgroups_ = false;
302  bool supports_device_transient_textures_ = false;
303  bool supports_texture_fixed_rate_compression_ = false;
304  ISize max_render_pass_attachment_size_ = ISize{0, 0};
305  bool has_triangle_fans_ = true;
306  bool has_primitive_restart_ = true;
307  bool has_framebuffer_fetch_ = true;
308  bool is_valid_ = false;
309 
310  // The embedder.h API is responsible for providing the instance and device
311  // extensions.
312  bool use_embedder_extensions_ = false;
313  std::vector<std::string> embedder_instance_extensions_;
314  std::vector<std::string> embedder_device_extensions_;
315 
316  bool HasExtension(const std::string& ext) const;
317 
318  bool HasLayer(const std::string& layer) const;
319 
320  CapabilitiesVK(const CapabilitiesVK&) = delete;
321 
322  CapabilitiesVK& operator=(const CapabilitiesVK&) = delete;
323 };
324 
325 } // namespace impeller
326 
327 #endif // FLUTTER_IMPELLER_RENDERER_BACKEND_VULKAN_CAPABILITIES_VK_H_
The Vulkan layers and extensions wrangler.
bool SupportsTriangleFan() const override
Whether the primitive type TriangleFan is supported by the backend.
bool SupportsDeviceTransientTextures() const override
Whether the context backend supports allocating StorageMode::kDeviceTransient (aka "memoryless") text...
std::optional< std::vector< std::string > > GetEnabledInstanceExtensions() const
bool AreValidationsEnabled() const
bool SetPhysicalDevice(const vk::PhysicalDevice &physical_device, const PhysicalDeviceFeatures &enabled_features)
ISize GetMaximumRenderPassAttachmentSize() const override
Return the maximum size of a render pass attachment.
bool SupportsSSBO() const override
Whether the context backend supports binding Shader Storage Buffer Objects (SSBOs) to pipelines.
bool SupportsFramebufferFetch() const override
Whether the context backend is able to support pipelines with shaders that read from the framebuffer ...
CapabilitiesVK(bool enable_validations, bool fatal_missing_validations=false, bool use_embedder_extensions=false, std::vector< std::string > instance_extensions={}, std::vector< std::string > device_extensions={})
bool SupportsOffscreenMSAA() const override
Whether the context backend supports attaching offscreen MSAA color/stencil textures.
bool SupportsCompute() const override
Whether the context backend supports ComputePass.
bool HasExtension(RequiredCommonDeviceExtensionVK ext) const
std::optional< vk::ImageCompressionFixedRateFlagBitsEXT > GetSupportedFRCRate(CompressionType compression_type, const FRCFormatDescriptor &desc) const
Get the fixed compression rate supported by the context for the given format and usage.
void SetOffscreenFormat(PixelFormat pixel_format) const
PixelFormat GetDefaultStencilFormat() const override
Returns a supported PixelFormat for textures that store stencil information. May include a depth chan...
void ApplyWorkarounds(const WorkaroundsVK &workarounds)
Update capabilities for the given set of workarounds.
vk::StructureChain< vk::PhysicalDeviceFeatures2, vk::PhysicalDeviceSamplerYcbcrConversionFeaturesKHR, vk::PhysicalDevice16BitStorageFeatures, vk::PhysicalDeviceImageCompressionControlFeaturesEXT > PhysicalDeviceFeatures
bool SupportsComputeSubgroups() const override
Whether the context backend supports configuring ComputePass command subgroups.
PixelFormat GetDefaultDepthStencilFormat() const override
Returns a supported PixelFormat for textures that store both a stencil and depth component....
bool SupportsTextureToTextureBlits() const override
Whether the context backend supports blitting from one texture region to another texture region (via ...
std::optional< std::vector< std::string > > GetEnabledDeviceExtensions(const vk::PhysicalDevice &physical_device) const
bool SupportsReadFromResolve() const override
Whether the context backend supports binding the current RenderPass attachments. This is supported if...
bool SupportsDecalSamplerAddressMode() const override
Whether the context backend supports SamplerAddressMode::Decal.
bool SupportsPrimitiveRestart() const override
Whether primitive restart is supported.
std::optional< std::vector< std::string > > GetEnabledLayers() const
bool SupportsTextureFixedRateCompression() const
PixelFormat GetDefaultGlyphAtlasFormat() const override
Returns the default pixel format for the alpha bitmap glyph atlas.
PixelFormat GetDefaultColorFormat() const override
Returns a supported PixelFormat for textures that store 4-channel colors (red/green/blue/alpha).
const vk::PhysicalDeviceProperties & GetPhysicalDeviceProperties() const
bool SupportsImplicitResolvingMSAA() const override
Whether the context backend supports multisampled rendering to the on-screen surface without requirin...
std::optional< PhysicalDeviceFeatures > GetEnabledDeviceFeatures(const vk::PhysicalDevice &physical_device) const
RequiredAndroidDeviceExtensionVK
A device extension available on all Android platforms. Without the presence of these extensions on An...
PixelFormat
The Pixel formats supported by Impeller. The naming convention denotes the usage of the component,...
Definition: formats.h:99
RequiredCommonDeviceExtensionVK
A device extension available on all platforms. Without the presence of these extensions,...
CompressionType
Additional compression to apply to a texture. This value is ignored on platforms which do not support...
OptionalDeviceExtensionVK
A device extension enabled if available. Subsystems cannot assume availability and must check if thes...
A pixel format and usage that is sufficient to check if images of that format and usage are suitable ...
vk::ImageCreateFlags flags
FRCFormatDescriptor(const vk::ImageCreateInfo &image_info)
A non-exhaustive set of driver specific workarounds.