Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit ba112ad

Browse files
[Impeller] dont use dynamic shader metadata path for precompiled shaders. (#56827)
Should fix flutter/flutter#159520 ~~but I still need to check locally.~~ Seems to do the trick. All cmd bindings were copying the shader metadata, which meant allocating/de-allocating a lot of strings per draw.
1 parent ed4e13c commit ba112ad

18 files changed

+286
-170
lines changed

impeller/compiler/code_gen_template.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,7 @@ struct {{camel_case(shader_name)}}{{camel_case(shader_stage)}}Shader {
159159
{% endfor %}) {
160160
return {{ proto.args.0.argument_name }}.BindResource({% for arg in proto.args %}
161161
{% if loop.is_first %}
162-
{{to_shader_stage(shader_stage)}}, {{ proto.descriptor_type }}, kResource{{ proto.name }}, kMetadata{{ proto.name }}, {% else %}
162+
{{to_shader_stage(shader_stage)}}, {{ proto.descriptor_type }}, kResource{{ proto.name }}, &kMetadata{{ proto.name }}, {% else %}
163163
std::move({{ arg.argument_name }}){% if not loop.is_last %}, {% endif %}
164164
{% endif %}
165165
{% endfor %});

impeller/core/resource_binder.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,13 +26,13 @@ struct ResourceBinder {
2626
virtual bool BindResource(ShaderStage stage,
2727
DescriptorType type,
2828
const ShaderUniformSlot& slot,
29-
const ShaderMetadata& metadata,
29+
const ShaderMetadata* metadata,
3030
BufferView view) = 0;
3131

3232
virtual bool BindResource(ShaderStage stage,
3333
DescriptorType type,
3434
const SampledImageSlot& slot,
35-
const ShaderMetadata& metadata,
35+
const ShaderMetadata* metadata,
3636
std::shared_ptr<const Texture> texture,
3737
const std::unique_ptr<const Sampler>& sampler) = 0;
3838
};

impeller/entity/contents/runtime_effect_contents.cc

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -50,9 +50,9 @@ static ShaderType GetShaderType(RuntimeUniformType type) {
5050
}
5151
}
5252

53-
static std::shared_ptr<ShaderMetadata> MakeShaderMetadata(
53+
static std::unique_ptr<ShaderMetadata> MakeShaderMetadata(
5454
const RuntimeUniformDescription& uniform) {
55-
auto metadata = std::make_shared<ShaderMetadata>();
55+
std::unique_ptr<ShaderMetadata> metadata = std::make_unique<ShaderMetadata>();
5656
metadata->name = uniform.name;
5757
metadata->members.emplace_back(ShaderStructMemberMetadata{
5858
.type = GetShaderType(uniform.type),
@@ -206,7 +206,7 @@ bool RuntimeEffectContents::Render(const ContentContext& renderer,
206206
size_t buffer_offset = 0;
207207

208208
for (const auto& uniform : runtime_stage_->GetUniforms()) {
209-
std::shared_ptr<ShaderMetadata> metadata = MakeShaderMetadata(uniform);
209+
std::unique_ptr<ShaderMetadata> metadata = MakeShaderMetadata(uniform);
210210
switch (uniform.type) {
211211
case kSampledImage: {
212212
// Sampler uniforms are ordered in the IPLR according to their
@@ -237,9 +237,9 @@ bool RuntimeEffectContents::Render(const ContentContext& renderer,
237237
ShaderUniformSlot uniform_slot;
238238
uniform_slot.name = uniform.name.c_str();
239239
uniform_slot.ext_res_0 = uniform.location;
240-
pass.BindResource(ShaderStage::kFragment,
241-
DescriptorType::kUniformBuffer, uniform_slot,
242-
metadata, std::move(buffer_view));
240+
pass.BindDynamicResource(ShaderStage::kFragment,
241+
DescriptorType::kUniformBuffer, uniform_slot,
242+
std::move(metadata), std::move(buffer_view));
243243
buffer_index++;
244244
buffer_offset += uniform.GetSize();
245245
break;
@@ -274,14 +274,14 @@ bool RuntimeEffectContents::Render(const ContentContext& renderer,
274274
sizeof(float) * uniform_buffer.size(), alignment);
275275
pass.BindResource(ShaderStage::kFragment,
276276
DescriptorType::kUniformBuffer, uniform_slot,
277-
ShaderMetadata{}, std::move(buffer_view));
277+
nullptr, std::move(buffer_view));
278278
}
279279
}
280280
}
281281

282282
size_t sampler_index = 0;
283283
for (const auto& uniform : runtime_stage_->GetUniforms()) {
284-
std::shared_ptr<ShaderMetadata> metadata = MakeShaderMetadata(uniform);
284+
std::unique_ptr<ShaderMetadata> metadata = MakeShaderMetadata(uniform);
285285

286286
switch (uniform.type) {
287287
case kSampledImage: {
@@ -296,9 +296,9 @@ bool RuntimeEffectContents::Render(const ContentContext& renderer,
296296
image_slot.name = uniform.name.c_str();
297297
image_slot.binding = uniform.binding;
298298
image_slot.texture_index = uniform.location - minimum_sampler_index;
299-
pass.BindResource(ShaderStage::kFragment,
300-
DescriptorType::kSampledImage, image_slot,
301-
*metadata, input.texture, sampler);
299+
pass.BindDynamicResource(ShaderStage::kFragment,
300+
DescriptorType::kSampledImage, image_slot,
301+
std::move(metadata), input.texture, sampler);
302302

303303
sampler_index++;
304304
break;

impeller/entity/contents/test/recording_render_pass.cc

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ bool RecordingRenderPass::OnEncodeCommands(const Context& context) const {
108108
bool RecordingRenderPass::BindResource(ShaderStage stage,
109109
DescriptorType type,
110110
const ShaderUniformSlot& slot,
111-
const ShaderMetadata& metadata,
111+
const ShaderMetadata* metadata,
112112
BufferView view) {
113113
pending_.BindResource(stage, type, slot, metadata, view);
114114
if (delegate_) {
@@ -118,25 +118,41 @@ bool RecordingRenderPass::BindResource(ShaderStage stage,
118118
}
119119

120120
// |RenderPass|
121-
bool RecordingRenderPass::BindResource(
121+
bool RecordingRenderPass::BindDynamicResource(
122122
ShaderStage stage,
123123
DescriptorType type,
124124
const ShaderUniformSlot& slot,
125-
const std::shared_ptr<const ShaderMetadata>& metadata,
125+
std::unique_ptr<ShaderMetadata> metadata,
126126
BufferView view) {
127-
pending_.BindResource(stage, type, slot, metadata, view);
127+
pending_.BindResource(stage, type, slot, metadata.get(), view);
128128
if (delegate_) {
129-
return delegate_->BindResource(stage, type, slot, metadata, view);
129+
return delegate_->BindDynamicResource(stage, type, slot,
130+
std::move(metadata), view);
130131
}
131132
return true;
132133
}
133134

134135
// |RenderPass|
136+
bool RecordingRenderPass::BindDynamicResource(
137+
ShaderStage stage,
138+
DescriptorType type,
139+
const SampledImageSlot& slot,
140+
std::unique_ptr<ShaderMetadata> metadata,
141+
std::shared_ptr<const Texture> texture,
142+
const std::unique_ptr<const Sampler>& sampler) {
143+
pending_.BindResource(stage, type, slot, metadata.get(), texture, sampler);
144+
if (delegate_) {
145+
return delegate_->BindDynamicResource(
146+
stage, type, slot, std::move(metadata), texture, sampler);
147+
}
148+
return true;
149+
}
150+
135151
bool RecordingRenderPass::BindResource(
136152
ShaderStage stage,
137153
DescriptorType type,
138154
const SampledImageSlot& slot,
139-
const ShaderMetadata& metadata,
155+
const ShaderMetadata* metadata,
140156
std::shared_ptr<const Texture> texture,
141157
const std::unique_ptr<const Sampler>& sampler) {
142158
pending_.BindResource(stage, type, slot, metadata, texture, sampler);

impeller/entity/contents/test/recording_render_pass.h

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -46,28 +46,35 @@ class RecordingRenderPass : public RenderPass {
4646
// |RenderPass|
4747
fml::Status Draw() override;
4848

49-
// |RenderPass|
50-
bool BindResource(ShaderStage stage,
51-
DescriptorType type,
52-
const ShaderUniformSlot& slot,
53-
const ShaderMetadata& metadata,
54-
BufferView view) override;
55-
56-
// |RenderPass|
5749
bool BindResource(ShaderStage stage,
5850
DescriptorType type,
5951
const ShaderUniformSlot& slot,
60-
const std::shared_ptr<const ShaderMetadata>& metadata,
52+
const ShaderMetadata* metadata,
6153
BufferView view) override;
6254

63-
// |RenderPass|
6455
bool BindResource(ShaderStage stage,
6556
DescriptorType type,
6657
const SampledImageSlot& slot,
67-
const ShaderMetadata& metadata,
58+
const ShaderMetadata* metadata,
6859
std::shared_ptr<const Texture> texture,
6960
const std::unique_ptr<const Sampler>& sampler) override;
7061

62+
// |RenderPass|
63+
bool BindDynamicResource(ShaderStage stage,
64+
DescriptorType type,
65+
const ShaderUniformSlot& slot,
66+
std::unique_ptr<ShaderMetadata> metadata,
67+
BufferView view) override;
68+
69+
// |RenderPass|
70+
bool BindDynamicResource(
71+
ShaderStage stage,
72+
DescriptorType type,
73+
const SampledImageSlot& slot,
74+
std::unique_ptr<ShaderMetadata> metadata,
75+
std::shared_ptr<const Texture> texture,
76+
const std::unique_ptr<const Sampler>& sampler) override;
77+
7178
// |RenderPass|
7279
void OnSetLabel(std::string_view label) override;
7380

impeller/renderer/backend/metal/compute_pass_mtl.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,14 +51,14 @@ class ComputePassMTL final : public ComputePass {
5151
bool BindResource(ShaderStage stage,
5252
DescriptorType type,
5353
const ShaderUniformSlot& slot,
54-
const ShaderMetadata& metadata,
54+
const ShaderMetadata* metadata,
5555
BufferView view) override;
5656

5757
// |ComputePass|
5858
bool BindResource(ShaderStage stage,
5959
DescriptorType type,
6060
const SampledImageSlot& slot,
61-
const ShaderMetadata& metadata,
61+
const ShaderMetadata* metadata,
6262
std::shared_ptr<const Texture> texture,
6363
const std::unique_ptr<const Sampler>& sampler) override;
6464

impeller/renderer/backend/metal/compute_pass_mtl.mm

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@
8282
bool ComputePassMTL::BindResource(ShaderStage stage,
8383
DescriptorType type,
8484
const ShaderUniformSlot& slot,
85-
const ShaderMetadata& metadata,
85+
const ShaderMetadata* metadata,
8686
BufferView view) {
8787
if (!view.GetBuffer()) {
8888
return false;
@@ -109,7 +109,7 @@
109109
ShaderStage stage,
110110
DescriptorType type,
111111
const SampledImageSlot& slot,
112-
const ShaderMetadata& metadata,
112+
const ShaderMetadata* metadata,
113113
std::shared_ptr<const Texture> texture,
114114
const std::unique_ptr<const Sampler>& sampler) {
115115
if (!sampler || !texture->IsValid()) {

impeller/renderer/backend/metal/render_pass_mtl.h

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -99,24 +99,33 @@ class RenderPassMTL final : public RenderPass {
9999
bool BindResource(ShaderStage stage,
100100
DescriptorType type,
101101
const ShaderUniformSlot& slot,
102-
const ShaderMetadata& metadata,
103-
BufferView view) override;
104-
105-
// |RenderPass|
106-
bool BindResource(ShaderStage stage,
107-
DescriptorType type,
108-
const ShaderUniformSlot& slot,
109-
const std::shared_ptr<const ShaderMetadata>& metadata,
102+
const ShaderMetadata* metadata,
110103
BufferView view) override;
111104

112105
// |RenderPass|
113106
bool BindResource(ShaderStage stage,
114107
DescriptorType type,
115108
const SampledImageSlot& slot,
116-
const ShaderMetadata& metadata,
109+
const ShaderMetadata* metadata,
117110
std::shared_ptr<const Texture> texture,
118111
const std::unique_ptr<const Sampler>& sampler) override;
119112

113+
// |RenderPass|
114+
bool BindDynamicResource(ShaderStage stage,
115+
DescriptorType type,
116+
const ShaderUniformSlot& slot,
117+
std::unique_ptr<ShaderMetadata> metadata,
118+
BufferView view) override;
119+
120+
// |RenderPass|
121+
bool BindDynamicResource(
122+
ShaderStage stage,
123+
DescriptorType type,
124+
const SampledImageSlot& slot,
125+
std::unique_ptr<ShaderMetadata> metadata,
126+
std::shared_ptr<const Texture> texture,
127+
const std::unique_ptr<const Sampler>& sampler) override;
128+
120129
RenderPassMTL(const RenderPassMTL&) = delete;
121130

122131
RenderPassMTL& operator=(const RenderPassMTL&) = delete;

impeller/renderer/backend/metal/render_pass_mtl.mm

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -385,17 +385,17 @@ static bool Bind(PassBindingsCacheMTL& pass,
385385
bool RenderPassMTL::BindResource(ShaderStage stage,
386386
DescriptorType type,
387387
const ShaderUniformSlot& slot,
388-
const ShaderMetadata& metadata,
388+
const ShaderMetadata* metadata,
389389
BufferView view) {
390390
return Bind(pass_bindings_, stage, slot.ext_res_0, view);
391391
}
392392

393393
// |RenderPass|
394-
bool RenderPassMTL::BindResource(
394+
bool RenderPassMTL::BindDynamicResource(
395395
ShaderStage stage,
396396
DescriptorType type,
397397
const ShaderUniformSlot& slot,
398-
const std::shared_ptr<const ShaderMetadata>& metadata,
398+
std::unique_ptr<ShaderMetadata> metadata,
399399
BufferView view) {
400400
return Bind(pass_bindings_, stage, slot.ext_res_0, view);
401401
}
@@ -405,7 +405,20 @@ static bool Bind(PassBindingsCacheMTL& pass,
405405
ShaderStage stage,
406406
DescriptorType type,
407407
const SampledImageSlot& slot,
408-
const ShaderMetadata& metadata,
408+
const ShaderMetadata* metadata,
409+
std::shared_ptr<const Texture> texture,
410+
const std::unique_ptr<const Sampler>& sampler) {
411+
if (!texture) {
412+
return false;
413+
}
414+
return Bind(pass_bindings_, stage, slot.texture_index, sampler, *texture);
415+
}
416+
417+
bool RenderPassMTL::BindDynamicResource(
418+
ShaderStage stage,
419+
DescriptorType type,
420+
const SampledImageSlot& slot,
421+
std::unique_ptr<ShaderMetadata> metadata,
409422
std::shared_ptr<const Texture> texture,
410423
const std::unique_ptr<const Sampler>& sampler) {
411424
if (!texture) {

impeller/renderer/backend/vulkan/compute_pass_vk.cc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ fml::Status ComputePassVK::Compute(const ISize& grid_size) {
134134
bool ComputePassVK::BindResource(ShaderStage stage,
135135
DescriptorType type,
136136
const ShaderUniformSlot& slot,
137-
const ShaderMetadata& metadata,
137+
const ShaderMetadata* metadata,
138138
BufferView view) {
139139
return BindResource(slot.binding, type, view);
140140
}
@@ -144,7 +144,7 @@ bool ComputePassVK::BindResource(
144144
ShaderStage stage,
145145
DescriptorType type,
146146
const SampledImageSlot& slot,
147-
const ShaderMetadata& metadata,
147+
const ShaderMetadata* metadata,
148148
std::shared_ptr<const Texture> texture,
149149
const std::unique_ptr<const Sampler>& sampler) {
150150
if (bound_image_offset_ >= kMaxBindings) {

impeller/renderer/backend/vulkan/compute_pass_vk.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,14 +71,14 @@ class ComputePassVK final : public ComputePass {
7171
bool BindResource(ShaderStage stage,
7272
DescriptorType type,
7373
const ShaderUniformSlot& slot,
74-
const ShaderMetadata& metadata,
74+
const ShaderMetadata* metadata,
7575
BufferView view) override;
7676

7777
// |ResourceBinder|
7878
bool BindResource(ShaderStage stage,
7979
DescriptorType type,
8080
const SampledImageSlot& slot,
81-
const ShaderMetadata& metadata,
81+
const ShaderMetadata* metadata,
8282
std::shared_ptr<const Texture> texture,
8383
const std::unique_ptr<const Sampler>& sampler) override;
8484

impeller/renderer/backend/vulkan/render_pass_vk.cc

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -544,17 +544,16 @@ fml::Status RenderPassVK::Draw() {
544544
bool RenderPassVK::BindResource(ShaderStage stage,
545545
DescriptorType type,
546546
const ShaderUniformSlot& slot,
547-
const ShaderMetadata& metadata,
547+
const ShaderMetadata* metadata,
548548
BufferView view) {
549549
return BindResource(slot.binding, type, view);
550550
}
551551

552-
bool RenderPassVK::BindResource(
553-
ShaderStage stage,
554-
DescriptorType type,
555-
const ShaderUniformSlot& slot,
556-
const std::shared_ptr<const ShaderMetadata>& metadata,
557-
BufferView view) {
552+
bool RenderPassVK::BindDynamicResource(ShaderStage stage,
553+
DescriptorType type,
554+
const ShaderUniformSlot& slot,
555+
std::unique_ptr<ShaderMetadata> metadata,
556+
BufferView view) {
558557
return BindResource(slot.binding, type, view);
559558
}
560559

@@ -593,10 +592,20 @@ bool RenderPassVK::BindResource(size_t binding,
593592
return true;
594593
}
595594

595+
bool RenderPassVK::BindDynamicResource(
596+
ShaderStage stage,
597+
DescriptorType type,
598+
const SampledImageSlot& slot,
599+
std::unique_ptr<ShaderMetadata> metadata,
600+
std::shared_ptr<const Texture> texture,
601+
const std::unique_ptr<const Sampler>& sampler) {
602+
return BindResource(stage, type, slot, nullptr, texture, sampler);
603+
}
604+
596605
bool RenderPassVK::BindResource(ShaderStage stage,
597606
DescriptorType type,
598607
const SampledImageSlot& slot,
599-
const ShaderMetadata& metadata,
608+
const ShaderMetadata* metadata,
600609
std::shared_ptr<const Texture> texture,
601610
const std::unique_ptr<const Sampler>& sampler) {
602611
if (bound_buffer_offset_ >= kMaxBindings) {

0 commit comments

Comments
 (0)