Flutter Impeller
shader_types.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_CORE_SHADER_TYPES_H_
6 #define FLUTTER_IMPELLER_CORE_SHADER_TYPES_H_
7 
8 #include <cstddef>
9 #include <cstdint>
10 #include <optional>
11 #include <string_view>
12 #include <vector>
13 
14 #include "flutter/fml/hash_combine.h"
15 #include "flutter/fml/logging.h"
17 #include "impeller/geometry/half.h"
19 
20 namespace impeller {
21 
22 enum class ShaderStage {
23  kUnknown,
24  kVertex,
25  kFragment,
26  kCompute,
27 };
28 
30  switch (stage) {
32  return ShaderStage::kVertex;
36  return ShaderStage::kCompute;
37  }
38  FML_UNREACHABLE();
39 }
40 
41 enum class ShaderType {
42  kUnknown,
43  kVoid,
44  kBoolean,
49  kSignedInt,
54  kHalfFloat,
55  kFloat,
56  kDouble,
57  kStruct,
58  kImage,
60  kSampler,
61 };
62 
65  std::string name;
66  size_t offset;
67  size_t size;
68  size_t byte_length;
69  std::optional<size_t> array_elements;
70 };
71 
73  // This must match the uniform name in the shader program.
74  std::string name;
75  std::vector<ShaderStructMemberMetadata> members;
76 };
77 
78 /// @brief Metadata required to bind a buffer.
79 ///
80 /// OpenGL binding requires the usage of the separate shader metadata struct.
82  /// @brief The name of the uniform slot.
83  const char* name;
84 
85  /// @brief `ext_res_0` is the Metal binding value.
86  size_t ext_res_0;
87 
88  /// @brief The Vulkan descriptor set index.
89  size_t set;
90 
91  /// @brief The Vulkan binding value.
92  size_t binding;
93 };
94 
95 /// @brief Metadata required to bind a combined texture and sampler.
96 ///
97 /// OpenGL binding requires the usage of the separate shader metadata struct.
99  /// @brief The name of the uniform slot.
100  const char* name;
101 
102  /// @brief `ext_res_0` is the Metal binding value.
104 
105  /// @brief The Vulkan descriptor set index.
106  size_t set;
107 
108  /// @brief The Vulkan binding value.
109  size_t binding;
110 };
111 
113  const char* name;
114  size_t location;
115  size_t set;
116  size_t binding;
118  size_t bit_width;
119  size_t vec_size;
120  size_t columns;
121  size_t offset;
123 
124  constexpr size_t GetHash() const {
125  return fml::HashCombine(name, location, set, binding, type, bit_width,
127  }
128 
129  constexpr bool operator==(const ShaderStageIOSlot& other) const {
130  return name == other.name && //
131  location == other.location && //
132  set == other.set && //
133  binding == other.binding && //
134  type == other.type && //
135  bit_width == other.bit_width && //
136  vec_size == other.vec_size && //
137  columns == other.columns && //
138  offset == other.offset && //
140  ;
141  }
142 };
143 
145  size_t stride;
146  size_t binding;
147 
148  constexpr size_t GetHash() const { return fml::HashCombine(stride, binding); }
149 
150  constexpr bool operator==(const ShaderStageBufferLayout& other) const {
151  return stride == other.stride && //
152  binding == other.binding;
153  }
154 };
155 
156 // These enum values were chosen to match the same values
157 // in the VK Descriptor Type enum.
158 enum class DescriptorType {
159  kSampler = 0,
160  kSampledImage = 1,
161  kImage = 2,
162  kUniformBuffer = 6,
163  kStorageBuffer = 7,
164  kInputAttachment = 10,
165 };
166 
168  uint32_t binding;
171 };
172 
173 template <size_t Size>
174 struct Padding {
175  private:
176  uint8_t pad_[Size];
177 };
178 
179 /// @brief Struct used for padding uniform buffer array elements.
180 template <typename T,
181  size_t Size,
182  class = std::enable_if_t<std::is_standard_layout_v<T>>>
183 struct Padded {
184  T value;
186 
187  Padded(T p_value) : value(p_value){}; // NOLINT(google-explicit-constructor)
188 };
189 
190 inline constexpr Vector4 ToVector(Color color) {
191  return {color.red, color.green, color.blue, color.alpha};
192 }
193 
194 } // namespace impeller
195 
196 #endif // FLUTTER_IMPELLER_CORE_SHADER_TYPES_H_
constexpr ShaderStage ToShaderStage(RuntimeShaderStage stage)
Definition: shader_types.h:29
constexpr Vector4 ToVector(Color color)
Definition: shader_types.h:190
TSize< Scalar > Size
Definition: size.h:159
Scalar blue
Definition: color.h:138
Scalar alpha
Definition: color.h:143
Scalar red
Definition: color.h:128
Scalar green
Definition: color.h:133
Struct used for padding uniform buffer array elements.
Definition: shader_types.h:183
Padded(T p_value)
Definition: shader_types.h:187
Padding< Size > _PADDING_
Definition: shader_types.h:185
Metadata required to bind a combined texture and sampler.
Definition: shader_types.h:98
size_t texture_index
ext_res_0 is the Metal binding value.
Definition: shader_types.h:103
size_t set
The Vulkan descriptor set index.
Definition: shader_types.h:106
const char * name
The name of the uniform slot.
Definition: shader_types.h:100
size_t binding
The Vulkan binding value.
Definition: shader_types.h:109
std::vector< ShaderStructMemberMetadata > members
Definition: shader_types.h:75
constexpr size_t GetHash() const
Definition: shader_types.h:148
constexpr bool operator==(const ShaderStageBufferLayout &other) const
Definition: shader_types.h:150
constexpr bool operator==(const ShaderStageIOSlot &other) const
Definition: shader_types.h:129
constexpr size_t GetHash() const
Definition: shader_types.h:124
std::optional< size_t > array_elements
Definition: shader_types.h:69
Metadata required to bind a buffer.
Definition: shader_types.h:81
size_t binding
The Vulkan binding value.
Definition: shader_types.h:92
size_t ext_res_0
ext_res_0 is the Metal binding value.
Definition: shader_types.h:86
size_t set
The Vulkan descriptor set index.
Definition: shader_types.h:89
const char * name
The name of the uniform slot.
Definition: shader_types.h:83