Flutter Engine Uber Docs
Docs for the entire Flutter Engine repo.
 
Loading...
Searching...
No Matches
capabilities.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_CAPABILITIES_H_
6#define FLUTTER_IMPELLER_RENDERER_CAPABILITIES_H_
7
8#include <memory>
9
11
12namespace impeller {
13
15 public:
16 virtual ~Capabilities();
17
18 /// @brief Whether the context backend supports attaching offscreen MSAA
19 /// color/stencil textures.
20 virtual bool SupportsOffscreenMSAA() const = 0;
21
22 /// @brief Whether the context backend supports multisampled rendering to
23 /// the on-screen surface without requiring an explicit resolve of
24 /// the MSAA color attachment.
25 virtual bool SupportsImplicitResolvingMSAA() const = 0;
26
27 /// @brief Whether the context backend supports binding Shader Storage Buffer
28 /// Objects (SSBOs) to pipelines.
29 virtual bool SupportsSSBO() const = 0;
30
31 /// @brief Whether the context backend supports blitting from one texture
32 /// region to another texture region (via the relevant
33 /// `BlitPass::AddCopy` overloads).
34 virtual bool SupportsTextureToTextureBlits() const = 0;
35
36 /// @brief Whether the context backend is able to support pipelines with
37 /// shaders that read from the framebuffer (i.e. pixels that have been
38 /// written by previous draw calls in the current render pass).
39 ///
40 /// Example of reading from the first color attachment in a GLSL
41 /// shader:
42 /// ```
43 /// uniform subpassInput subpass_input;
44 ///
45 /// out vec4 frag_color;
46 ///
47 /// void main() {
48 /// vec4 color = subpassLoad(subpass_input);
49 /// // Invert the colors drawn to the framebuffer.
50 /// frag_color = vec4(vec3(1) - color.rgb, color.a);
51 /// }
52 /// ```
53 virtual bool SupportsFramebufferFetch() const = 0;
54
55 /// @brief Whether the context backend supports `ComputePass`.
56 virtual bool SupportsCompute() const = 0;
57
58 /// @brief Whether the context backend supports configuring `ComputePass`
59 /// command subgroups.
60 virtual bool SupportsComputeSubgroups() const = 0;
61
62 /// @brief Whether the context backend supports binding the current
63 /// `RenderPass` attachments. This is supported if the backend can
64 /// guarantee that attachment textures will not be mutated until the
65 /// render pass has fully completed.
66 ///
67 /// This is possible because many mobile graphics cards track
68 /// `RenderPass` attachment state in intermediary tile memory prior to
69 /// Storing the pass in the heap allocated attachments on DRAM.
70 /// Metal's hazard tracking and Vulkan's barriers are granular enough
71 /// to allow for safely accessing attachment textures prior to storage
72 /// in the same `RenderPass`.
73 virtual bool SupportsReadFromResolve() const = 0;
74
75 /// @brief Whether the context backend supports `SamplerAddressMode::Decal`.
76 virtual bool SupportsDecalSamplerAddressMode() const = 0;
77
78 /// @brief Whether the context backend supports allocating
79 /// `StorageMode::kDeviceTransient` (aka "memoryless") textures, which
80 /// are temporary textures kept in tile memory for the duration of the
81 /// `RenderPass` it's attached to.
82 ///
83 /// This feature is especially useful for MSAA and stencils.
84 virtual bool SupportsDeviceTransientTextures() const = 0;
85
86 /// @brief Whether the primitive type TriangleFan is supported by the backend.
87 virtual bool SupportsTriangleFan() const = 0;
88
89 /// @brief Whether primitive restart is supported.
90 virtual bool SupportsPrimitiveRestart() const = 0;
91
92 /// @brief Whether 32-bit values are supported in index buffers used to draw
93 /// primitives.
94 virtual bool Supports32BitPrimitiveIndices() const = 0;
95
96 /// @brief Returns a supported `PixelFormat` for textures that store
97 /// 4-channel colors (red/green/blue/alpha).
99
100 /// @brief Returns a supported `PixelFormat` for textures that store stencil
101 /// information. May include a depth channel if a stencil-only format
102 /// is not available.
104
105 /// @brief Returns a supported `PixelFormat` for textures that store both a
106 /// stencil and depth component. This will never return a depth-only
107 /// or stencil-only texture.
108 /// Returns `PixelFormat::kUnknown` if no suitable depth+stencil
109 /// format was found.
111
112 /// @brief Returns the default pixel format for the alpha bitmap glyph atlas.
113 ///
114 /// Some backends may use Red channel while others use grey. This
115 /// should not have any impact
117
118 /// @brief Return the maximum size of a render pass attachment.
119 ///
120 /// Note that this may be smaller than the maximum allocatable texture size.
122
123 /// @brief Whether the XR formats are supported on this device.
124 ///
125 /// This is only ever true for iOS and macOS devices. We may need
126 /// to revisit this API when approaching wide gamut rendering for
127 /// Vulkan and GLES.
128 virtual bool SupportsExtendedRangeFormats() const = 0;
129
130 /// @brief The minimum alignment of uniform value offsets in bytes.
131 virtual size_t GetMinimumUniformAlignment() const = 0;
132
133 /// @brief The minimum alignment of storage buffer value offsets in bytes.
134 virtual size_t GetMinimumStorageBufferAlignment() const;
135
136 /// @brief Whether the host buffer should use separate device buffers
137 /// for indexes from other data.
138 virtual bool NeedsPartitionedHostBuffer() const = 0;
139
140 protected:
142
143 Capabilities(const Capabilities&) = delete;
144
146};
147
149 public:
151
153
155
157
159
161
163
165
167
169
171
173
175
177
179
181
183
185
187
189
190 std::unique_ptr<Capabilities> Build();
191
192 private:
193 bool supports_offscreen_msaa_ = false;
194 bool supports_ssbo_ = false;
195 bool supports_texture_to_texture_blits_ = false;
196 bool supports_framebuffer_fetch_ = false;
197 bool supports_compute_ = false;
198 bool supports_compute_subgroups_ = false;
199 bool supports_read_from_resolve_ = false;
200 bool supports_decal_sampler_address_mode_ = false;
201 bool supports_device_transient_textures_ = false;
202 bool supports_triangle_fan_ = false;
203 bool supports_extended_range_formats_ = false;
204 bool needs_partitioned_host_buffer_ = false;
205 std::optional<PixelFormat> default_color_format_ = std::nullopt;
206 std::optional<PixelFormat> default_stencil_format_ = std::nullopt;
207 std::optional<PixelFormat> default_depth_stencil_format_ = std::nullopt;
208 std::optional<PixelFormat> default_glyph_atlas_format_ = std::nullopt;
209 std::optional<ISize> default_maximum_render_pass_attachment_size_ =
210 std::nullopt;
211 size_t minimum_uniform_alignment_ = 256;
212
214
215 CapabilitiesBuilder& operator=(const CapabilitiesBuilder&) = delete;
216};
217
218} // namespace impeller
219
220#endif // FLUTTER_IMPELLER_RENDERER_CAPABILITIES_H_
CapabilitiesBuilder & SetDefaultColorFormat(PixelFormat value)
CapabilitiesBuilder & SetSupportsComputeSubgroups(bool value)
CapabilitiesBuilder & SetMinimumUniformAlignment(size_t value)
CapabilitiesBuilder & SetSupportsTextureToTextureBlits(bool value)
CapabilitiesBuilder & SetDefaultStencilFormat(PixelFormat value)
CapabilitiesBuilder & SetSupportsDeviceTransientTextures(bool value)
CapabilitiesBuilder & SetSupportsTriangleFan(bool value)
CapabilitiesBuilder & SetNeedsPartitionedHostBuffer(bool value)
CapabilitiesBuilder & SetSupportsFramebufferFetch(bool value)
CapabilitiesBuilder & SetSupportsDecalSamplerAddressMode(bool value)
CapabilitiesBuilder & SetSupportsOffscreenMSAA(bool value)
CapabilitiesBuilder & SetSupportsSSBO(bool value)
CapabilitiesBuilder & SetMaximumRenderPassAttachmentSize(ISize size)
CapabilitiesBuilder & SetSupportsExtendedRangeFormats(bool value)
CapabilitiesBuilder & SetDefaultGlyphAtlasFormat(PixelFormat value)
CapabilitiesBuilder & SetSupportsCompute(bool value)
std::unique_ptr< Capabilities > Build()
CapabilitiesBuilder & SetDefaultDepthStencilFormat(PixelFormat value)
CapabilitiesBuilder & SetSupportsReadFromResolve(bool value)
virtual PixelFormat GetDefaultStencilFormat() const =0
Returns a supported PixelFormat for textures that store stencil information. May include a depth chan...
virtual size_t GetMinimumUniformAlignment() const =0
The minimum alignment of uniform value offsets in bytes.
virtual bool SupportsOffscreenMSAA() const =0
Whether the context backend supports attaching offscreen MSAA color/stencil textures.
virtual bool SupportsImplicitResolvingMSAA() const =0
Whether the context backend supports multisampled rendering to the on-screen surface without requirin...
virtual bool SupportsFramebufferFetch() const =0
Whether the context backend is able to support pipelines with shaders that read from the framebuffer ...
virtual bool SupportsDecalSamplerAddressMode() const =0
Whether the context backend supports SamplerAddressMode::Decal.
virtual bool SupportsReadFromResolve() const =0
Whether the context backend supports binding the current RenderPass attachments. This is supported if...
virtual bool SupportsTriangleFan() const =0
Whether the primitive type TriangleFan is supported by the backend.
virtual bool SupportsComputeSubgroups() const =0
Whether the context backend supports configuring ComputePass command subgroups.
Capabilities & operator=(const Capabilities &)=delete
virtual bool NeedsPartitionedHostBuffer() const =0
Whether the host buffer should use separate device buffers for indexes from other data.
virtual bool Supports32BitPrimitiveIndices() const =0
Whether 32-bit values are supported in index buffers used to draw primitives.
Capabilities(const Capabilities &)=delete
virtual PixelFormat GetDefaultGlyphAtlasFormat() const =0
Returns the default pixel format for the alpha bitmap glyph atlas.
virtual bool SupportsPrimitiveRestart() const =0
Whether primitive restart is supported.
virtual PixelFormat GetDefaultColorFormat() const =0
Returns a supported PixelFormat for textures that store 4-channel colors (red/green/blue/alpha).
virtual ISize GetMaximumRenderPassAttachmentSize() const =0
Return the maximum size of a render pass attachment.
virtual bool SupportsDeviceTransientTextures() const =0
Whether the context backend supports allocating StorageMode::kDeviceTransient (aka "memoryless") text...
virtual size_t GetMinimumStorageBufferAlignment() const
The minimum alignment of storage buffer value offsets in bytes.
virtual bool SupportsCompute() const =0
Whether the context backend supports ComputePass.
virtual bool SupportsExtendedRangeFormats() const =0
Whether the XR formats are supported on this device.
virtual bool SupportsSSBO() const =0
Whether the context backend supports binding Shader Storage Buffer Objects (SSBOs) to pipelines.
virtual PixelFormat GetDefaultDepthStencilFormat() const =0
Returns a supported PixelFormat for textures that store both a stencil and depth component....
virtual bool SupportsTextureToTextureBlits() const =0
Whether the context backend supports blitting from one texture region to another texture region (via ...
PixelFormat
The Pixel formats supported by Impeller. The naming convention denotes the usage of the component,...
Definition formats.h:99