[Bf-blender-cvs] [1313440] object_nodes: Debug representation of generated bvm code.

Lukas Tönne noreply at git.blender.org
Sun Jan 3 23:59:43 CET 2016


Commit: 1313440c59d734a4c81ecb7c2cb97398ef4f9e91
Author: Lukas Tönne
Date:   Sun Jan 3 19:01:08 2016 +0100
Branches: object_nodes
https://developer.blender.org/rB1313440c59d734a4c81ecb7c2cb97398ef4f9e91

Debug representation of generated bvm code.

A specialized compiler variant is added that turns generated code
into a graphviz diagram of the instruction lists.

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

M	source/blender/blenvm/BVM_api.h
M	source/blender/blenvm/bvm/bvm_opcode.h
M	source/blender/blenvm/compile/CMakeLists.txt
M	source/blender/blenvm/compile/bvm_codegen.h
A	source/blender/blenvm/compile/bvm_codegen_debug.cc
M	source/blender/blenvm/intern/bvm_api.cc
M	source/blender/blenvm/util/bvm_util_debug.h
M	source/blender/makesrna/intern/rna_nodetree.c
M	source/blender/makesrna/intern/rna_object_api.c
M	source/blender/makesrna/intern/rna_texture_api.c

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

diff --git a/source/blender/blenvm/BVM_api.h b/source/blender/blenvm/BVM_api.h
index ccc25f6..bcd82db 100644
--- a/source/blender/blenvm/BVM_api.h
+++ b/source/blender/blenvm/BVM_api.h
@@ -115,13 +115,19 @@ int BVM_get_id_key(struct ID *id);
 struct BVMEvalContext *BVM_context_create(void);
 void BVM_context_free(struct BVMEvalContext *context);
 
+typedef enum BVMDebugMode {
+	BVM_DEBUG_NODES,
+	BVM_DEBUG_NODES_UNOPTIMIZED,
+	BVM_DEBUG_CODEGEN,
+} BVMDebugMode;
+
 /* ------------------------------------------------------------------------- */
 
 struct Object;
 struct EffectedPoint;
 
 struct BVMFunction *BVM_gen_forcefield_function(struct bNodeTree *btree);
-void BVM_debug_forcefield_nodes(struct bNodeTree *btree, FILE *debug_file, bool finalize);
+void BVM_debug_forcefield_nodes(struct bNodeTree *btree, FILE *debug_file, const char *label, BVMDebugMode mode);
 
 void BVM_eval_forcefield(struct BVMEvalGlobals *globals, struct BVMEvalContext *context, struct BVMFunction *fn,
                          struct Object *effob, const struct EffectedPoint *point, float force[3], float impulse[3]);
@@ -132,7 +138,7 @@ struct Tex;
 struct TexResult;
 
 struct BVMFunction *BVM_gen_texture_function(struct bNodeTree *btree);
-void BVM_debug_texture_nodes(struct bNodeTree *btree, FILE *debug_file, bool finalize);
+void BVM_debug_texture_nodes(struct bNodeTree *btree, FILE *debug_file, const char *label, BVMDebugMode mode);
 
 void BVM_eval_texture(struct BVMEvalContext *context, struct BVMFunction *fn,
                       struct TexResult *target,
@@ -145,7 +151,7 @@ struct DerivedMesh;
 struct Mesh;
 
 struct BVMFunction *BVM_gen_modifier_function(struct bNodeTree *btree);
-void BVM_debug_modifier_nodes(struct bNodeTree *btree, FILE *debug_file, bool finalize);
+void BVM_debug_modifier_nodes(struct bNodeTree *btree, FILE *debug_file, const char *label, BVMDebugMode mode);
 
 struct DerivedMesh *BVM_eval_modifier(struct BVMEvalGlobals *globals,
                                       struct BVMEvalContext *context,
@@ -158,7 +164,7 @@ struct DerivedMesh *BVM_eval_modifier(struct BVMEvalGlobals *globals,
 struct DupliContainer;
 
 struct BVMFunction *BVM_gen_dupli_function(struct bNodeTree *btree);
-void BVM_debug_dupli_nodes(struct bNodeTree *btree, FILE *debug_file, bool finalize);
+void BVM_debug_dupli_nodes(struct bNodeTree *btree, FILE *debug_file, const char *label, BVMDebugMode mode);
 
 void BVM_eval_dupli(struct BVMEvalGlobals *globals,
                     struct BVMEvalContext *context,
diff --git a/source/blender/blenvm/bvm/bvm_opcode.h b/source/blender/blenvm/bvm/bvm_opcode.h
index 200c8ce..cf9de60 100644
--- a/source/blender/blenvm/bvm/bvm_opcode.h
+++ b/source/blender/blenvm/bvm/bvm_opcode.h
@@ -4,16 +4,16 @@
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
  * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
+ * of the License) \ or (at your option) any later version.
  *
- * This program is distributed in the hope that it will be useful,
+ * This program is distributed in the hope that it will be useful) \
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
  *
  * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * along with this program; if not) \ write to the Free Software Foundation) \
