Commit: a22763349a28e9e37f2576a3553eff06a8e7caa7
Author: Jacques Lucke
Date:   Thu Jan 24 18:43:16 2019 +0100
Branches: functions
https://developer.blender.org/rBa22763349a28e9e37f2576a3553eff06a8e7caa7

use static size information to increase performance

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

M       source/blender/blenlib/BLI_small_buffer.hpp
M       source/blender/functions/FN_functions.h
M       source/blender/functions/FN_functions.hpp
M       source/blender/functions/intern/c_wrapper.cpp
M       source/blender/functions/intern/function.cpp
M       source/blender/modifiers/intern/MOD_functiondeform.c

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

diff --git a/source/blender/blenlib/BLI_small_buffer.hpp 
b/source/blender/blenlib/BLI_small_buffer.hpp
index 34d2745db37..28ddff0c05a 100644
--- a/source/blender/blenlib/BLI_small_buffer.hpp
+++ b/source/blender/blenlib/BLI_small_buffer.hpp
@@ -14,13 +14,27 @@ namespace BLI {
                SmallBuffer(uint size)
                        : SmallVector<char, N>(size) { }
 
-               void copy_in(uint dst, void *src, uint amount)
+               inline void copy_in(uint dst, void *src, uint amount)
                {
                        BLI_assert(dst + amount <= this->size());
                        memcpy(this->begin() + dst, src, amount);
                }
 
-               void copy_out(void *dst, uint src, uint amount) const
+               inline void copy_out(void *dst, uint src, uint amount) const
+               {
+                       BLI_assert(src + amount <= this->size());
+                       memcpy(dst, this->begin() + src, amount);
+               }
+
+               template<uint amount>
+               inline void copy_in(uint dst, void *src)
+               {
+                       BLI_assert(dst + amount <= this->size());
+                       memcpy(this->begin() + dst, src, amount);
+               }
+
+               template<uint amount>
+               inline void copy_out(uint dst, void *src) const
                {
                        BLI_assert(src + amount <= this->size());
                        memcpy(dst, this->begin() + src, amount);
diff --git a/source/blender/functions/FN_functions.h 
b/source/blender/functions/FN_functions.h
index a0dc893325e..a6be74dcf56 100644
--- a/source/blender/functions/FN_functions.h
+++ b/source/blender/functions/FN_functions.h
@@ -25,8 +25,9 @@ FnInputsRef FN_inputs_new(FunctionRef fn);
 void FN_inputs_free(FnInputsRef fn_in);
 
 /* Set a function input by index. Returns true on success. */
-void FN_inputs_set_index(FnInputsRef fn_in, uint index, void *src);
-
+void FN_inputs_set(FnInputsRef fn_in, uint index, void *src);
+void FN_inputs_set_float(FnInputsRef fn_in, uint index, float value);
+void FN_inputs_set_float_vector_3(FnInputsRef fn_in, uint index, float 
vector[3]);
 
 /* Create a container to store function outputs. */
 FnOutputsRef FN_outputs_new(FunctionRef fn);
@@ -35,7 +36,8 @@ FnOutputsRef FN_outputs_new(FunctionRef fn);
 void FN_outputs_free(FnOutputsRef fn_out);
 
 /* Extract the result of an executed function by index. */
-void FN_outputs_get_index(FnOutputsRef fn_out, uint index, void *dst);
+void FN_outputs_get(FnOutputsRef fn_out, uint index, void *dst);
+void FN_outputs_get_float_vector_3(FnOutputsRef fn_out, uint index, float 
dst[3]);
 
 const char *FN_type_name(FnTypeRef type);
 
diff --git a/source/blender/functions/FN_functions.hpp 
b/source/blender/functions/FN_functions.hpp
index 2ba0fed987b..0c66e6990c2 100644
--- a/source/blender/functions/FN_functions.hpp
+++ b/source/blender/functions/FN_functions.hpp
@@ -31,8 +31,34 @@ namespace FN {
        public:
                ValueArray() {};
                ValueArray(const SmallTypeVector &types);
-               void set(uint index, void *src);
-               void get(uint index, void *dst) const;
+
+               inline void set(uint index, void *src)
+               {
+                       BLI_assert(index < this->types.size());
+                       uint size = this->offsets[index + 1] - 
this->offsets[index];
+                       this->storage.copy_in(this->offsets[index], src, size);
+               }
+
+               inline void get(uint index, void *dst) const
+               {
+                       BLI_assert(index < this->offsets.size());
+                       uint size = this->offsets[index + 1] - 
this->offsets[index];
+                       this->storage.copy_out(dst, this->offsets[index], size);
+               }
+
+               template<uint size>
+               inline void set_static(uint index, void *src)
+               {
+                       BLI_assert(index < this->types.size());
+                       this->storage.copy_in<size>(this->offsets[index], src);
+               }
+
+               template<uint size>
+               inline void get_static(uint index, void *dst) const
+               {
+                       BLI_assert(index < this->offsets.size());
+                       this->storage.copy_out(dst, this->offsets[index], size);
+               }
 
        private:
                const SmallTypeVector types;
@@ -40,32 +66,20 @@ namespace FN {
                SmallBuffer<> storage;
        };
 
-       class Inputs {
+       class Inputs : public ValueArray {
        public:
                Inputs(const Function &fn);
 
-               inline void set(uint index, void *src)
-               { this->values.set(index, src); }
-               inline void get(uint index, void *dst) const
-               { this->values.get(index, dst); }
-
        private:
                const Function &fn;
-               ValueArray values;
        };
 
-       class Outputs {
+       class Outputs : public ValueArray {
        public:
                Outputs(const Function &fn);
 
-               inline void set(uint index, void *src)
-               { this->values.set(index, src); }
-               inline void get(uint index, void *dst) const
-               { this->values.get(index, dst); }
-
        private:
                const Function &fn;
-               ValueArray values;
        };
 
        class Signature {
diff --git a/source/blender/functions/intern/c_wrapper.cpp 
b/source/blender/functions/intern/c_wrapper.cpp
index f6e1b5ca0ff..2c9660db3d6 100644
--- a/source/blender/functions/intern/c_wrapper.cpp
+++ b/source/blender/functions/intern/c_wrapper.cpp
@@ -28,16 +28,31 @@ void FN_outputs_free(FnOutputsRef fn_out)
        delete (FN::Outputs *)fn_out;
 }
 
-void FN_inputs_set_index(FnInputsRef fn_in, uint index, void *src)
+void FN_inputs_set(FnInputsRef fn_in, uint index, void *src)
 {
        ((FN::Inputs *)fn_in)->set(index, src);
 }
 
-void FN_outputs_get_index(FnOutputsRef fn_out, uint index, void *dst)
+void FN_inputs_set_float(FnInputsRef fn_in, uint index, float value)
+{
+       ((FN::Inputs *)fn_in)->set_static<sizeof(float)>(index, (void *)&value);
+}
+
+void FN_inputs_set_float_vector_3(FnInputsRef fn_in, uint index, float 
value[3])
+{
+       ((FN::Inputs *)fn_in)->set_static<sizeof(float) * 3>(index, (void 
*)value);
+}
+
+void FN_outputs_get(FnOutputsRef fn_out, uint index, void *dst)
 {
        ((FN::Outputs *)fn_out)->get(index, dst);
 }
 
+void FN_outputs_get_float_vector_3(FnOutputsRef fn_out, uint index, float 
dst[3])
+{
+       ((FN::Outputs *)fn_out)->get_static<sizeof(float) * 3>(index, (void 
*)dst);
+}
+
 const char *FN_type_name(FnTypeRef type)
 {
        return ((FN::Type *)type)->name().c_str();
@@ -101,8 +116,8 @@ public:
        {
                float vec[3];
                float control;
-               fn_in.get(0, vec);
-               fn_in.get(1, &control);
+               fn_in.get_static<sizeof(float) * 3>(0, (void *)vec);
+               fn_in.get_static<sizeof(float)>(1, (void *)&control);
 
                float result[3];
 
@@ -110,7 +125,7 @@ public:
                result[1] = vec[1];
                result[2] = vec[2];
 
-               fn_out.set(0, result);
+               fn_out.set_static<sizeof(float) * 3>(0, result);
 
                return true;
        }
diff --git a/source/blender/functions/intern/function.cpp 
b/source/blender/functions/intern/function.cpp
index a985b132606..0bd989c28fc 100644
--- a/source/blender/functions/intern/function.cpp
+++ b/source/blender/functions/intern/function.cpp
@@ -13,12 +13,11 @@ const uint Type::size() const
 }
 
 
-
 Inputs::Inputs(const Function &fn)
-       : fn(fn), values(fn.signature().inputs()) { }
+       : ValueArray(fn.signature().inputs()), fn(fn) { }
 
 Outputs::Outputs(const Function &fn)
-       : fn(fn), values(fn.signature().outputs()) { }
+       : ValueArray(fn.signature().outputs()), fn(fn) { }
 
 
 
@@ -34,23 +33,6 @@ ValueArray::ValueArray(const SmallTypeVector &types)
        this->storage = SmallBuffer<>(total_size);
 }
 
-void ValueArray::set(uint index, void *src)
-{
-       BLI_assert(index < this->types.size());
-       uint size = this->offsets[index + 1] - this->offsets[index];
-       this->storage.copy_in(this->offsets[index], src, size);
-}
-
-void ValueArray::get(uint index, void *dst) const
-{
-       BLI_assert(index < this->offsets.size());
-       this->storage.copy_out(
-               dst,
-               this->offsets[index],
-               this->types[index]->size());
-}
-
-
 Function::~Function()
 {
 }
diff --git a/source/blender/modifiers/intern/MOD_functiondeform.c 
b/source/blender/modifiers/intern/MOD_functiondeform.c
index 6bfff5f987e..8319dd416dc 100644
--- a/source/blender/modifiers/intern/MOD_functiondeform.c
+++ b/source/blender/modifiers/intern/MOD_functiondeform.c
@@ -61,14 +61,14 @@ static void deformVerts(
        FnInputsRef fn_in = FN_inputs_new(fn);
        FnOutputsRef fn_out = FN_outputs_new(fn);
 
-       FN_inputs_set_index(fn_in, 1, &fdmd->control1);
+       FN_inputs_set_float(fn_in, 1, fdmd->control1);
 
        clock_t start = clock();
 
        for (int i = 0; i < numVerts; i++) {
-               FN_inputs_set_index(fn_in, 0, vertexCos + i);
+               FN_inputs_set_float_vector_3(fn_in, 0, vertexCos[i]);
                FN_function_call(fn, fn_in, fn_out);
-               FN_outputs_get_index(fn_out, 0, vertexCos + i);
+               FN_outputs_get_float_vector_3(fn_out, 0, vertexCos[i]);
        }
 
        clock_t end = clock();

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

Reply via email to