[Bf-blender-cvs] [0be2c2a] object_nodes: Use the LLVM backend for modifier nodes.

Lukas Tönne noreply at git.blender.org
Thu Jun 23 13:47:56 CEST 2016


Commit: 0be2c2a89a28f3d22c2b150cd135274db32be51a
Author: Lukas Tönne
Date:   Thu Jun 23 13:43:25 2016 +0200
Branches: object_nodes
https://developer.blender.org/rB0be2c2a89a28f3d22c2b150cd135274db32be51a

Use the LLVM backend for modifier nodes.

This currently fails, because the actual mesh nodes are not yet implemented
in the LLVM backend.

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

M	source/blender/blenkernel/intern/DerivedMesh.c
M	source/blender/blenvm/BVM_api.h
M	source/blender/blenvm/intern/bvm_api.cc

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

diff --git a/source/blender/blenkernel/intern/DerivedMesh.c b/source/blender/blenkernel/intern/DerivedMesh.c
index db56c8d..7647394 100644
--- a/source/blender/blenkernel/intern/DerivedMesh.c
+++ b/source/blender/blenkernel/intern/DerivedMesh.c
@@ -1704,17 +1704,17 @@ static DerivedMesh *mesh_calc_modifier_nodes(Scene *UNUSED(scene), Object *ob, b
 	Mesh *me = ob->data;
 	DerivedMesh *dm, *result;
 	
-	struct BVMFunction *fn = BVM_gen_modifier_function_bvm(ntree, true);
+	struct BVMFunction *fn = BVM_gen_modifier_function_llvm(ntree, true);
 	if (fn) {
 		struct BVMEvalGlobals *globals = BVM_globals_create();
 		BVM_globals_add_nodetree_relations(globals, ntree);
 		
 		struct BVMEvalContext *context = BVM_context_create();
-		dm = BVM_eval_modifier_bvm(globals, context, fn, ob, me);
+		dm = BVM_eval_modifier_llvm(globals, context, fn, ob, me);
 		
 		BVM_context_free(context);
 		BVM_globals_free(globals);
-		BVM_function_bvm_release(fn);
+		BVM_function_llvm_release(fn);
 	}
 	
 	/* XXX this is stupid, but currently required because of
diff --git a/source/blender/blenvm/BVM_api.h b/source/blender/blenvm/BVM_api.h
index db83831..ee1bdcf 100644
--- a/source/blender/blenvm/BVM_api.h
+++ b/source/blender/blenvm/BVM_api.h
@@ -177,10 +177,15 @@ struct BVMFunction *BVM_gen_modifier_function_llvm(struct bNodeTree *btree, bool
 void BVM_debug_modifier_nodes(struct bNodeTree *btree, FILE *debug_file, const char *label, BVMDebugMode mode);
 
 struct DerivedMesh *BVM_eval_modifier_bvm(struct BVMEvalGlobals *globals,
-                                      struct BVMEvalContext *context,
-                                      struct BVMFunction *fn,
-                                      struct Object *ob,
-                                      struct Mesh *base_mesh);
+                                          struct BVMEvalContext *context,
+                                          struct BVMFunction *fn,
+                                          struct Object *ob,
+                                          struct Mesh *base_mesh);
+struct DerivedMesh *BVM_eval_modifier_llvm(struct BVMEvalGlobals *globals,
+                                           struct BVMEvalContext *context,
+                                           struct BVMFunction *fn,
+                                           struct Object *ob,
+                                           struct Mesh *base_mesh);
 
 /* ------------------------------------------------------------------------- */
 
diff --git a/source/blender/blenvm/intern/bvm_api.cc b/source/blender/blenvm/intern/bvm_api.cc
index 4e3eb14..32a51a4 100644
--- a/source/blender/blenvm/intern/bvm_api.cc
+++ b/source/blender/blenvm/intern/bvm_api.cc
@@ -756,12 +756,26 @@ void BVM_eval_texture_llvm(struct BVMEvalGlobals *_globals, struct BVMEvalContex
 
 /* ------------------------------------------------------------------------- */
 
+namespace blenvm {
+
+typedef void (*ModNodesFunc)(const struct EvalGlobals *globals,
+                             mesh_ptr *result,
+                             struct PointerRNA *object_ptr, struct PointerRNA *base_mesh_ptr);
+
+}
+
 struct BVMFunction *BVM_gen_modifier_function_bvm(struct bNodeTree *btree, bool use_cache)
 {
 	using namespace blenvm;
 	return gen_function_bvm(btree, use_cache, modifier_inputs, modifier_outputs);
 }
 
+struct BVMFunction *BVM_gen_modifier_function_llvm(struct bNodeTree *btree, bool use_cache)
+{
+	using namespace blenvm;
+	return gen_function_llvm(btree, use_cache, modifier_inputs, modifier_outputs);
+}
+
 void BVM_debug_modifier_nodes(struct bNodeTree *btree, FILE *debug_file, const char *label, BVMDebugMode mode)
 {
 	using namespace blenvm;
@@ -795,6 +809,39 @@ struct DerivedMesh *BVM_eval_modifier_bvm(struct BVMEvalGlobals *globals,
 	return dm;
 }
 
+struct DerivedMesh *BVM_eval_modifier_llvm(struct BVMEvalGlobals *_globals,
+                                           struct BVMEvalContext *UNUSED(ctx),
+                                           struct BVMFunction *fn,
+                                           struct Object *object,
+                                           struct Mesh *base_mesh)
+{
+	using namespace blenvm;
+	
+	EvalGlobals *globals = _GLOBALS(_globals);
+	if (globals == NULL)
+		globals = eval_globals_default();
+	
+	mesh_ptr result;
+	
+#ifdef WITH_LLVM
+	PointerRNA object_ptr, base_mesh_ptr;
+	RNA_id_pointer_create((ID *)object, &object_ptr);
+	RNA_id_pointer_create((ID *)base_mesh, &base_mesh_ptr);
+	
+	ModNodesFunc fp = (ModNodesFunc)_FUNC_LLVM(fn)->ptr();
+	
+	fp(globals, &result, &object_ptr, &base_mesh_ptr);
+#else
+	UNUSED_VARS(fn, globals, object, base_mesh);
+	result.set(CDDM_new(0, 0, 0, 0, 0));
+#endif
+	
+	DerivedMesh *dm = result.get();
+	/* destroy the pointer variable */
+	result.ptr().reset();
+	return dm;
+}
+
 /* ------------------------------------------------------------------------- */
 
 struct BVMFunction *BVM_gen_dupli_function_bvm(struct bNodeTree *btree, bool use_cache)




More information about the Bf-blender-cvs mailing list