Commit: 2e5df2cfa6473afd1b4a2b1866d4eadc116bb2e3
Author: Jacques Lucke
Date:   Sat Mar 9 14:22:14 2019 +0100
Branches: functions
https://developer.blender.org/rB2e5df2cfa6473afd1b4a2b1866d4eadc116bb2e3

allow tuple call to modify fn_in

===================================================================

M       source/blender/functions/backends/llvm/ir_to_tuple_call.cpp
M       source/blender/functions/backends/tuple_call/fgraph_tuple_call.cpp
M       source/blender/functions/backends/tuple_call/tuple.hpp
M       source/blender/functions/backends/tuple_call/tuple_call.hpp
M       source/blender/functions/frontends/data_flow_nodes/inserters.cpp
M       source/blender/functions/functions/lists.cpp
M       source/blender/functions/functions/object_input.cpp
M       source/blender/functions/functions/random.cpp
M       source/blender/functions/functions/scalar_math.cpp
M       source/blender/functions/functions/vectors.cpp
A       source/blender/functions/notes.txt
M       source/blender/modifiers/intern/MOD_functiondeform.c

===================================================================

diff --git a/source/blender/functions/backends/llvm/ir_to_tuple_call.cpp 
b/source/blender/functions/backends/llvm/ir_to_tuple_call.cpp
index a787390d4f8..ed1f36502c0 100644
--- a/source/blender/functions/backends/llvm/ir_to_tuple_call.cpp
+++ b/source/blender/functions/backends/llvm/ir_to_tuple_call.cpp
@@ -56,7 +56,7 @@ namespace FN {
 
                        LLVMTypeInfo *type_info = get_type_info(
                                fn->signature().inputs()[i].type());
-                       llvm::Value *value = type_info->build_load_ir__copy(
+                       llvm::Value *value = type_info->build_load_ir__relocate(
                                builder, value_byte_addr);
 
                        input_values.append(value);
@@ -99,9 +99,11 @@ namespace FN {
                        m_call = (LLVMCallFN)m_compiled->function_ptr();
                }
 
-               void call(const Tuple &fn_in, Tuple &fn_out) const override
+               void call(Tuple &fn_in, Tuple &fn_out) const override
                {
+                       fn_out.destruct_all();
                        BLI_assert(fn_in.all_initialized());
+                       BLI_assert(fn_out.all_uninitialized());
 
                        m_call(
                                fn_in.data_ptr(),
@@ -109,6 +111,7 @@ namespace FN {
                                fn_out.data_ptr(),
                                fn_out.offsets_ptr());
 
+                       fn_in.set_all_uninitialized();
                        fn_out.set_all_initialized();
                }
        };
diff --git a/source/blender/functions/backends/tuple_call/fgraph_tuple_call.cpp 
b/source/blender/functions/backends/tuple_call/fgraph_tuple_call.cpp
index aa8bb1c2560..3768f3613e8 100644
--- a/source/blender/functions/backends/tuple_call/fgraph_tuple_call.cpp
+++ b/source/blender/functions/backends/tuple_call/fgraph_tuple_call.cpp
@@ -14,14 +14,14 @@ namespace FN {
                          m_inputs(function_graph.inputs()),
                          m_outputs(function_graph.outputs()) {}
 
-               void call(const Tuple &fn_in, Tuple &fn_out) const override
+               void call(Tuple &fn_in, Tuple &fn_out) const override
                {
                        for (uint i = 0; i < m_outputs.size(); i++) {
                                this->compute_socket(fn_in, fn_out, i, 
m_outputs[i]);
                        }
                }
 
-               void compute_socket(const Tuple &fn_in, Tuple &out, uint 
out_index, Socket socket) const
+               void compute_socket(Tuple &fn_in, Tuple &out, uint out_index, 
Socket socket) const
                {
                        if (m_inputs.contains(socket)) {
                                uint index = m_inputs.index(socket);
diff --git a/source/blender/functions/backends/tuple_call/tuple.hpp 
b/source/blender/functions/backends/tuple_call/tuple.hpp
index 44d1d0b71de..fbf01738d21 100644
--- a/source/blender/functions/backends/tuple_call/tuple.hpp
+++ b/source/blender/functions/backends/tuple_call/tuple.hpp
@@ -86,11 +86,7 @@ namespace FN {
 
                ~Tuple()
                {
-                       for (uint i = 0; i < m_meta->element_amount(); i++) {
-                               if (m_initialized[i]) {
-                                       
m_meta->type_infos()[i]->destruct_type(this->element_ptr(i));
-                               }
-                       }
+                       this->destruct_all();
                        if (m_owns_mem) {
                                std::free(m_data);
                                std::free(m_initialized);
@@ -206,6 +202,16 @@ namespace FN {
                        return true;
                }
 
+               bool all_uninitialized() const
+               {
+                       for (uint i = 0; i < m_meta->element_amount(); i++) {
+                               if (m_initialized[i]) {
+                                       return false;
+                               }
+                       }
+                       return true;
+               }
+
                void set_all_initialized()
                {
                        for (uint i = 0; i < m_meta->element_amount(); i++) {
@@ -220,6 +226,16 @@ namespace FN {
                        }
                }
 
+               void destruct_all()
+               {
+                       for (uint i = 0; i < m_meta->element_amount(); i++) {
+                               if (m_initialized[i]) {
+                                       
m_meta->type_infos()[i]->destruct_type(this->element_ptr(i));
+                                       m_initialized[i] = false;
+                               }
+                       }
+               }
+
        private:
                inline void *element_ptr(uint index) const
                {
diff --git a/source/blender/functions/backends/tuple_call/tuple_call.hpp 
b/source/blender/functions/backends/tuple_call/tuple_call.hpp
index 33237778f29..f409cf1e047 100644
--- a/source/blender/functions/backends/tuple_call/tuple_call.hpp
+++ b/source/blender/functions/backends/tuple_call/tuple_call.hpp
@@ -11,7 +11,7 @@ namespace FN {
 
                virtual ~TupleCallBody() {};
 
-               virtual void call(const Tuple &fn_in, Tuple &fn_out) const = 0;
+               virtual void call(Tuple &fn_in, Tuple &fn_out) const = 0;
                virtual void init_defaults(Tuple &fn_in) const;
        };
 
diff --git a/source/blender/functions/frontends/data_flow_nodes/inserters.cpp 
b/source/blender/functions/frontends/data_flow_nodes/inserters.cpp
index 1397612b746..922f06533e7 100644
--- a/source/blender/functions/frontends/data_flow_nodes/inserters.cpp
+++ b/source/blender/functions/frontends/data_flow_nodes/inserters.cpp
@@ -74,7 +74,7 @@ namespace FN { namespace DataFlowNodes {
                        SmallVector<SocketLoader> &loaders)
                        : m_btree(btree), m_bsockets(bsockets), 
m_loaders(loaders) {}
 
-               void call(const Tuple &UNUSED(fn_in), Tuple &fn_out) const 
override
+               void call(Tuple &UNUSED(fn_in), Tuple &fn_out) const override
                {
                        for (uint i = 0; i < m_bsockets.size(); i++) {
                                PointerRNA ptr;
diff --git a/source/blender/functions/functions/lists.cpp 
b/source/blender/functions/functions/lists.cpp
index a6c3e7756e3..070b0b75528 100644
--- a/source/blender/functions/functions/lists.cpp
+++ b/source/blender/functions/functions/lists.cpp
@@ -9,7 +9,7 @@ namespace FN { namespace Functions {
        using namespace Types;
 
        class AppendFloat : public TupleCallBody {
-               void call(const Tuple &fn_in, Tuple &fn_out) const override
+               void call(Tuple &fn_in, Tuple &fn_out) const override
                {
                        auto list = fn_in.copy_out<SharedFloatList>(0);
                        float value = fn_in.get<float>(1);
diff --git a/source/blender/functions/functions/object_input.cpp 
b/source/blender/functions/functions/object_input.cpp
index 6069dc8d652..906683f96de 100644
--- a/source/blender/functions/functions/object_input.cpp
+++ b/source/blender/functions/functions/object_input.cpp
@@ -18,7 +18,7 @@ namespace FN { namespace Functions {
                ObjectTransforms(Object *object)
                        : m_object(object) {}
 
-               void call(const Tuple &UNUSED(fn_in), Tuple &fn_out) const 
override
+               void call(Tuple &UNUSED(fn_in), Tuple &fn_out) const override
                {
                        if (m_object) {
                                Vector position = *(Vector *)m_object->loc;
diff --git a/source/blender/functions/functions/random.cpp 
b/source/blender/functions/functions/random.cpp
index d322f20156f..c4658889be1 100644
--- a/source/blender/functions/functions/random.cpp
+++ b/source/blender/functions/functions/random.cpp
@@ -22,7 +22,7 @@ namespace FN { namespace Functions {
 
 
        class RandomNumber : public TupleCallBody {
-               void call(const Tuple &fn_in, Tuple &fn_out) const override
+               void call(Tuple &fn_in, Tuple &fn_out) const override
                {
                        uint32_t seed = fn_in.get<int32_t>(0);
                        float min = fn_in.get<float>(1);
diff --git a/source/blender/functions/functions/scalar_math.cpp 
b/source/blender/functions/functions/scalar_math.cpp
index 31bd50b1c38..c04ffcfa58f 100644
--- a/source/blender/functions/functions/scalar_math.cpp
+++ b/source/blender/functions/functions/scalar_math.cpp
@@ -22,7 +22,7 @@ namespace FN { namespace Functions {
 
 
        class AddFloats : public TupleCallBody {
-               void call(const Tuple &fn_in, Tuple &fn_out) const override
+               void call(Tuple &fn_in, Tuple &fn_out) const override
                {
                        float a = fn_in.get<float>(0);
                        float b = fn_in.get<float>(1);
@@ -51,7 +51,7 @@ namespace FN { namespace Functions {
 
 
        class MultiplyFloats : public TupleCallBody {
-               void call(const Tuple &fn_in, Tuple &fn_out) const override
+               void call(Tuple &fn_in, Tuple &fn_out) const override
                {
                        float a = fn_in.get<float>(0);
                        float b = fn_in.get<float>(1);
@@ -68,7 +68,7 @@ namespace FN { namespace Functions {
 
 
        class MinFloats : public TupleCallBody {
-               void call(const Tuple &fn_in, Tuple &fn_out) const override
+               void call(Tuple &fn_in, Tuple &fn_out) const override
                {
                        float a = fn_in.get<float>(0);
                        float b = fn_in.get<float>(1);
@@ -85,7 +85,7 @@ namespace FN { namespace Functions {
 
 
        class MaxFloats : public TupleCallBody {
-               void call(const Tuple &fn_in, Tuple &fn_out) const override
+               void call(Tuple &fn_in, Tuple &fn_out) const override
                {
                        float a = fn_in.get<float>(0);
                        float b = fn_in.get<float>(1);
@@ -102,7 +102,7 @@ namespace FN { namespace Functions {
 
 
        class MapRange : public TupleCallBody {
-               void call(const Tuple &fn_in, Tuple &fn_out) const override
+               void call(Tuple &fn_in, Tuple &fn_out) const override
                {
                        float value = fn_in.get<float>(0);
                        float from_min = fn_in.get<float>(1);
diff --git a/source/blender/functions/functions/vectors.cpp 
b/source/blender/functions/functions/vectors.cpp
index 9d09c522788..4d2ae029299 100644
--- a/source/blender/functions/functions/vectors.cpp
+++ b/source/blender/functions/functions/vectors.cpp
@@ -67,7 +67,7 @@ namespace FN { namespace Functions {
 
 
        class VectorDistance : public TupleCallBody {
-               void call(const Tuple &fn_in, Tuple &fn_out) const override
+               void call(Tuple &fn_in, Tuple &fn_out) const override
                {
                        Vector a = fn_in.get<Vector>(0);
                        Vector b = fn_in.get<Vector>(1);
diff --git a/source/blender/functions/notes.txt 
b/source/blender/functions/notes.txt
new file mode 100644
index 00000000000..924244600f7
--- /dev/null
+++ b/source/blender/functions/notes.txt
@@ -0,0 +1,20 @@
+- Some types can have multiple owners and are reference counted.
+    - Function
+    - Type
+    - DataFlowGraph
+    - TupleMeta
+
+- Function bodies are owned by a single function.
+- A function can have multiple bodies.
+- A function can have at most one body of a certain type.
+
+- Type extensions are owned by a single type.
+- A type can have multiple extensions.
+- A type can have at most one extensions of a certain type.
+
+Inside a tuple call:
+    - A tuple call body can modify fn_in and fn_out.
+    - The underlying tuple buffers are owned by the caller and might be freed 
any time after the function finished.
+    - When a tuple is freed, all initialized values in it are freed.
+    - A tuple call body has to initialize all values in fn_out.
+    - fn_out might already contain initialized values on entry.
\ No newline at end of file
diff --git a/source/blender/modifiers/intern/MOD_functiondeform.c 
b/source/blender/modifiers/intern/MOD_functiondeform.c
index b92be185472..0aeb072185e 100644
--- a/source/blender/modifiers/intern/MOD_functiondeform.c
+++ b/source/blender/modifiers/intern/MOD_functiondeform.c
@@ -83,13 +83,12 @@ static void do_deformation(
        FnTuple fn_in = FN_tuple_for_input(fn);
        FnTuple fn_out = FN_tuple_for_output(fn);
 
-       FN_tuple_set_f

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to