| 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/sampler.h"
16 #include "impeller/core/shader_types.h"
17 #include "impeller/core/texture.h"
18 #include "impeller/geometry/rect.h"
19 #include "impeller/renderer/pipeline.h"
20
21 namespace impeller {
22
23 template <class T>
24 class Resource {
25 public:
26 using ResourceType = T;
27 ResourceType resource;
28
29 Resource() {}
30
31 Resource(const ShaderMetadata* metadata, ResourceType p_resource)
32 : resource(p_resource), metadata_(metadata) {}
33
34 const ShaderMetadata* GetMetadata() const {
35 return dynamic_metadata_ ? dynamic_metadata_.get() : metadata_;
36 }
37
38 static Resource MakeDynamic(std::unique_ptr<ShaderMetadata> metadata,
39 ResourceType p_resource) {
40 return Resource(std::move(metadata), p_resource);
41 }
42
43 private:
44 Resource(std::unique_ptr<ShaderMetadata> metadata, ResourceType p_resource)
45 : resource(p_resource), dynamic_metadata_(std::move(metadata)) {}
46
47 // Static shader metadata (typically generated by ImpellerC).
48 const ShaderMetadata* metadata_ = nullptr;
49
50 // Dynamically generated shader metadata.
51 std::unique_ptr<const ShaderMetadata> dynamic_metadata_ = nullptr;
52 };
53
54 using BufferResource = Resource<BufferView>;
55 using TextureResource = Resource<std::shared_ptr<const Texture>>;
56
57 /// @brief combines the texture, sampler and sampler slot information.
58 struct TextureAndSampler {
59 SampledImageSlot slot;
60 ShaderStage stage;
61 TextureResource texture;
62 raw_ptr<const Sampler> sampler;
63 };
64
65 //------------------------------------------------------------------------------
66 /// @brief An object used to specify work to the GPU along with references
67 /// to resources the GPU will used when doing said work.
68 ///
69 /// To construct a valid command, follow these steps:
70 /// * Specify a valid pipeline.
71 /// * Specify vertex information via a call `BindVertices`
72 /// * Specify any stage bindings.
73 /// * (Optional) Specify a debug label.
74 ///
75 /// Command can be created frequently and on demand. The resources
76 /// referenced in commands views into buffers managed by other
77 /// allocators and resource managers.
78 ///
79 struct Command {
80 //----------------------------------------------------------------------------
81 /// The pipeline to use for this command.
82 ///
83 PipelineRef pipeline;
84
85 //----------------------------------------------------------------------------
86 /// The index buffer binding used by the vertex shader stage.
87 BufferView index_buffer;
88
89 /// An offset into render pass storage where bound buffers/texture metadata is
90 /// stored.
91 Range bound_buffers = Range{0, 0};
92 Range bound_textures = Range{0, 0};
93
94 //----------------------------------------------------------------------------
95 /// An offset and range of vertex buffers bound for this draw call.
96 ///
97 /// The vertex buffers are stored on the render pass object.
98 Range vertex_buffers;
99
100 //----------------------------------------------------------------------------
101 /// The viewport coordinates that the rasterizer linearly maps normalized
102 /// device coordinates to.
103 /// If unset, the viewport is the size of the render target with a zero
104 /// origin, znear=0, and zfar=1.
105 ///
106 std::optional<Viewport> viewport;
107
108 //----------------------------------------------------------------------------
109 /// The scissor rect to use for clipping writes to the render target. The
110 /// scissor rect must lie entirely within the render target.
111 /// If unset, no scissor is applied.
112 ///
113 std::optional<IRect32> scissor;
114
115 #ifdef IMPELLER_DEBUG
116 //----------------------------------------------------------------------------
117 /// The debugging label to use for the command.
118 ///
119 std::string label;
120 #endif // IMPELLER_DEBUG
121
122 //----------------------------------------------------------------------------
123 /// The offset used when indexing into the vertex buffer.
124 ///
125 uint64_t base_vertex = 0u;
126
127 //----------------------------------------------------------------------------
128 /// The number of elements to draw. When only a vertex buffer is set, this is
129 /// the vertex count. When an index buffer is set, this is the index count.
130 uint32_t element_count = 0u;
131
132 //----------------------------------------------------------------------------
133 /// The number of instances of the given set of vertices to render. Not all
134 /// backends support rendering more than one instance at a time.
135 ///
136 /// @warning Setting this to more than one will limit the availability of
137 /// backends to use with this command.
138 ///
139 uint32_t instance_count = 1u;
140
141 //----------------------------------------------------------------------------
142 /// The reference value to use in stenciling operations. Stencil configuration
143 /// is part of pipeline setup and can be read from the pipelines descriptor.
144 ///
145 /// @see `Pipeline`
146 /// @see `PipelineDescriptor`
147 ///
148 uint32_t stencil_reference = 0u;
149
150 //----------------------------------------------------------------------------
151 /// The type of indices in the index buffer. The indices must be tightly
152 /// packed in the index buffer.
153 IndexType index_type = IndexType::kUnknown;
154
155 bool IsValid() const { return pipeline && pipeline->IsValid(); }
156 };
157
158 } // namespace impeller
159
160 #endif // FLUTTER_IMPELLER_RENDERER_COMMAND_H_
buffer_view.h
impeller::Pipeline::IsValid
virtual bool IsValid() const =0
impeller::Resource
Definition: command.h:24
impeller::Resource::MakeDynamic
static Resource MakeDynamic(std::unique_ptr< ShaderMetadata > metadata, ResourceType p_resource)
Definition: command.h:38
impeller::Resource::ResourceType
T ResourceType
Definition: command.h:26
impeller::Resource::Resource
Resource()
Definition: command.h:29
impeller::Resource::GetMetadata
const ShaderMetadata * GetMetadata() const
Definition: command.h:34
impeller::Resource::Resource
Resource(const ShaderMetadata *metadata, ResourceType p_resource)
Definition: command.h:31
impeller::Resource::resource
ResourceType resource
Definition: command.h:27
impeller::raw_ptr
A wrapper around a raw ptr that adds additional unopt mode only checks.
Definition: raw_ptr.h:15
formats.h
texture.h
impeller
Definition: allocation.cc:12
impeller::IndexType
IndexType
Definition: formats.h:343
impeller::IndexType::kUnknown
@ kUnknown
impeller::ShaderStage
ShaderStage
Definition: shader_types.h:22
std
Definition: comparable.h:95
pipeline.h
rect.h
sampler.h
shader_types.h
impeller::BufferView
Definition: buffer_view.h:19
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:79
impeller::Command::bound_textures
Range bound_textures
Definition: command.h:92
impeller::Command::element_count
uint32_t element_count
Definition: command.h:130
impeller::Command::scissor
std::optional< IRect32 > scissor
Definition: command.h:113
impeller::Command::base_vertex
uint64_t base_vertex
Definition: command.h:125
impeller::Command::stencil_reference
uint32_t stencil_reference
Definition: command.h:148
impeller::Command::index_buffer
BufferView index_buffer
The index buffer binding used by the vertex shader stage.
Definition: command.h:87
impeller::Command::viewport
std::optional< Viewport > viewport
Definition: command.h:106
impeller::Command::instance_count
uint32_t instance_count
Definition: command.h:139
impeller::Command::vertex_buffers
Range vertex_buffers
Definition: command.h:98
impeller::Command::bound_buffers
Range bound_buffers
Definition: command.h:91
impeller::Command::pipeline
PipelineRef pipeline
Definition: command.h:83
impeller::Command::index_type
IndexType index_type
Definition: command.h:153
impeller::Command::IsValid
bool IsValid() const
Definition: command.h:155
impeller::Range
Definition: range.h:13
impeller::SampledImageSlot
Metadata required to bind a combined texture and sampler.
Definition: shader_types.h:98
impeller::ShaderMetadata
Definition: shader_types.h:72
impeller::TextureAndSampler
combines the texture, sampler and sampler slot information.
Definition: command.h:58
impeller::TextureAndSampler::sampler
raw_ptr< const Sampler > sampler
Definition: command.h:62
impeller::TextureAndSampler::slot
SampledImageSlot slot
Definition: command.h:59
impeller::TextureAndSampler::texture
TextureResource texture
Definition: command.h:61
impeller::TextureAndSampler::stage
ShaderStage stage
Definition: command.h:60