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