[Bf-blender-cvs] [0e8cd49] object_nodes: Move IR function implementations using the LLVM api into modules.h.
Lukas Tönne
noreply at git.blender.org
Tue May 24 12:07:59 CEST 2016
Commit: 0e8cd49e3b8dd177bc0b26fd9caf104a701b8165
Author: Lukas Tönne
Date: Tue May 24 10:58:31 2016 +0200
Branches: object_nodes
https://developer.blender.org/rB0e8cd49e3b8dd177bc0b26fd9caf104a701b8165
Move IR function implementations using the LLVM api into modules.h.
===================================================================
M source/blender/blenvm/llvm/llvm_codegen.cc
M source/blender/blenvm/llvm/llvm_codegen.h
M source/blender/blenvm/llvm/llvm_modules.cc
M source/blender/blenvm/llvm/llvm_modules.h
===================================================================
diff --git a/source/blender/blenvm/llvm/llvm_codegen.cc b/source/blender/blenvm/llvm/llvm_codegen.cc
index 65ec565..95b2c66 100644
--- a/source/blender/blenvm/llvm/llvm_codegen.cc
+++ b/source/blender/blenvm/llvm/llvm_codegen.cc
@@ -383,32 +383,6 @@ llvm::FunctionType *LLVMCompilerBase::get_node_function_type(const std::vector<l
return FunctionType::get(TypeBuilder<void, true>::get(context()), arg_types, false);
}
-static void define_function_OP_VALUE_SINGLE(llvm::LLVMContext &context, llvm::BasicBlock *block,
- llvm::Value *result, llvm::Value *value)
-{
- using namespace llvm;
-
- IRBuilder<> builder(context);
- builder.SetInsertPoint(block);
-
- builder.CreateStore(value, result);
-
- builder.CreateRetVoid();
-}
-
-static void define_function_OP_VALUE_AGGREGATE(llvm::LLVMContext &context, llvm::BasicBlock *block,
- llvm::Value *result, llvm::Value *value, size_t size)
-{
- using namespace llvm;
-
- IRBuilder<> builder(context);
- builder.SetInsertPoint(block);
-
- Value *size_v = ConstantInt::get(context, APInt(32, size));
- builder.CreateMemCpy(result, value, size_v, 0);
-
- builder.CreateRetVoid();
-}
llvm::Function *LLVMCompilerBase::declare_node_function(llvm::Module *mod, const NodeType *nodetype)
{
@@ -508,25 +482,29 @@ bool LLVMSimpleCompilerImpl::set_node_function_impl(OpCode op, const NodeType *U
args.push_back(a);
switch (op) {
- case OP_VALUE_FLOAT:
+ case OP_VALUE_FLOAT: {
+ BasicBlock *block = BasicBlock::Create(context(), "entry", func);
+ def_node_VALUE_FLOAT(context(), block, args[0], args[1]);
+ return true;
+ }
case OP_VALUE_INT: {
BasicBlock *block = BasicBlock::Create(context(), "entry", func);
- define_function_OP_VALUE_SINGLE(context(), block, args[0], args[1]);
+ def_node_VALUE_INT(context(), block, args[0], args[1]);
return true;
}
case OP_VALUE_FLOAT3: {
BasicBlock *block = BasicBlock::Create(context(), "entry", func);
- define_function_OP_VALUE_AGGREGATE(context(), block, args[0], args[1], sizeof(float3));
+ def_node_VALUE_FLOAT3(context(), block, args[0], args[1]);
return true;
}
case OP_VALUE_FLOAT4: {
BasicBlock *block = BasicBlock::Create(context(), "entry", func);
- define_function_OP_VALUE_AGGREGATE(context(), block, args[0], args[1], sizeof(float4));
+ def_node_VALUE_FLOAT4(context(), block, args[0], args[1]);
return true;
}
case OP_VALUE_MATRIX44: {
BasicBlock *block = BasicBlock::Create(context(), "entry", func);
- define_function_OP_VALUE_AGGREGATE(context(), block, args[0], args[1], sizeof(matrix44));
+ def_node_VALUE_MATRIX44(context(), block, args[0], args[1]);
return true;
}
@@ -683,36 +661,52 @@ llvm::Function *LLVMTextureCompilerImpl::declare_elementary_node_function(llvm::
return func;
}
-bool LLVMTextureCompilerImpl::set_elementary_node_function_impl(OpCode op, const NodeType *UNUSED(nodetype),
- llvm::Function *func, int deriv)
+bool LLVMTextureCompilerImpl::set_node_function_impl(OpCode op, const NodeType *nodetype,
+ llvm::Function *value_func,
+ std::vector<llvm::Function*> deriv_funcs)
{
using namespace llvm;
- std::vector<Value*> args;
- args.reserve(func->arg_size());
- for (Function::arg_iterator a = func->arg_begin(); a != func->arg_end(); ++a)
- args.push_back(a);
+ typedef std::vector<Value*> ValueList;
+
+ ValueList value_args;
+ value_args.reserve(value_func->arg_size());
+ for (Function::arg_iterator a = value_func->arg_begin(); a != value_func->arg_end(); ++a)
+ value_args.push_back(a);
+
+#if 0 /* TODO only do the value function for now */
+ std::vector<ValueList> deriv_args(nodetype->num_inputs());
+ for (int n = 0; n < nodetype->num_inputs(); ++n) {
+ deriv_args[n].reserve(deriv_funcs[n]->arg_size());
+ for (Function::arg_iterator a = deriv_funcs[n]->arg_begin(); a != deriv_funcs[n]->arg_end(); ++a)
+ deriv_args[n].push_back(a);
+ }
+#endif
switch (op) {
- case OP_VALUE_FLOAT:
+ case OP_VALUE_FLOAT: {
+ BasicBlock *block = BasicBlock::Create(context(), "entry", value_func);
+ def_node_VALUE_FLOAT(context(), block, value_args[0], value_args[1]);
+ return true;
+ }
case OP_VALUE_INT: {
- BasicBlock *block = BasicBlock::Create(context(), "entry", func);
- define_function_OP_VALUE_SINGLE(context(), block, args[0], args[1]);
+ BasicBlock *block = BasicBlock::Create(context(), "entry", value_func);
+ def_node_VALUE_INT(context(), block, value_args[0], value_args[1]);
return true;
}
case OP_VALUE_FLOAT3: {
- BasicBlock *block = BasicBlock::Create(context(), "entry", func);
- define_function_OP_VALUE_AGGREGATE(context(), block, args[0], args[1], sizeof(float3));
+ BasicBlock *block = BasicBlock::Create(context(), "entry", value_func);
+ def_node_VALUE_FLOAT3(context(), block, value_args[0], value_args[1]);
return true;
}
case OP_VALUE_FLOAT4: {
- BasicBlock *block = BasicBlock::Create(context(), "entry", func);
- define_function_OP_VALUE_AGGREGATE(context(), block, args[0], args[1], sizeof(float4));
+ BasicBlock *block = BasicBlock::Create(context(), "entry", value_func);
+ def_node_VALUE_FLOAT4(context(), block, value_args[0], value_args[1]);
return true;
}
case OP_VALUE_MATRIX44: {
- BasicBlock *block = BasicBlock::Create(context(), "entry", func);
- define_function_OP_VALUE_AGGREGATE(context(), block, args[0], args[1], sizeof(matrix44));
+ BasicBlock *block = BasicBlock::Create(context(), "entry", value_func);
+ def_node_VALUE_MATRIX44(context(), block, value_args[0], value_args[1]);
return true;
}
@@ -730,21 +724,19 @@ static void define_elementary_functions(LLVMTextureCompilerImpl &C, llvm::Module
if (nodetype == NULL)
return;
- Function *value_func = C.declare_elementary_node_function(mod, nodetype,
- llvm_value_function_name(nodetype->name()));
- /* -1 means the base version, 0..n define the derivative of the n-th argument, if defined */
- bool has_impl = C.set_elementary_node_function_impl(op, nodetype, value_func, -1);
- UNUSED_VARS(has_impl);
-
+ string value_name = llvm_value_function_name(nodetype->name());
+ /* declare function */
+ Function *value_func = C.declare_elementary_node_function(mod, nodetype, value_name);
+ /* declare partial derivatives wrt. the input arguments */
+ std::vector<Function *> deriv_funcs(nodetype->num_inputs());
#if 0 /* TODO only do the value function for now */
- /* 0..n define the derivative of the n-th argument, if it is a dependent variable */
for (int arg_n = -1; arg_n < nodetype->num_inputs(); ++arg_n) {
- Function *deriv_func = C.declare_elementary_node_function(mod, nodetype,
- llvm_deriv_function_name(nodetype->name(), arg_n));
- bool has_impl = C.set_elementary_node_function_impl(op, nodetype, deriv_func, arg_n);
- UNUSED_VARS(has_impl);
+ string deriv_name = llvm_deriv_function_name(nodetype->name(), arg_n);
+ deriv_funcs[arg_n] = C.declare_elementary_node_function(mod, nodetype, deriv_name);
}
#endif
+
+ C.set_node_function_impl(op, nodetype, value_func, deriv_funcs);
}
void LLVMTextureCompilerImpl::define_dual_function_wrapper(llvm::Module *mod, const string &nodetype_name)
@@ -756,9 +748,19 @@ void LLVMTextureCompilerImpl::define_dual_function_wrapper(llvm::Module *mod, co
return;
/* get evaluation function(s) */
- Function *value_func = llvm_find_external_function(mod, llvm_value_function_name(nodetype->name()));
+ string value_name = llvm_value_function_name(nodetype->name());
+ Function *value_func = llvm_find_external_function(mod, value_name);
BLI_assert(value_func != NULL && "Could not find node function!");
+#if 0 /* TODO only do the value function for now */
+ std::vector<Function *> deriv_funcs(nodetype->num_inputs());
+ for (int n = -1; n < nodetype->num_inputs(); ++n) {
+ string deriv_name = llvm_deriv_function_name(nodetype->name(), n);
+ deriv_funcs[n] = llvm_find_external_function(mod, deriv_name);
+ }
+#endif
+
+ /* wrapper function */
Function *func = declare_node_function(mod, nodetype);
if (func == NULL)
return;
@@ -825,8 +827,19 @@ void LLVMTextureCompilerImpl::define_dual_function_wrapper(llvm::Module *mod, co
call_args.push_back(val);
}
- /* call primary value function */
+ /* calculate value */
builder.CreateCall(value_func, call_args);
+#if 0 /* TODO only do the value function for now */
+ /* calculate partial derivatives wrt. each input */
+ for (int i = 0; i < nodetype->num_inputs(); ++i, ++arg_it) {
+ const NodeInput *input = nodetype->find_input(i);
+ const TypeSpec *typespec = input->typedesc.get_typespec();
+
+ if (deriv_funcs[i] != NULL) {
+
+ }
+ }
+#endif
builder.CreateRetVoid();
}
diff --git a/source/blender/blenvm/llvm/llvm_codegen.h b/source/blender/blenvm/llvm/llvm_codegen.h
index 6db4612..ccf28ca 100644
--- a/source/blender/blenvm/llvm/llvm_codegen.h
+++ b/source/blender/blenvm/llvm/llvm_codegen.h
@@ -136,7 +136,9 @@ struct LLVMTextureCompilerImpl : public LLVMCompilerBase {
llvm::Constant *create_node_value_constant(const NodeValue *node_value);
- bool set_elementary_node_function_impl(OpCode op, const NodeType *nodetype, llvm::Function *func, int deriv);
+ bool set_node_function_impl(OpCode op, const NodeType *nodetype,
+ llvm::Function *value_func,
+ std::vector<llvm::Function*> deriv_funcs);
void define_dual_function_wrapper(llvm::Module *mod, const string &nodetype_name);
void define_nodes_module();
diff --git a/source/blender/blenvm/llvm/llvm_modules.cc b/source/blender/blenvm/llvm/llvm_modules.cc
index e59d962..18752fb 100644
--- a/source/blender/blenvm/llvm/llvm_modules.cc
+++ b/source/blender/blenvm/llvm/llvm_modules.cc
@@ -215,4 +215,77 @@ string llvm_deriv_function_name(const string &node, int var_n)
return ss.str();
}
+/* ---------------------------------------
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list