11 R
"~~(// THIS FILE IS GENERATED BY impellerc.
12 // DO NOT EDIT OR CHECK THIS INTO SOURCE CONTROL
16 {# Note: The nogncheck decorations are only to make GN not mad at the template#}
17 {# this file is generated from. There are no GN rule violations in the generated#}
18 {# file itself and the no-check declarations will be stripped in generated files.#}
19 #include "impeller/core/buffer_view.h" {# // nogncheck #}
21 #include "impeller/core/sampler.h" {# // nogncheck #}
23 #include "impeller/core/shader_types.h" {# // nogncheck #}
25 #include "impeller/core/resource_binder.h" {# // nogncheck #}
27 #include "impeller/core/texture.h" {# // nogncheck #}
32 struct {{camel_case(shader_name)}}{{camel_case(shader_stage)}}Shader {
33 // ===========================================================================
34 // Stage Info ================================================================
35 // ===========================================================================
36 static constexpr std::string_view kLabel = "{{camel_case(shader_name)}}";
37 static constexpr std::string_view kEntrypointName = "{{entrypoint}}";
38 static constexpr ShaderStage kShaderStage = {{to_shader_stage(shader_stage)}};
39 // The generator used to prepare these bindings. Metal generators may be used
40 // by GLES backends but GLES generators are unsuitable for the metal backend.
41 static constexpr std::string_view kGeneratorName = "{{get_generator_name()}}";
42 {% if length(struct_definitions) > 0 %}
43 // ===========================================================================
44 // Struct Definitions ========================================================
45 // ===========================================================================
46 {% for def in struct_definitions %}
48 {% if last(def.members).array_elements == 0 %}
49 template <size_t FlexCount>
52 {% for member in def.members %}
53 {{" "}}{% if member.element_padding > 0 %}Padded<{{member.type}}, {{member.element_padding}}>{% else %}{{member.type}}{% endif %}{{" " + member.name}}{% if member.array_elements != "std::nullopt" %}[{% if member.array_elements == 0 %}FlexCount{% else %}{{member.array_elements}}{% endif %}]{% endif %}; // (offset {{member.offset}}, size {{member.byte_length}})
55 }; // struct {{def.name}} (size {{def.byte_length}})
58 {% if length(buffers) > 0 %}
60 // ===========================================================================
61 // Stage Uniform & Storage Buffers ===========================================
62 // ===========================================================================
63 {% for buffer in buffers %}
65 static constexpr auto kResource{{camel_case(buffer.name)}} = ShaderUniformSlot { // {{buffer.name}}
66 "{{buffer.name}}", // name
67 {{buffer.ext_res_0}}u, // ext_res_0
68 {{buffer.set}}u, // set
69 {{buffer.binding}}u, // binding
71 static ShaderMetadata kMetadata{{camel_case(buffer.name)}};
75 // ===========================================================================
76 // Stage Inputs ==============================================================
77 // ===========================================================================
78 {% if length(stage_inputs) > 0 %}
79 {% for stage_input in stage_inputs %}
81 static constexpr auto kInput{{camel_case(stage_input.name)}} = ShaderStageIOSlot { // {{stage_input.name}}
82 "{{stage_input.name}}", // name
83 {{stage_input.location}}u, // attribute location
84 {{stage_input.descriptor_set}}u, // attribute set
85 {{stage_input.binding}}u, // attribute binding
86 {{stage_input.type.type_name}}, // type
87 {{stage_input.type.bit_width}}u, // bit width of type
88 {{stage_input.type.vec_size}}u, // vec size
89 {{stage_input.type.columns}}u, // number of columns
90 {{stage_input.offset}}u, // offset for interleaved layout
95 static constexpr std::array<const ShaderStageIOSlot*, {{length(stage_inputs)}}> kAllShaderStageInputs = {
96 {% for stage_input in stage_inputs %}
97 &kInput{{camel_case(stage_input.name)}}, // {{stage_input.name}}
101 {% if shader_stage == "vertex" %}
102 static constexpr auto kInterleavedLayout = ShaderStageBufferLayout {
103 {% if length(stage_inputs) > 0 %}
104 sizeof(PerVertexData), // stride for interleaved layout
108 0u, // attribute binding
110 static constexpr std::array<const ShaderStageBufferLayout*, 1> kInterleavedBufferLayout = {
115 {% if length(sampled_images) > 0 %}
116 // ===========================================================================
117 // Sampled Images ============================================================
118 // ===========================================================================
119 {% for sampled_image in sampled_images %}
121 static constexpr auto kResource{{camel_case(sampled_image.name)}} = SampledImageSlot { // {{sampled_image.name}}
122 "{{sampled_image.name}}", // name
123 {{sampled_image.ext_res_0}}u, // texture
124 {{sampled_image.ext_res_1}}u, // sampler
125 {{sampled_image.binding}}u, // binding
126 {{sampled_image.set}}u, // set
128 static ShaderMetadata kMetadata{{camel_case(sampled_image.name)}};
131 // ===========================================================================
132 // Stage Outputs =============================================================
133 // ===========================================================================
134 {% if length(stage_outputs) > 0 %}
135 {% for stage_output in stage_outputs %}
136 static constexpr auto kOutput{{camel_case(stage_output.name)}} = ShaderStageIOSlot { // {{stage_output.name}}
137 "{{stage_output.name}}", // name
138 {{stage_output.location}}u, // attribute location
139 {{stage_output.descriptor_set}}u, // attribute set
140 {{stage_output.binding}}u, // attribute binding
141 {{stage_output.type.type_name}}, // type
142 {{stage_output.type.bit_width}}u, // bit width of type
143 {{stage_output.type.vec_size}}u, // vec size
144 {{stage_output.type.columns}}u // number of columns
147 static constexpr std::array<const ShaderStageIOSlot*, {{length(stage_outputs)}}> kAllShaderStageOutputs = {
148 {% for stage_output in stage_outputs %}
149 &kOutput{{camel_case(stage_output.name)}}, // {{stage_output.name}}
154 // ===========================================================================
155 // Resource Binding Utilities ================================================
156 // ===========================================================================
158 {% for proto in bind_prototypes %}
160 static {{proto.return_type}} Bind{{proto.name}}({% for arg in proto.args %}
161 {{arg.type_name}} {{arg.argument_name}}{% if not loop.is_last %}, {% endif %}
163 return {{ proto.args.0.argument_name }}.BindResource({% for arg in proto.args %}
164 {% if loop.is_first %}
165 {{to_shader_stage(shader_stage)}}, kResource{{ proto.name }}, kMetadata{{ proto.name }}, {% else %}
166 std::move({{ arg.argument_name }}){% if not loop.is_last %}, {% endif %}
173 // ===========================================================================
174 // Metadata for Vulkan =======================================================
175 // ===========================================================================
176 static constexpr std::array<DescriptorSetLayout,{{length(buffers)+length(sampled_images)}}> kDescriptorSetLayouts{
177 {% for buffer in buffers %}
179 {{buffer.binding}}, // binding = {{buffer.binding}}
180 {{buffer.descriptor_type}}, // descriptor_type = {{buffer.descriptor_type}}
181 {{to_shader_stage(shader_stage)}}, // shader_stage = {{to_shader_stage(shader_stage)}}
184 {% for sampled_image in sampled_images %}
186 {{sampled_image.binding}}, // binding = {{sampled_image.binding}}
187 {{sampled_image.descriptor_type}}, // descriptor_type = {{sampled_image.descriptor_type}}
188 {{to_shader_stage(shader_stage)}}, // shader_stage = {{to_shader_stage(shader_stage)}}
193 }; // struct {{camel_case(shader_name)}}{{camel_case(shader_stage)}}Shader
195 } // namespace impeller
199 R
"~~(// THIS FILE IS GENERATED BY impellerc.
200 // DO NOT EDIT OR CHECK THIS INTO SOURCE CONTROL
202 #include "{{header_file_name}}"
204 #include <type_traits>
208 using Shader = {{camel_case(shader_name)}}{{camel_case(shader_stage)}}Shader;
210 {% for def in struct_definitions %}
211 // Sanity checks for {{def.name}}
212 {% if last(def.members).array_elements == 0 %}
213 static_assert(std::is_standard_layout_v<Shader::{{def.name}}<0>>);
214 {% for member in def.members %}
215 static_assert(offsetof(Shader::{{def.name}}<0>, {{member.name}}) == {{member.offset}});
218 static_assert(std::is_standard_layout_v<Shader::{{def.name}}>);
219 static_assert(sizeof(Shader::{{def.name}}) == {{def.byte_length}});
220 {% for member in def.members %}
221 static_assert(offsetof(Shader::{{def.name}}, {{member.name}}) == {{member.offset}});
226 {% for buffer in buffers %}
227 ShaderMetadata Shader::kMetadata{{camel_case(buffer.name)}} = {
228 "{{buffer.name}}", // name
229 std::vector<ShaderStructMemberMetadata> {
230 {% for member in buffer.type.members %}
231 ShaderStructMemberMetadata {
232 {{ member.base_type }}, // type
233 "{{ member.name }}", // name
234 {{ member.offset }}, // offset
235 {{ member.size }}, // size
236 {{ member.byte_length }}, // byte_length
237 {{ member.array_elements }}, // array_elements
244 {% for sampled_image in sampled_images %}
245 ShaderMetadata Shader::kMetadata{{camel_case(sampled_image.name)}} = {
246 "{{sampled_image.name}}", // name
247 std::vector<ShaderStructMemberMetadata> {}, // 0 members
251 } // namespace impeller