Commit: de09b751756b0ed0783b10f060fecd4f6de683be
Author: Lukas Tönne
Date:   Wed Jun 1 16:36:17 2016 +0200
Branches: object_nodes
https://developer.blender.org/rBde09b751756b0ed0783b10f060fecd4f6de683be

Unify code generation through the llvm API.

Also standard functions for copying and zeroing values are now
implemented per type rather than relying on a simple load/store.
This will become more important with larger aggregate types such as matrix44.

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

M       source/blender/blenvm/compile/node_graph.cc
M       source/blender/blenvm/compile/typedesc.cc
M       source/blender/blenvm/compile/typedesc.h
M       source/blender/blenvm/intern/bvm_api.cc
M       source/blender/blenvm/llvm/llvm_compiler.h
M       source/blender/blenvm/llvm/llvm_compiler_dual.cc
M       source/blender/blenvm/llvm/llvm_modules.cc
M       source/blender/blenvm/llvm/llvm_modules.h
M       source/blender/blenvm/llvm/llvm_types.cc
M       source/blender/blenvm/llvm/llvm_types.h

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

diff --git a/source/blender/blenvm/compile/node_graph.cc 
b/source/blender/blenvm/compile/node_graph.cc
index ad4a370..ef0f057 100644
--- a/source/blender/blenvm/compile/node_graph.cc
+++ b/source/blender/blenvm/compile/node_graph.cc
@@ -1220,51 +1220,51 @@ void NodeGraph::finalize()
 static void register_typedefs()
 {
        
-       TypeSpec *float_t = TypeSpec::add_typedef("FLOAT", BVM_FLOAT);
+       TypeSpec *float_t = TypeSpec::add_typespec("FLOAT", BVM_FLOAT);
        UNUSED_VARS(float_t);
        
-       TypeSpec *float3_t = TypeSpec::add_typedef("FLOAT3", BVM_FLOAT3);
+       TypeSpec *float3_t = TypeSpec::add_typespec("FLOAT3", BVM_FLOAT3);
        UNUSED_VARS(float3_t);
        
-       TypeSpec *float4_t = TypeSpec::add_typedef("FLOAT4", BVM_FLOAT4);
+       TypeSpec *float4_t = TypeSpec::add_typespec("FLOAT4", BVM_FLOAT4);
        UNUSED_VARS(float4_t);
        
-       TypeSpec *int_t = TypeSpec::add_typedef("INT", BVM_INT);
+       TypeSpec *int_t = TypeSpec::add_typespec("INT", BVM_INT);
        UNUSED_VARS(int_t);
        
-       TypeSpec *matrix44_t = TypeSpec::add_typedef("MATRIX44", BVM_MATRIX44);
+       TypeSpec *matrix44_t = TypeSpec::add_typespec("MATRIX44", BVM_MATRIX44);
        UNUSED_VARS(matrix44_t);
        
-       TypeSpec *string_t = TypeSpec::add_typedef("STRING", BVM_STRING);
+       TypeSpec *string_t = TypeSpec::add_typespec("STRING", BVM_STRING);
        UNUSED_VARS(string_t);
        
-       TypeSpec *rnapointer_t = TypeSpec::add_typedef("RNAPOINTER", 
BVM_RNAPOINTER);
+       TypeSpec *rnapointer_t = TypeSpec::add_typespec("RNAPOINTER", 
BVM_RNAPOINTER);
        UNUSED_VARS(rnapointer_t);
        
-       TypeSpec *mesh_t = TypeSpec::add_typedef("MESH", BVM_MESH);
+       TypeSpec *mesh_t = TypeSpec::add_typespec("MESH", BVM_MESH);
        UNUSED_VARS(mesh_t);
        
-       TypeSpec *duplis_t = TypeSpec::add_typedef("DUPLIS", BVM_DUPLIS);
+       TypeSpec *duplis_t = TypeSpec::add_typespec("DUPLIS", BVM_DUPLIS);
        UNUSED_VARS(duplis_t);
        
        
-       TypeSpec::add_typedef("FLOAT_ARRAY", BVM_FLOAT, BVM_BUFFER_ARRAY);
+       TypeSpec::add_typespec("FLOAT_ARRAY", BVM_FLOAT, BVM_BUFFER_ARRAY);
        
-       TypeSpec::add_typedef("FLOAT3_ARRAY", BVM_FLOAT3, BVM_BUFFER_ARRAY);
+       TypeSpec::add_typespec("FLOAT3_ARRAY", BVM_FLOAT3, BVM_BUFFER_ARRAY);
        
-       TypeSpec::add_typedef("FLOAT4_ARRAY", BVM_FLOAT4, BVM_BUFFER_ARRAY);
+       TypeSpec::add_typespec("FLOAT4_ARRAY", BVM_FLOAT4, BVM_BUFFER_ARRAY);
        
-       TypeSpec::add_typedef("INT_ARRAY", BVM_INT, BVM_BUFFER_ARRAY);
+       TypeSpec::add_typespec("INT_ARRAY", BVM_INT, BVM_BUFFER_ARRAY);
        
-       TypeSpec::add_typedef("MATRIX44_ARRAY", BVM_MATRIX44, BVM_BUFFER_ARRAY);
+       TypeSpec::add_typespec("MATRIX44_ARRAY", BVM_MATRIX44, 
BVM_BUFFER_ARRAY);
        
-       TypeSpec::add_typedef("STRING_ARRAY", BVM_STRING, BVM_BUFFER_ARRAY);
+       TypeSpec::add_typespec("STRING_ARRAY", BVM_STRING, BVM_BUFFER_ARRAY);
        
-       TypeSpec::add_typedef("RNAPOINTER_ARRAY", BVM_RNAPOINTER, 
BVM_BUFFER_ARRAY);
+       TypeSpec::add_typespec("RNAPOINTER_ARRAY", BVM_RNAPOINTER, 
BVM_BUFFER_ARRAY);
        
-       TypeSpec::add_typedef("MESH_ARRAY", BVM_MESH, BVM_BUFFER_ARRAY);
+       TypeSpec::add_typespec("MESH_ARRAY", BVM_MESH, BVM_BUFFER_ARRAY);
        
-       TypeSpec::add_typedef("DUPLIS_ARRAY", BVM_DUPLIS, BVM_BUFFER_ARRAY);
+       TypeSpec::add_typespec("DUPLIS_ARRAY", BVM_DUPLIS, BVM_BUFFER_ARRAY);
 }
 
 OpCode get_opcode_from_node_type(const string &node)