+ * Inc.) \ 51 Franklin Street) \ Fifth Floor) \ Boston) \ MA 02110-1301) \ USA.
  *
  * The Original Code is Copyright (C) Blender Foundation.
  * All rights reserved.
@@ -32,125 +32,151 @@
  *  \ingroup bvm
  */
 
+extern "C" {
+#include "BLI_utildefines.h"
+}
+
 namespace bvm {
 
+/* Macro to handle all opcodes.
+ * Expects DEF_OPCODE to be defined locally for this purpose.
+ */
+/*************************************/
+#define BVM_DEFINE_OPCODES \
+	DEF_OPCODE(NOOP) \
+	DEF_OPCODE(VALUE_FLOAT) \
+	DEF_OPCODE(VALUE_FLOAT3) \
+	DEF_OPCODE(VALUE_FLOAT4) \
+	DEF_OPCODE(VALUE_INT) \
+	DEF_OPCODE(VALUE_MATRIX44) \
+	DEF_OPCODE(VALUE_STRING) \
+	DEF_OPCODE(VALUE_POINTER) \
+	DEF_OPCODE(VALUE_MESH) \
+	DEF_OPCODE(VALUE_DUPLIS) \
+	\
+	DEF_OPCODE(FLOAT_TO_INT) \
+	DEF_OPCODE(INT_TO_FLOAT) \
+	DEF_OPCODE(SET_FLOAT3) \
+	DEF_OPCODE(GET_ELEM_FLOAT3) \
+	DEF_OPCODE(SET_FLOAT4) \
+	DEF_OPCODE(GET_ELEM_FLOAT4) \
+	DEF_OPCODE(MATRIX44_TO_LOC) \
+	DEF_OPCODE(MATRIX44_TO_EULER) \
+	DEF_OPCODE(MATRIX44_TO_AXISANGLE) \
+	DEF_OPCODE(MATRIX44_TO_SCALE) \
+	DEF_OPCODE(LOC_TO_MATRIX44) \
+	DEF_OPCODE(EULER_TO_MATRIX44) \
+	DEF_OPCODE(AXISANGLE_TO_MATRIX44) \
+	DEF_OPCODE(SCALE_TO_MATRIX44) \
+	\
+	DEF_OPCODE(INIT_MESH_PTR) \
+	DEF_OPCODE(RELEASE_MESH_PTR) \
+	DEF_OPCODE(INIT_DUPLIS_PTR) \
+	DEF_OPCODE(RELEASE_DUPLIS_PTR) \
+	\
+	DEF_OPCODE(ADD_FLOAT) \
+	DEF_OPCODE(SUB_FLOAT) \
+	DEF_OPCODE(MUL_FLOAT) \
+	DEF_OPCODE(DIV_FLOAT) \
+	DEF_OPCODE(SINE) \
+	DEF_OPCODE(COSINE) \
+	DEF_OPCODE(TANGENT) \
+	DEF_OPCODE(ARCSINE) \
+	DEF_OPCODE(ARCCOSINE) \
+	DEF_OPCODE(ARCTANGENT) \
+	DEF_OPCODE(POWER) \
+	DEF_OPCODE(LOGARITHM) \
+	DEF_OPCODE(MINIMUM) \
+	DEF_OPCODE(MAXIMUM) \
+	DEF_OPCODE(ROUND) \
+	DEF_OPCODE(LESS_THAN) \
+	DEF_OPCODE(GREATER_THAN) \
+	DEF_OPCODE(MODULO) \
+	DEF_OPCODE(ABSOLUTE) \
+	DEF_OPCODE(CLAMP) \
+	DEF_OPCODE(SQRT) \
+	\
+	DEF_OPCODE(ADD_FLOAT3) \
+	DEF_OPCODE(SUB_FLOAT3) \
+	DEF_OPCODE(MUL_FLOAT3) \
+	DEF_OPCODE(DIV_FLOAT3) \
+	DEF_OPCODE(MUL_FLOAT3_FLOAT) \
+	DEF_OPCODE(DIV_FLOAT3_FLOAT) \
+	DEF_OPCODE(AVERAGE_FLOAT3) \
+	DEF_OPCODE(DOT_FLOAT3) \
+	DEF_OPCODE(CROSS_FLOAT3) \
+	DEF_OPCODE(NORMALIZE_FLOAT3) \
+	DEF_OPCODE(LENGTH_FLOAT3) \
+	\
+	DEF_OPCODE(ADD_MATRIX44) \
+	DEF_OPCODE(SUB_MATRIX44) \
+	DEF_OPCODE(MUL_MATRIX44) \
+	DEF_OPCODE(MUL_MATRIX44_FLOAT) \
+	DEF_OPCODE(DIV_MATRIX44_FLOAT) \
+	DEF_OPCODE(NEGATE_MATRIX44) \
+	DEF_OPCODE(TRANSPOSE_MATRIX44) \
+	DEF_OPCODE(INVERT_MATRIX44) \
+	DEF_OPCODE(ADJOINT_MATRIX44) \
+	DEF_OPCODE(DETERMINANT_MATRIX44) \
+	\
+	DEF_OPCODE(MUL_MATRIX44_FLOAT3) \
+	DEF_OPCODE(MUL_MATRIX44_FLOAT4) \
+	\
+	DEF_OPCODE(MIX_RGB) \
+	\
+	DEF_OPCODE(INT_TO_RANDOM) \
+	DEF_OPCODE(FLOAT_TO_RANDOM) \
+	\
+	DEF_OPCODE(TEX_PROC_VORONOI) \
+	DEF_OPCODE(TEX_PROC_MAGIC) \
+	DEF_OPCODE(TEX_PROC_MARBLE) \
+	DEF_OPCODE(TEX_PROC_CLOUDS) \
+	DEF_OPCODE(TEX_PROC_WOOD) \
+	DEF_OPCODE(TEX_PROC_MUSGRAVE) \
+	DEF_OPCODE(TEX_PROC_STUCCI) \
+	DEF_OPCODE(TEX_PROC_DISTNOISE) \
+	\
+	DEF_OPCODE(OBJECT_LOOKUP) \
+	DEF_OPCODE(OBJECT_TRANSFORM) \
+	\
+	DEF_OPCODE(EFFECTOR_TRANSFORM) \
+	DEF_OPCODE(EFFECTOR_CLOSEST_POINT) \
+	\
+	DEF_OPCODE(MESH_LOAD) \
+	DEF_OPCODE(MESH_COMBINE) \
+	DEF_OPCODE(MESH_ARRAY) \
+	DEF_OPCODE(MESH_DISPLACE) \
+	DEF_OPCODE(MESH_BOOLEAN) \
+	\
+	DEF_OPCODE(CURVE_PATH) \
+	\
+	DEF_OPCODE(MAKE_DUPLI) \
+	DEF_OPCODE(DUPLIS_COMBINE) \
+	\
+	DEF_OPCODE(END)
+/*************************************/
+
+
+/* Define the main enum for opcodes */
+#define DEF_OPCODE(op) \
+	OP_##op,
 enum OpCode {
-	OP_NOOP = 0,
-	OP_VALUE_FLOAT,
-	OP_VALUE_FLOAT3,
-	OP_VALUE_FLOAT4,
-	OP_VALUE_INT,
-	OP_VALUE_MATRIX44,
-	OP_VALUE_STRING,
-	OP_VALUE_POINTER,
-	OP_VALUE_MESH,
-	OP_VALUE_DUPLIS,
-	
-	OP_FLOAT_TO_INT,
-	OP_INT_TO_FLOAT,
-	OP_SET_FLOAT3,
-	OP_GET_ELEM_FLOAT3,
-	OP_SET_FLOAT4,
-	OP_GET_ELEM_FLOAT4,
-	OP_MATRIX44_TO_LOC,
-	OP_MATRIX44_TO_EULER,
-	OP_MATRIX44_TO_AXISANGLE,
-	OP_MATRIX44_TO_SCALE,
-	OP_LOC_TO_MATRIX44,
-	OP_EULER_TO_MATRIX44,
-	OP_AXISANGLE_TO_MATRIX44,
-	OP_SCALE_TO_MATRIX44,
-	
-	OP_INIT_MESH_PTR,
-	OP_RELEASE_MESH_PTR,
-	OP_INIT_DUPLIS_PTR,
-	OP_RELEASE_DUPLIS_PTR,
-	
-	OP_ADD_FLOAT,
-	OP_SUB_FLOAT,
-	OP_MUL_FLOAT,
-	OP_DIV_FLOAT,
-	OP_SINE,
-	OP_COSINE,
-	OP_TANGENT,
-	OP_ARCSINE,
-	OP_ARCCOSINE,
-	OP_ARCTANGENT,
-	OP_POWER,
-	OP_LOGARITHM,
-	OP_MINIMUM,
-	OP_MAXIMUM,
-	OP_ROUND,
-	OP_LESS_THAN,
-	OP_GREATER_THAN,
-	OP_MODULO,
-	OP_ABSOLUTE,
-	OP_CLAMP,
-	OP_SQRT,
-	
-	OP_ADD_FLOAT3,
-	OP_SUB_FLOAT3,
-	OP_MUL_FLOAT3,
-	OP_DIV_FLOAT3,
-	OP_MUL_FLOAT3_FLOAT,
-	OP_DIV_FLOAT3_FLOAT,
-	OP_AVERAGE_FLOAT3,
-	OP_DOT_FLOAT3,
-	OP_CROSS_FLOAT3,
-	OP_NORMALIZE_FLOAT3,
-	OP_LENGTH_FLOAT3,
-	
-	OP_ADD_MATRIX44,
-	OP_SUB_MATRIX44,
-	OP_MUL_MATRIX44,
-	OP_MUL_MATRIX44_FLOAT,
-	OP_DIV_MATRIX44_FLOAT,
-	OP_NEGATE_MATRIX44,
-	OP_TRANSPOSE_MATRIX44,
-	OP_INVERT_MATRIX44,
-	OP_ADJOINT_MATRIX44,
-	OP_DETERMINANT_MATRIX44,
-	
-	OP_MUL_MATRIX44_FLOAT3,
-	OP_MUL_MATRIX44_FLOAT4,
-	
-	OP_MIX_RGB,
-	
-	OP_INT_TO_RANDOM,
-	OP_FLOAT_TO_RANDOM,
-	
-	OP_TEX_PROC_VORONOI,
-	OP_TEX_PROC_MAGIC,
-	OP_TEX_PROC_MARBLE,
-	OP_TEX_PROC_CLOUDS,
-	OP_TEX_PROC_WOOD,
-	OP_TEX_PROC_MUSGRAVE,
-	OP_TEX_PROC_STUCCI,
-	OP_TEX_PROC_DISTNOISE,
-	
-	OP_OBJECT_LOOKUP,
-	OP_OBJECT_TRANSFORM,
-	
-	OP_EFFECTOR_TRANSFORM,
-	OP_EFFECTOR_CLOSEST_POINT,
-	
-	OP_MESH_LOAD,
-	OP_MESH_COMBINE,
-	OP_MESH_ARRAY,
-	OP_MESH_DISPLACE,
-	OP_MESH_BOOLEAN,
-	
-	OP_CURVE_PATH,
-	
-	OP_MAKE_DUPLI,
-	OP_DUPLIS_COMBINE,
-	
-	OP_END,
-	
-//	OP_JUMP,
-//	OP_JUMP_IF_ZERO,
-//	OP_JUMP_IF_ONE,
+	BVM_DEFINE_OPCODES
 };
+#undef DEF_OPCODE
+
+
+/* define a name string for each opcode */
+#define DEF_OPCODE(op) \
+	case OP_##op: return STRINGIFY(op);
+BLI_INLINE const char *opcode_name(OpCode op)
+{
+	switch (op) {
+		BVM_DEFINE_OPCODES
+		default: return "";
+	}
+}
+#undef DEF_OPCODE
 
 } /* namespace bvm */
 
diff --git a/source/blender/blenvm/compile/CMakeLists.txt b/source/blender/blenvm/compile/CMakeLists.txt
index 94b58c2..c315b98 100644
--- a/source/blender/blenvm/compile/CMakeLists.txt
+++ b/source/blender/blenvm/compile/CMakeLists.txt
@@ -40,6 +40,7 @@ set(INC_SYS
 
 set(SRC
 	bvm_codegen.cc
+	bvm_codegen_debug.cc
 	bvm_codegen.h
 	bvm_nodegraph.cc
 	bvm_nodegraph.h
diff --git a/source/blender/blenvm/compile/bvm_codegen.h b/source/blender/blenvm/compile/bvm_codegen.h
index 0aeca53..3dd2097 100644
--- a/source/blender/blenvm/compile/bvm_codegen.h
+++ b/source/blender/blenvm/compile/bvm_codegen.h
@@ -134,6 +134,37 @@ private:
 	Function *fn;
 };
 
+struct DebugGraphvizCompiler : public Compiler {
+	DebugGraphvizCompiler();
+	~DebugGraphvizCompiler();
+	
+	void

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list