| Flutter Impeller |

command.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_COMMAND_H_
6 #define FLUTTER_IMPELLER_RENDERER_COMMAND_H_
7
8 #include <cstdint>
9 #include <memory>
10 #include <optional>
11 #include <string>
12
13 #include "impeller/core/buffer_view.h"
14 #include "impeller/core/formats.h"
15 #include "impeller/core/resource_binder.h"
16 #include "impeller/core/sampler.h"
17 #include "impeller/core/shader_types.h"
18 #include "impeller/core/texture.h"
19 #include "impeller/core/vertex_buffer.h"
20 #include "impeller/geometry/rect.h"
21 #include "impeller/renderer/pipeline.h"
22
23 namespace impeller {
24
25 #ifdef IMPELLER_DEBUG
26 #define DEBUG_COMMAND_INFO(obj, arg) obj.label = arg;
27 #else
28 #define DEBUG_COMMAND_INFO(obj, arg)
29 #endif // IMPELLER_DEBUG
30
31 template <class T>
32 struct Resource {
33 using ResourceType = T;
34 ResourceType resource;
35
36 Resource() {}
37
38 Resource(const ShaderMetadata* metadata, ResourceType p_resource)
39 : resource(p_resource), metadata_(metadata) {}
40
41 Resource(std::shared_ptr<const ShaderMetadata>& metadata,
42 ResourceType p_resource)
43 : resource(p_resource), dynamic_metadata_(metadata) {}
44
45 const ShaderMetadata* GetMetadata() const {
46 return dynamic_metadata_ ? dynamic_metadata_.get() : metadata_;
47 }
48
49 private:
50 // Static shader metadata (typically generated by ImpellerC).
51 const ShaderMetadata* metadata_ = nullptr;
52
53 // Dynamically generated shader metadata.
54 std::shared_ptr<const ShaderMetadata> dynamic_metadata_;
55 };
56
57 using BufferResource = Resource<BufferView>;
58 using TextureResource = Resource<std::shared_ptr<const Texture>>;
59
60 /// @brief combines the texture, sampler and sampler slot information.
61 struct TextureAndSampler {
62 SampledImageSlot slot;
63 TextureResource texture;
64 std::shared_ptr<const Sampler> sampler;
65 };
66
67 /// @brief combines the buffer resource and its uniform slot information.
68 struct BufferAndUniformSlot {
69 ShaderUniformSlot slot;
70 BufferResource view;
71 };
72
73 struct Bindings {
74 std::vector<TextureAndSampler> sampled_images;
75 std::vector<BufferAndUniformSlot> buffers;
76 };
77
78 //------------------------------------------------------------------------------
79 /// @brief An object used to specify work to the GPU along with references
80 /// to resources the GPU will used when doing said work.
81 ///
82 /// To construct a valid command, follow these steps:
83 /// * Specify a valid pipeline.
84 /// * Specify vertex information via a call `BindVertices`
85 /// * Specify any stage bindings.
86 /// * (Optional) Specify a debug label.
87 ///
88 /// Command can be created frequently and on demand. The resources
89 /// referenced in commands views into buffers managed by other
90 /// allocators and resource managers.
91 ///
92 struct Command : public ResourceBinder {
93 //----------------------------------------------------------------------------
94 /// The pipeline to use for this command.
95 ///
96 std::shared_ptr<Pipeline<PipelineDescriptor>> pipeline;
97 //----------------------------------------------------------------------------
98 /// The buffer, texture, and sampler bindings used by the vertex pipeline
99 /// stage.
100 ///
101 Bindings vertex_bindings;
102 //----------------------------------------------------------------------------
103 /// The buffer, texture, and sampler bindings used by the fragment pipeline
104 /// stage.
105 ///
106 Bindings fragment_bindings;
107
108 #ifdef IMPELLER_DEBUG
109 //----------------------------------------------------------------------------
110 /// The debugging label to use for the command.
111 ///
112 std::string label;
113 #endif // IMPELLER_DEBUG
114
115 //----------------------------------------------------------------------------
116 /// The reference value to use in stenciling operations. Stencil configuration
117 /// is part of pipeline setup and can be read from the pipelines descriptor.
118 ///
119 /// @see `Pipeline`
120 /// @see `PipelineDescriptor`
121 ///
122 uint32_t stencil_reference = 0u;
123 //----------------------------------------------------------------------------
124 /// The offset used when indexing into the vertex buffer.
125 ///
126 uint64_t base_vertex = 0u;
127 //----------------------------------------------------------------------------
128 /// The viewport coordinates that the rasterizer linearly maps normalized
129 /// device coordinates to.
130 /// If unset, the viewport is the size of the render target with a zero
131 /// origin, znear=0, and zfar=1.
132 ///
133 std::optional<Viewport> viewport;
134 //----------------------------------------------------------------------------
135 /// The scissor rect to use for clipping writes to the render target. The
136 /// scissor rect must lie entirely within the render target.
137 /// If unset, no scissor is applied.
138 ///
139 std::optional<IRect> scissor;
140 //----------------------------------------------------------------------------
141 /// The number of instances of the given set of vertices to render. Not all
142 /// backends support rendering more than one instance at a time.
143 ///
144 /// @warning Setting this to more than one will limit the availability of
145 /// backends to use with this command.
146 ///
147 size_t instance_count = 1u;
148
149 //----------------------------------------------------------------------------
150 /// The bound per-vertex data and optional index buffer.
151 VertexBuffer vertex_buffer;
152
153 //----------------------------------------------------------------------------
154 /// @brief Specify the vertex and index buffer to use for this command.
155 ///
156 /// @param[in] buffer The vertex and index buffer definition. If possible,
157 /// this value should be moved and not copied.
158 ///
159 /// @return returns if the binding was updated.
160 ///
161 bool BindVertices(VertexBuffer buffer);
162
163 // |ResourceBinder|
164 bool BindResource(ShaderStage stage,
165 const ShaderUniformSlot& slot,
166 const ShaderMetadata& metadata,
167 BufferView view) override;
168
169 bool BindResource(ShaderStage stage,
170 const ShaderUniformSlot& slot,
171 const std::shared_ptr<const ShaderMetadata>& metadata,
172 BufferView view);
173
174 // |ResourceBinder|
175 bool BindResource(ShaderStage stage,
176 const SampledImageSlot& slot,
177 const ShaderMetadata& metadata,
178 std::shared_ptr<const Texture> texture,
179 std::shared_ptr<const Sampler> sampler) override;
180
181 bool IsValid() const { return pipeline && pipeline->IsValid(); }
182
183 private:
184 template <class T>
185 bool DoBindResource(ShaderStage stage,
186 const ShaderUniformSlot& slot,
187 T metadata,
188 BufferView view);
189 };
190
191 } // namespace impeller
192
193 #endif // FLUTTER_IMPELLER_RENDERER_COMMAND_H_
impeller::Command
An object used to specify work to the GPU along with references to resources the GPU will used when d...
Definition: command.h:92
pipeline.h
impeller::Command::scissor
std::optional< IRect > scissor
Definition: command.h:139
impeller::ShaderUniformSlot
Metadata required to bind a buffer.
Definition: shader_types.h:81
impeller::Resource::resource
ResourceType resource
Definition: command.h:34
vertex_buffer.h
impeller::Resource::Resource
Resource(const ShaderMetadata *metadata, ResourceType p_resource)
Definition: command.h:38
impeller::ShaderMetadata
Definition: shader_types.h:72
impeller::VertexBuffer
Definition: vertex_buffer.h:13
formats.h
impeller::Command::viewport
std::optional< Viewport > viewport
Definition: command.h:133
impeller::Bindings::sampled_images
std::vector< TextureAndSampler > sampled_images
Definition: command.h:74
impeller::ShaderStage
ShaderStage
Definition: shader_types.h:22
impeller::TextureAndSampler::sampler
std::shared_ptr< const Sampler > sampler
Definition: command.h:64
impeller::Command::instance_count
size_t instance_count
Definition: command.h:147
sampler.h
impeller::Command::base_vertex
uint64_t base_vertex
Definition: command.h:126
impeller::Resource
Definition: command.h:32
impeller::Command::vertex_buffer
VertexBuffer vertex_buffer
The bound per-vertex data and optional index buffer.
Definition: command.h:151
impeller::Resource::Resource
Resource(std::shared_ptr< const ShaderMetadata > &metadata, ResourceType p_resource)
Definition: command.h:41
impeller::Command::vertex_bindings
Bindings vertex_bindings
Definition: command.h:101
resource_binder.h
impeller::ResourceBinder
An interface for binding resources. This is implemented by |Command| and |ComputeCommand| to make GPU...
Definition: resource_binder.h:23
impeller::SampledImageSlot
Metadata required to bind a combined texture and sampler.
Definition: shader_types.h:98
impeller::Command::BindVertices
bool BindVertices(VertexBuffer buffer)
Specify the vertex and index buffer to use for this command.
Definition: command.cc:15
impeller::BufferAndUniformSlot::view
BufferResource view
Definition: command.h:70
impeller::TextureAndSampler
combines the texture, sampler and sampler slot information.
Definition: command.h:61
impeller::TextureAndSampler::texture
TextureResource texture
Definition: command.h:63
impeller::BufferAndUniformSlot::slot
ShaderUniformSlot slot
Definition: command.h:69
impeller::Command::stencil_reference
uint32_t stencil_reference
Definition: command.h:122
impeller::TextureAndSampler::slot
SampledImageSlot slot
Definition: command.h:62
impeller::BufferView
Definition: buffer_view.h:13
impeller::Bindings::buffers
std::vector< BufferAndUniformSlot > buffers
Definition: command.h:75
buffer_view.h
impeller::Command::fragment_bindings
Bindings fragment_bindings
Definition: command.h:106
rect.h
texture.h
impeller::Command::pipeline
std::shared_ptr< Pipeline< PipelineDescriptor > > pipeline
Definition: command.h:96
impeller::Resource::GetMetadata
const ShaderMetadata * GetMetadata() const
Definition: command.h:45
shader_types.h
impeller
Definition: aiks_context.cc:10
impeller::Command::IsValid
bool IsValid() const
Definition: command.h:181
impeller::BufferAndUniformSlot
combines the buffer resource and its uniform slot information.
Definition: command.h:68
impeller::Command::BindResource
bool BindResource(ShaderStage stage, const ShaderUniformSlot &slot, const ShaderMetadata &metadata, BufferView view) override
Definition: command.cc:25
impeller::Bindings
Definition: command.h:73
impeller::Resource::Resource
Resource()
Definition: command.h:36