Blender V4.3
FN_lazy_function_execute.hh
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2023 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
5#pragma once
6
14
15#include "FN_lazy_function.hh"
16
18
23class BasicParams : public Params {
24 private:
25 const Span<GMutablePointer> inputs_;
26 const Span<GMutablePointer> outputs_;
28 Span<ValueUsage> output_usages_;
29 MutableSpan<bool> set_outputs_;
30
31 public:
32 BasicParams(const LazyFunction &fn,
35 MutableSpan<std::optional<ValueUsage>> input_usages,
36 Span<ValueUsage> output_usages,
37 MutableSpan<bool> set_outputs);
38
39 void *try_get_input_data_ptr_impl(const int index) const override;
40 void *try_get_input_data_ptr_or_request_impl(const int index) override;
41 void *get_output_data_ptr_impl(const int index) override;
42 void output_set_impl(const int index) override;
43 bool output_was_set_impl(const int index) const override;
44 ValueUsage get_output_usage_impl(const int index) const override;
45 void set_input_unused_impl(const int index) override;
46 bool try_enable_multi_threading_impl() override;
47};
48
53class RemappedParams : public Params {
54 private:
55 Params &base_params_;
56 Span<int> input_map_;
57 Span<int> output_map_;
58 bool &multi_threading_enabled_;
59
60 public:
62 Params &base_params,
63 Span<int> input_map,
64 Span<int> output_map,
65 bool &multi_threading_enabled);
66
67 void *try_get_input_data_ptr_impl(const int index) const override;
68 void *try_get_input_data_ptr_or_request_impl(const int index) override;
69 void *get_output_data_ptr_impl(const int index) override;
70 void output_set_impl(const int index) override;
71 bool output_was_set_impl(const int index) const override;
72 ValueUsage get_output_usage_impl(const int index) const override;
73 void set_input_unused_impl(const int index) override;
74 bool try_enable_multi_threading_impl() override;
75};
76
77namespace detail {
78
82template<typename... Inputs, typename... Outputs, size_t... InIndices, size_t... OutIndices>
84 UserData *user_data,
85 LocalUserData *local_user_data,
86 std::tuple<Inputs...> &inputs,
87 std::tuple<Outputs *...> &outputs,
88 std::index_sequence<InIndices...> /*in_indices*/,
89 std::index_sequence<OutIndices...> /*out_indices*/)
90{
91 constexpr size_t InputsNum = sizeof...(Inputs);
92 constexpr size_t OutputsNum = sizeof...(Outputs);
93 std::array<GMutablePointer, InputsNum> input_pointers;
94 std::array<GMutablePointer, OutputsNum> output_pointers;
95 std::array<std::optional<ValueUsage>, InputsNum> input_usages;
96 std::array<ValueUsage, OutputsNum> output_usages;
97 std::array<bool, OutputsNum> set_outputs;
98 (
99 [&]() {
100 constexpr size_t I = InIndices;
101 /* Use `typedef` instead of `using` to work around a compiler bug. */
102 typedef Inputs T;
103 const CPPType &type = CPPType::get<T>();
104 input_pointers[I] = {type, &std::get<I>(inputs)};
105 }(),
106 ...);
107 (
108 [&]() {
109 constexpr size_t I = OutIndices;
110 /* Use `typedef` instead of `using` to work around a compiler bug. */
111 typedef Outputs T;
112 const CPPType &type = CPPType::get<T>();
113 output_pointers[I] = {type, std::get<I>(outputs)};
114 }(),
115 ...);
116 output_usages.fill(ValueUsage::Used);
117 set_outputs.fill(false);
118 LinearAllocator<> allocator;
119 Context context(fn.init_storage(allocator), user_data, local_user_data);
121 fn, input_pointers, output_pointers, input_usages, output_usages, set_outputs};
122 fn.execute(params, context);
123 fn.destruct_storage(context.storage);
124
125 /* Make sure all outputs have been computed. */
126 BLI_assert(!Span<bool>(set_outputs).contains(false));
127}
128
129} // namespace detail
130
140template<typename... Inputs, typename... Outputs>
142 UserData *user_data,
143 LocalUserData *local_user_data,
144 std::tuple<Inputs...> inputs,
145 std::tuple<Outputs *...> outputs)
146{
147 BLI_assert(fn.inputs().size() == sizeof...(Inputs));
148 BLI_assert(fn.outputs().size() == sizeof...(Outputs));
150 user_data,
151 local_user_data,
152 inputs,
153 outputs,
154 std::make_index_sequence<sizeof...(Inputs)>(),
155 std::make_index_sequence<sizeof...(Outputs)>());
156}
157
158} // namespace blender::fn::lazy_function
#define BLI_assert(a)
Definition BLI_assert.h:50
static const CPPType & get()
void set_input_unused_impl(const int index) override
BasicParams(const LazyFunction &fn, Span< GMutablePointer > inputs, Span< GMutablePointer > outputs, MutableSpan< std::optional< ValueUsage > > input_usages, Span< ValueUsage > output_usages, MutableSpan< bool > set_outputs)
void * get_output_data_ptr_impl(const int index) override
void * try_get_input_data_ptr_or_request_impl(const int index) override
ValueUsage get_output_usage_impl(const int index) const override
bool output_was_set_impl(const int index) const override
void * try_get_input_data_ptr_impl(const int index) const override
void output_set_impl(const int index) override
virtual void * init_storage(LinearAllocator<> &allocator) const
virtual void destruct_storage(void *storage) const
void execute(Params &params, const Context &context) const
void * get_output_data_ptr_impl(const int index) override
void * try_get_input_data_ptr_impl(const int index) const override
RemappedParams(const LazyFunction &fn, Params &base_params, Span< int > input_map, Span< int > output_map, bool &multi_threading_enabled)
bool output_was_set_impl(const int index) const override
ValueUsage get_output_usage_impl(const int index) const override
void set_input_unused_impl(const int index) override
void * try_get_input_data_ptr_or_request_impl(const int index) override
uiWidgetBaseParameters params[MAX_WIDGET_BASE_BATCH]
#define T
void execute_lazy_function_eagerly_impl(const LazyFunction &fn, UserData *user_data, LocalUserData *local_user_data, std::tuple< Inputs... > &inputs, std::tuple< Outputs *... > &outputs, std::index_sequence< InIndices... >, std::index_sequence< OutIndices... >)
void execute_lazy_function_eagerly(const LazyFunction &fn, UserData *user_data, LocalUserData *local_user_data, std::tuple< Inputs... > inputs, std::tuple< Outputs *... > outputs)
#define I