Flutter Engine
 
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 Returns a supported `PixelFormat` for textures that store
93 /// 4-channel colors (red/green/blue/alpha).
95
96 /// @brief Returns a supported `PixelFormat` for textures that store stencil
97 /// information. May include a depth channel if a stencil-only format
98 /// is not available.
100
101 /// @brief Returns a supported `PixelFormat` for textures that store both a
102 /// stencil and depth component. This will never return a depth-only
103 /// or stencil-only texture.
104 /// Returns `PixelFormat::kUnknown` if no suitable depth+stencil
105 /// format was found.
107
108 /// @brief Returns the default pixel format for the alpha bitmap glyph atlas.
109 ///
110 /// Some backends may use Red channel while others use grey. This
111 /// should not have any impact
113
114 /// @brief Return the maximum size of a render pass attachment.
115 ///
116 /// Note that this may be smaller than the maximum allocatable texture size.
118
119 /// @brief Whether the XR formats are supported on this device.
120 ///
121 /// This is only ever true for iOS and macOS devices. We may need
122 /// to revisit this API when approaching wide gamut rendering for
123 /// Vulkan and GLES.
124 virtual bool SupportsExtendedRangeFormats() const = 0;
125
126 /// @brief The minimum alignment of uniform value offsets in bytes.
127 virtual size_t GetMinimumUniformAlignment() const = 0;
128
129 /// @brief The minimum alignment of storage buffer value offsets in bytes.
130 virtual size_t GetMinimumStorageBufferAlignment() const;
131
132 /// @brief Whether the host buffer should use separate device buffers
133 /// for indexes from other data.
134 virtual bool NeedsPartitionedHostBuffer() const = 0;
135
136 protected:
138
139 Capabilities(const Capabilities&) = delete;
140
142};
143
145 public:
147
149
151
153
155
157
159
161
163
165
167
169
171
173
175
177
179
181
183
185
186 std::unique_ptr<Capabilities> Build();
187
188 private:
189 bool supports_offscreen_msaa_ = false;
190 bool supports_ssbo_ = false;
191 bool supports_texture_to_texture_blits_ = false;
192 bool supports_framebuffer_fetch_ = false;
193 bool supports_compute_ = false;
194 bool supports_compute_subgroups_ = false;
195 bool supports_read_from_resolve_ = false;
196 bool supports_decal_sampler_address_mode_ = false;
197 bool supports_device_transient_textures_ = false;
198 bool supports_triangle_fan_ = false;
199 bool supports_extended_range_formats_ = false;
200 bool needs_partitioned_host_buffer_ = false;
201 std::optional<PixelFormat> default_color_format_ = std::nullopt;
202 std::optional<PixelFormat> default_stencil_format_ = std::nullopt;
203 std::optional<PixelFormat> default_depth_stencil_format_ = std::nullopt;
204 std::optional<PixelFormat> default_glyph_atlas_format_ = std::nullopt;
205 std::optional<ISize> default_maximum_render_pass_attachment_size_ =
206 std::nullopt;
207 size_t minimum_uniform_alignment_ = 256;
208
210
211 CapabilitiesBuilder& operator=(const CapabilitiesBuilder&) = delete;
212};
213
214} // namespace impeller
215
216#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.
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