diff --git a/source/blender/blenvm/compile/typedesc.cc 
b/source/blender/blenvm/compile/typedesc.cc
index 3348243..df42568 100644
--- a/source/blender/blenvm/compile/typedesc.cc
+++ b/source/blender/blenvm/compile/typedesc.cc
@@ -323,7 +323,7 @@ StructSpec* TypeSpec::make_structure()
 
 TypeSpec::TypeDefMap TypeSpec::m_typedefs;
 
-const TypeSpec* TypeSpec::get_typedef(const string &name)
+const TypeSpec* TypeSpec::get_typespec(const string &name)
 {
        TypeDefMap::const_iterator it = m_typedefs.find(name);
        if (it != m_typedefs.end())
@@ -332,7 +332,7 @@ const TypeSpec* TypeSpec::get_typedef(const string &name)
                return NULL;
 }
 
-TypeSpec *TypeSpec::add_typedef(const string &name, BVMType base_type, 
BVMBufferType buffer_type)
+TypeSpec *TypeSpec::add_typespec(const string &name, BVMType base_type, 
BVMBufferType buffer_type)
 {
        BLI_assert (m_typedefs.find(name) == m_typedefs.end());
        
@@ -341,7 +341,7 @@ TypeSpec *TypeSpec::add_typedef(const string &name, BVMType 
base_type, BVMBuffer
        return ts;
 }
 
-void TypeSpec::remove_typedef(const string &name)
+void TypeSpec::remove_typespec(const string &name)
 {
        TypeDefMap::iterator it = m_typedefs.find(name);
        if (it != m_typedefs.end()) {
@@ -350,7 +350,7 @@ void TypeSpec::remove_typedef(const string &name)
        }
 }
 
-void TypeSpec::clear_typedefs()
+void TypeSpec::clear_typespecs()
 {
        for (TypeDefMap::iterator it = m_typedefs.begin(); it != 
m_typedefs.end(); ++it) {
                delete it->second;
@@ -358,12 +358,12 @@ void TypeSpec::clear_typedefs()
        m_typedefs.clear();
 }
 
-TypeSpec::typedef_iterator TypeSpec::typedef_begin()
+TypeSpec::typedef_iterator TypeSpec::typespec_begin()
 {
        return m_typedefs.begin();
 }
 
-TypeSpec::typedef_iterator TypeSpec::typedef_end()
+TypeSpec::typedef_iterator TypeSpec::typespec_end()
 {
        return m_typedefs.end();
 }
@@ -386,13 +386,13 @@ TypeDesc::~TypeDesc()
 
 bool TypeDesc::has_typespec() const
 {
-       const TypeSpec *ts = TypeSpec::get_typedef(m_name);
+       const TypeSpec *ts = TypeSpec::get_typespec(m_name);
        return ts != NULL;
 }
 
 const TypeSpec *TypeDesc::get_typespec() const
 {
-       const TypeSpec *ts = TypeSpec::get_typedef(m_name);
+       const TypeSpec *ts = TypeSpec::get_typespec(m_name);
        BLI_assert(ts != NULL);
        return ts;
 }
diff --git a/source/blender/blenvm/compile/typedesc.h 
b/source/blender/blenvm/compile/typedesc.h
index 678bdad..b0f222e 100644
--- a/source/blender/blenvm/compile/typedesc.h
+++ b/source/blender/blenvm/compile/typedesc.h
@@ -192,12 +192,12 @@ struct TypeSpec {
        StructSpec *structure() { return m_structure; }
        StructSpec *make_structure();
        
-       static const TypeSpec* get_typedef(const string &name);
-       static TypeSpec *add_typedef(const string &name, BVMType base_type, 
BVMBufferType buffer_type = BVM_BUFFER_SINGLE);
-       static void remove_typedef(const string &name);
-       static void clear_typedefs();
-       static typedef_iterator typedef_begin();
-       static typedef_iterator typedef_end();
+       static const TypeSpec* get_typespec(const string &name);
+       static TypeSpec *add_typespec(const string &name, BVMType base_type, 
BVMBufferType buffer_type = BVM_BUFFER_SINGLE);
+       static void remove_typespec(const string &name);
+       static void clear_typespecs();
+       static typedef_iterator typespec_begin();
+       static typedef_iterator typespec_end();
        
 private:
        BVMType m_base_type;
diff --git a/source/blender/blenvm/intern/bvm_api.cc 
b/source/blender/blenvm/intern/bvm_api.cc
index d94553c..ee047e2 100644
--- a/source/blender/blenvm/intern/bvm_api.cc
+++ b/source/blender/blenvm/intern/bvm_api.cc
@@ -103,7 +103,7 @@ void BVM_free(void)
 #endif
        
        nodes_free();
-       TypeSpec::clear_typedefs();
+       TypeSpec::clear_typespecs();
        
        destroy_empty_mesh(__empty_mesh__);
 }
diff --git a/source/blender/blenvm/llvm/llvm_compiler.h 
b/source/blender/blenvm/llvm/llvm_compiler.h
index 851afc4..ba01a2b 100644
--- a/source/blender/blenvm/llvm/llvm_compiler.h
+++ b/source/blender/blenvm/llvm/llvm_compiler.h
@@ -165,11 +165,8 @@ struct LLVMTextureCompiler : public LLVMCompilerBase {
                llvm::Module *mod, const NodeType *nodetype, const string &name,
                bool with_derivatives);
        
-       bool set_node_function_impl(OpCode op, const NodeType *nodetype,
-                                   llvm::Function *value_func, llvm::Function 
* dual_func);
        void define_elementary_functions(llvm::Module *mod, OpCode op, const 
NodeType *nodetype);
-       void define_dual_function_wrapper(llvm::Module *mod, OpCode op, const 
NodeType *nodetype);
-       void define_get_derivative(llvm::Module *mod, OpCode op, const NodeType 
*nodetype);
+       void define_dual_function_wrapper(llvm::Module *mod, llvm::Function 
*func, OpCode op, const NodeType *nodetype);
        
 private:
        static llvm::Module *m_nodes_module;
diff --git a/source/blender/blenvm/llvm/llvm_compiler_dual.cc 
b/source/blender/blenvm/llvm/llvm_compiler_dual.cc
index 3352339..b5cd428 100644
--- a/source/blender/blenvm/llvm/llvm_compiler_dual.cc
+++ b/source/blender/blenvm/llvm/llvm_compiler_dual.cc
@@ -138,6 +138,7 @@ void 
LLVMTextureCompiler::append_input_constant(llvm::BasicBlock *block, std::ve
        
        if (use_argument_pointer(typespec, false)) {
                AllocaInst *pvalue = builder.CreateAlloca(cvalue->getType());
+               /* XXX this may not work for larger aggregate types (matrix44) 
!! */
                builder.CreateStore(cvalue, pvalue);
                
                args.push_back(pvalue);
@@ -171,6 +172,8 @@ void 
LLVMTextureCompiler::store_return_value(llvm::BasicBlock *block, const Outp
 {
        using namespace llvm;
        
+       const TypeSpec *typespec = output.socket->typedesc.get_typespec();
+       
        IRBuilder<> builder(context());
        builder.SetInsertPoint(block);
        
@@ -179,12 +182,9 @@ void 
LLVMTextureCompiler::store_return_value(llvm::BasicBlock *block, const Outp
        Value *dy_ptr = builder.CreateStructGEP(arg, 2);
        
        DualValue dual = m_output_values.at(output);
-       Value *rvalue = builder.CreateLoad(dual.value());
-       Value *rdx = builder.CreateLoad(dual.dx());
-       Value *rdy = builder.CreateLoad(dual.dy());
-       builder.CreateStore(rvalue, value_ptr);
-       builder.CreateStore(rdx, dx_ptr);
-       builder.CreateStore(rdy, dy_ptr);
+       bvm_llvm_copy_value(context(), block, value_ptr, dual.value(), 
typespec);
+       bvm_llvm_copy_value(context(), block, dx_ptr, dual.dx(), typespec);
+       bvm_llvm_copy_value(context(), block, dy_ptr, dual.dy(), typespec);
 }
 
 llvm::Type *LLVMTextureCompiler::get_argument_type(const TypeSpec *spec) const
@@ -275,21 +275,48 @@ bool 
LLVMTextureCompiler::use_elementary_argument_pointer(const TypeSpec *typesp
 
 void LLVMTextureCompiler::define_node_function(llvm::Module *mod, OpCode op, 
const string &nodetype_name)
 {
+       using namespace llvm;
+       
        const NodeType *nodetype = NodeGraph::find_node_type(nodetype_name);
        if (nodetype == NULL)
                return;
        
+       /* wrapper function */
+       Function *func = declare_node_function(mod, nodetype);
+       if (func == NULL)
+               return;
+       
        switch (op) {
                /* special cases */
                case OP_GET_DERIVATIVE_FLOAT:
+                       def_node_GET_DERIVATIVE_FLOAT(context(), func);
+                       break;
                case OP_GET_DERIVATIVE_FLOAT3:
+                       def_node_GET_DERIVATIVE_FLOAT3(context(), func)

@@ 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