[Impeller] Move BufferView/Texture/Sampler when binding. (flutter/engine#48628)

Most of the time we are passing an rvalue into this functions anyway, so in theory moving should be faster. Right?
This commit is contained in:
Jonah Williams 2023-12-04 15:53:06 -08:00 committed by GitHub
parent 1a16df121d
commit 02e3d985dc
5 changed files with 34 additions and 34 deletions

View File

@ -29,13 +29,13 @@ struct ResourceBinder {
virtual bool BindResource(ShaderStage stage,
const ShaderUniformSlot& slot,
const ShaderMetadata& metadata,
const BufferView& view) = 0;
BufferView view) = 0;
virtual bool BindResource(ShaderStage stage,
const SampledImageSlot& slot,
const ShaderMetadata& metadata,
const std::shared_ptr<const Texture>& texture,
const std::shared_ptr<const Sampler>& sampler) = 0;
std::shared_ptr<const Texture> texture,
std::shared_ptr<const Sampler> sampler) = 0;
};
} // namespace impeller

View File

@ -33,23 +33,23 @@ BufferView Command::GetVertexBuffer() const {
bool Command::BindResource(ShaderStage stage,
const ShaderUniformSlot& slot,
const ShaderMetadata& metadata,
const BufferView& view) {
return DoBindResource(stage, slot, &metadata, view);
BufferView view) {
return DoBindResource(stage, slot, &metadata, std::move(view));
}
bool Command::BindResource(
ShaderStage stage,
const ShaderUniformSlot& slot,
const std::shared_ptr<const ShaderMetadata>& metadata,
const BufferView& view) {
return DoBindResource(stage, slot, metadata, view);
BufferView view) {
return DoBindResource(stage, slot, metadata, std::move(view));
}
template <class T>
bool Command::DoBindResource(ShaderStage stage,
const ShaderUniformSlot& slot,
const T metadata,
const BufferView& view) {
BufferView view) {
FML_DCHECK(slot.ext_res_0 != VertexDescriptor::kReservedVertexBufferIndex);
if (!view) {
return false;
@ -58,11 +58,11 @@ bool Command::DoBindResource(ShaderStage stage,
switch (stage) {
case ShaderStage::kVertex:
vertex_bindings.buffers[slot.ext_res_0] = {
.slot = slot, .view = BufferResource(metadata, view)};
.slot = slot, .view = BufferResource(metadata, std::move(view))};
return true;
case ShaderStage::kFragment:
fragment_bindings.buffers[slot.ext_res_0] = {
.slot = slot, .view = BufferResource(metadata, view)};
.slot = slot, .view = BufferResource(metadata, std::move(view))};
return true;
case ShaderStage::kCompute:
VALIDATION_LOG << "Use ComputeCommands for compute shader stages.";
@ -78,8 +78,8 @@ bool Command::DoBindResource(ShaderStage stage,
bool Command::BindResource(ShaderStage stage,
const SampledImageSlot& slot,
const ShaderMetadata& metadata,
const std::shared_ptr<const Texture>& texture,
const std::shared_ptr<const Sampler>& sampler) {
std::shared_ptr<const Texture> texture,
std::shared_ptr<const Sampler> sampler) {
if (!sampler || !sampler->IsValid()) {
return false;
}
@ -94,15 +94,15 @@ bool Command::BindResource(ShaderStage stage,
case ShaderStage::kVertex:
vertex_bindings.sampled_images[slot.sampler_index] = TextureAndSampler{
.slot = slot,
.texture = {&metadata, texture},
.sampler = {&metadata, sampler},
.texture = {&metadata, std::move(texture)},
.sampler = {&metadata, std::move(sampler)},
};
return true;
case ShaderStage::kFragment:
fragment_bindings.sampled_images[slot.sampler_index] = TextureAndSampler{
.slot = slot,
.texture = {&metadata, texture},
.sampler = {&metadata, sampler},
.texture = {&metadata, std::move(texture)},
.sampler = {&metadata, std::move(sampler)},
};
return true;
case ShaderStage::kCompute:

View File

@ -189,19 +189,19 @@ struct Command : public ResourceBinder {
bool BindResource(ShaderStage stage,
const ShaderUniformSlot& slot,
const ShaderMetadata& metadata,
const BufferView& view) override;
BufferView view) override;
bool BindResource(ShaderStage stage,
const ShaderUniformSlot& slot,
const std::shared_ptr<const ShaderMetadata>& metadata,
const BufferView& view);
BufferView view);
// |ResourceBinder|
bool BindResource(ShaderStage stage,
const SampledImageSlot& slot,
const ShaderMetadata& metadata,
const std::shared_ptr<const Texture>& texture,
const std::shared_ptr<const Sampler>& sampler) override;
std::shared_ptr<const Texture> texture,
std::shared_ptr<const Sampler> sampler) override;
BufferView GetVertexBuffer() const;
@ -212,7 +212,7 @@ struct Command : public ResourceBinder {
bool DoBindResource(ShaderStage stage,
const ShaderUniformSlot& slot,
T metadata,
const BufferView& view);
BufferView view);
};
} // namespace impeller

View File

@ -14,7 +14,7 @@ namespace impeller {
bool ComputeCommand::BindResource(ShaderStage stage,
const ShaderUniformSlot& slot,
const ShaderMetadata& metadata,
const BufferView& view) {
BufferView view) {
if (stage != ShaderStage::kCompute) {
VALIDATION_LOG << "Use Command for non-compute shader stages.";
return false;
@ -23,16 +23,16 @@ bool ComputeCommand::BindResource(ShaderStage stage,
return false;
}
bindings.buffers[slot.ext_res_0] = {.slot = slot, .view = {&metadata, view}};
bindings.buffers[slot.ext_res_0] = {.slot = slot,
.view = {&metadata, std::move(view)}};
return true;
}
bool ComputeCommand::BindResource(
ShaderStage stage,
const SampledImageSlot& slot,
const ShaderMetadata& metadata,
const std::shared_ptr<const Texture>& texture,
const std::shared_ptr<const Sampler>& sampler) {
bool ComputeCommand::BindResource(ShaderStage stage,
const SampledImageSlot& slot,
const ShaderMetadata& metadata,
std::shared_ptr<const Texture> texture,
std::shared_ptr<const Sampler> sampler) {
if (stage != ShaderStage::kCompute) {
VALIDATION_LOG << "Use Command for non-compute shader stages.";
return false;
@ -49,8 +49,8 @@ bool ComputeCommand::BindResource(
bindings.sampled_images[slot.sampler_index] = TextureAndSampler{
.slot = slot,
.texture = {&metadata, texture},
.sampler = {&metadata, sampler},
.texture = {&metadata, std::move(texture)},
.sampler = {&metadata, std::move(sampler)},
};
return false;

View File

@ -62,14 +62,14 @@ struct ComputeCommand : public ResourceBinder {
bool BindResource(ShaderStage stage,
const ShaderUniformSlot& slot,
const ShaderMetadata& metadata,
const BufferView& view) override;
BufferView view) override;
// |ResourceBinder|
bool BindResource(ShaderStage stage,
const SampledImageSlot& slot,
const ShaderMetadata& metadata,
const std::shared_ptr<const Texture>& texture,
const std::shared_ptr<const Sampler>& sampler) override;
std::shared_ptr<const Texture> texture,
std::shared_ptr<const Sampler> sampler) override;
constexpr explicit operator bool() const {
return pipeline && pipeline->IsValid();