[Bf-blender-cvs] [a5b27f98588] master: Functions: simplify multi-function signature type
Jacques Lucke
noreply at git.blender.org
Sat Jan 7 16:51:36 CET 2023
Commit: a5b27f985881911c3174c3271b56b7c597d6b424
Author: Jacques Lucke
Date: Sat Jan 7 16:51:26 2023 +0100
Branches: master
https://developer.blender.org/rBa5b27f985881911c3174c3271b56b7c597d6b424
Functions: simplify multi-function signature type
* `depends_on_context` was not used for a long time already.
* `param_data_indices` is not used since rB42b88c008861b6.
* The remaining data is moved to a single `Vector` to avoid
having to do two allocations when the size signature becomes
larger than fits into the inline buffer.
===================================================================
M source/blender/functions/FN_multi_function.hh
M source/blender/functions/FN_multi_function_params.hh
M source/blender/functions/FN_multi_function_signature.hh
M source/blender/functions/intern/multi_function_builder.cc
M source/blender/functions/intern/multi_function_procedure_executor.cc
===================================================================
diff --git a/source/blender/functions/FN_multi_function.hh b/source/blender/functions/FN_multi_function.hh
index 7089f6895a7..53392e6acd2 100644
--- a/source/blender/functions/FN_multi_function.hh
+++ b/source/blender/functions/FN_multi_function.hh
@@ -67,22 +67,22 @@ class MultiFunction {
int param_amount() const
{
- return signature_ref_->param_types.size();
+ return signature_ref_->params.size();
}
IndexRange param_indices() const
{
- return signature_ref_->param_types.index_range();
+ return signature_ref_->params.index_range();
}
MFParamType param_type(int param_index) const
{
- return signature_ref_->param_types[param_index];
+ return signature_ref_->params[param_index].type;
}
StringRefNull param_name(int param_index) const
{
- return signature_ref_->param_names[param_index];
+ return signature_ref_->params[param_index].name;
}
StringRefNull name() const
@@ -92,11 +92,6 @@ class MultiFunction {
virtual std::string debug_name() const;
- bool depends_on_context() const
- {
- return signature_ref_->depends_on_context;
- }
-
const MFSignature &signature() const
{
BLI_assert(signature_ref_ != nullptr);
diff --git a/source/blender/functions/FN_multi_function_params.hh b/source/blender/functions/FN_multi_function_params.hh
index cfcc930c67b..fec75ac8159 100644
--- a/source/blender/functions/FN_multi_function_params.hh
+++ b/source/blender/functions/FN_multi_function_params.hh
@@ -40,7 +40,7 @@ class MFParamsBuilder {
MFParamsBuilder(const MFSignature &signature, const IndexMask mask)
: signature_(&signature), mask_(mask), min_array_size_(mask.min_array_size())
{
- actual_params_.reserve(signature.param_types.size());
+ actual_params_.reserve(signature.params.size());
}
public:
@@ -124,7 +124,7 @@ class MFParamsBuilder {
{
this->assert_current_param_name(expected_name);
const int param_index = this->current_param_index();
- const MFParamType ¶m_type = signature_->param_types[param_index];
+ const MFParamType ¶m_type = signature_->params[param_index].type;
BLI_assert(param_type.category() == MFParamCategory::SingleOutput);
const CPPType &type = param_type.data_type().single_type();
/* An empty span indicates that this is ignored. */
@@ -157,7 +157,7 @@ class MFParamsBuilder {
GMutableSpan computed_array(int param_index)
{
- BLI_assert(ELEM(signature_->param_types[param_index].category(),
+ BLI_assert(ELEM(signature_->params[param_index].type.category(),
MFParamCategory::SingleOutput,
MFParamCategory::SingleMutable));
return *std::get_if<GMutableSpan>(&actual_params_[param_index]);
@@ -165,7 +165,7 @@ class MFParamsBuilder {
GVectorArray &computed_vector_array(int param_index)
{
- BLI_assert(ELEM(signature_->param_types[param_index].category(),
+ BLI_assert(ELEM(signature_->params[param_index].type.category(),
MFParamCategory::VectorOutput,
MFParamCategory::VectorMutable));
return **std::get_if<GVectorArray *>(&actual_params_[param_index]);
@@ -184,11 +184,11 @@ class MFParamsBuilder {
int param_index = this->current_param_index();
if (expected_name != "") {
- StringRef actual_name = signature_->param_names[param_index];
+ StringRef actual_name = signature_->params[param_index].name;
BLI_assert(actual_name == expected_name);
}
- MFParamType expected_type = signature_->param_types[param_index];
+ MFParamType expected_type = signature_->params[param_index].type;
BLI_assert(expected_type == param_type);
#endif
}
@@ -201,7 +201,7 @@ class MFParamsBuilder {
return;
}
const int param_index = this->current_param_index();
- StringRef actual_name = signature_->param_names[param_index];
+ StringRef actual_name = signature_->params[param_index].name;
BLI_assert(actual_name == expected_name);
#endif
}
@@ -325,9 +325,9 @@ class MFParams {
{
UNUSED_VARS_NDEBUG(param_index, name, param_type);
#ifdef DEBUG
- BLI_assert(builder_->signature_->param_types[param_index] == param_type);
+ BLI_assert(builder_->signature_->params[param_index].type == param_type);
if (name.size() > 0) {
- BLI_assert(builder_->signature_->param_names[param_index] == name);
+ BLI_assert(builder_->signature_->params[param_index].name == name);
}
#endif
}
@@ -336,9 +336,9 @@ class MFParams {
{
UNUSED_VARS_NDEBUG(param_index, name, category);
#ifdef DEBUG
- BLI_assert(builder_->signature_->param_types[param_index].category() == category);
+ BLI_assert(builder_->signature_->params[param_index].type.category() == category);
if (name.size() > 0) {
- BLI_assert(builder_->signature_->param_names[param_index] == name);
+ BLI_assert(builder_->signature_->params[param_index].name == name);
}
#endif
}
diff --git a/source/blender/functions/FN_multi_function_signature.hh b/source/blender/functions/FN_multi_function_signature.hh
index 44f2b84867d..4797afd6a83 100644
--- a/source/blender/functions/FN_multi_function_signature.hh
+++ b/source/blender/functions/FN_multi_function_signature.hh
@@ -16,6 +16,11 @@
namespace blender::fn {
struct MFSignature {
+ struct ParamInfo {
+ MFParamType type;
+ const char *name;
+ };
+
/**
* The name should be statically allocated so that it lives longer than this signature. This is
* used instead of an #std::string because of the overhead when many functions are created.
@@ -24,10 +29,7 @@ struct MFSignature {
* actually needed.
*/
const char *function_name;
- Vector<const char *> param_names;
- Vector<MFParamType> param_types;
- Vector<int> param_data_indices;
- bool depends_on_context = false;
+ Vector<ParamInfo> params;
};
class MFSignatureBuilder {
@@ -61,8 +63,7 @@ class MFSignatureBuilder {
}
void input(const char *name, MFDataType data_type)
{
- signature_.param_names.append(name);
- signature_.param_types.append(MFParamType(MFParamType::Input, data_type));
+ signature_.params.append({MFParamType(MFParamType::Input, data_type), name});
}
/* Output Parameter Types */
@@ -85,8 +86,7 @@ class MFSignatureBuilder {
}
void output(const char *name, MFDataType data_type)
{
- signature_.param_names.append(name);
- signature_.param_types.append(MFParamType(MFParamType::Output, data_type));
+ signature_.params.append({MFParamType(MFParamType::Output, data_type), name});
}
/* Mutable Parameter Types */
@@ -109,8 +109,7 @@ class MFSignatureBuilder {
}
void mutable_(const char *name, MFDataType data_type)
{
- signature_.param_names.append(name);
- signature_.param_types.append(MFParamType(MFParamType::Mutable, data_type));
+ signature_.params.append({MFParamType(MFParamType::Mutable, data_type), name});
}
void add(const char *name, const MFParamType ¶m_type)
@@ -153,15 +152,6 @@ class MFSignatureBuilder {
}
BLI_assert_unreachable();
}
-
- /* Context */
-
- /** This indicates that the function accesses the context. This disables optimizations that
- * depend on the fact that the function always performers the same operation. */
- void depends_on_context()
- {
- signature_.depends_on_context = true;
- }
};
} // namespace blender::fn
diff --git a/source/blender/functions/intern/multi_function_builder.cc b/source/blender/functions/intern/multi_function_builder.cc
index bda5ec19cea..30b734b881b 100644
--- a/source/blender/functions/intern/multi_function_builder.cc
+++ b/source/blender/functions/intern/multi_function_builder.cc
@@ -26,7 +26,7 @@ CustomMF_GenericConstant::CustomMF_GenericConstant(const CPPType &type,
CustomMF_GenericConstant::~CustomMF_GenericConstant()
{
if (owns_value_) {
- signature_.param_types[0].data_type().single_type().destruct(const_cast<void *>(value_));
+ signature_.params[0].type.data_type().single_type().destruct(const_cast<void *>(value_));
MEM_freeN(const_cast<void *>(value_));
}
}
diff --git a/source/blender/functions/intern/multi_function_procedure_executor.cc b/source/blender/functions/intern/multi_function_procedure_executor.cc
index 6c997e2e222..f5e25a5fb3c 100644
--- a/source/blender/functions/intern/multi_function_procedure_executor.cc
+++ b/source/blender/functions/intern/multi_function_procedure_executor.cc
@@ -974,14 +974,10 @@ class VariableStates {
}
};
-static bool evaluate_as_one(const MultiFunction &fn,
- Span<VariableState *> param_variable_states,
+static bool evaluate_as_one(Span<VariableState *> param_variable_states,
const IndexMask &mask,
const IndexMask &full_mask)
{
- if (fn.depends_on_context()) {
- return false;
- }
if (mask.size() < full_mask.size()) {
return false;
}
@@ -1059,7 +1055,7 @@ static void execute_call_instruction(const MFCallInstruction &instruction,
/* If all inputs to the function are constant, it's enough to call the function only once instead
* of for every index. */
- if (evaluate_as_one(fn, param_variable_states, mask, variable_states.full_mask())) {
+ if (evaluate_as_one(param_variable_states, mask, variable_states.full_mask())) {
MFParamsBuilder params(fn, 1);
fill_params__one(fn, mask, params, variable_states, param_variable_states);
More information about the Bf-blender-cvs
mailing list