[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