[Bf-blender-cvs] [de09b75] object_nodes: Unify code generation through the llvm API.

Lukas Tönne noreply at git.blender.org
Wed Jun 1 16:38:00 CEST 2016


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




More information about the Bf-blender-cvs mailing list