[Bf-blender-cvs] [e4dea76] object_nodes: New CodeGenerator implementation for replacing the old BVM compiler.
Lukas Tönne
noreply at git.blender.org
Mon Jun 20 17:39:21 CEST 2016
Commit: e4dea76bddf59981779a3d98c5bdd8d1ec7a0d65
Author: Lukas Tönne
Date: Mon Jun 20 17:38:37 2016 +0200
Branches: object_nodes
https://developer.blender.org/rBe4dea76bddf59981779a3d98c5bdd8d1ec7a0d65
New CodeGenerator implementation for replacing the old BVM compiler.
===================================================================
M source/blender/blenvm/bvm/bvm_codegen.cc
M source/blender/blenvm/bvm/bvm_codegen.h
===================================================================
diff --git a/source/blender/blenvm/bvm/bvm_codegen.cc b/source/blender/blenvm/bvm/bvm_codegen.cc
index fb6fefa..efba057 100644
--- a/source/blender/blenvm/bvm/bvm_codegen.cc
+++ b/source/blender/blenvm/bvm/bvm_codegen.cc
@@ -40,6 +40,163 @@
namespace blenvm {
+Value::Value(StackIndex stack_index) :
+ m_stack_index(stack_index),
+ m_constant_value(NULL)
+{
+}
+
+Value::~Value()
+{
+ if (m_constant_value)
+ delete m_constant_value;
+}
+
+void Value::set_constant_value(const NodeConstant *value)
+{
+ if (m_constant_value)
+ delete m_constant_value;
+ m_constant_value = value->copy();
+}
+
+/* ------------------------------------------------------------------------- */
+
+BVMCodeGenerator::BVMCodeGenerator()
+{
+ m_stack_users.resize(BVM_STACK_SIZE, 0);
+}
+
+BVMCodeGenerator::~BVMCodeGenerator()
+{
+}
+
+ValueHandle BVMCodeGenerator::get_handle(const Value *value)
+{
+ return (ValueHandle)value;
+}
+
+void BVMCodeGenerator::finalize_function()
+{
+}
+
+void BVMCodeGenerator::debug_function(FILE *file)
+{
+}
+
+void BVMCodeGenerator::node_graph_begin(const string &name, const NodeGraph *graph, bool use_globals)
+{
+ /* storage for function arguments */
+ {
+ size_t num_inputs = graph->inputs.size();
+ for (int i = 0; i < num_inputs; ++i) {
+ const NodeGraph::Input *input = graph->get_input(i);
+ const TypeSpec *typespec = input->typedesc.get_typespec();
+ m_input_args.push_back(create_value(typespec));
+ }
+ }
+}
+
+void BVMCodeGenerator::node_graph_end()
+{
+}
+
+void BVMCodeGenerator::store_return_value(size_t output_index, const TypeSpec *UNUSED(typespec), ValueHandle handle)
+{
+ Value *value = m_value_map.at(handle);
+ m_output_args[output_index] = value;
+}
+
+ValueHandle BVMCodeGenerator::map_argument(size_t input_index, const TypeSpec *UNUSED(typespec))
+{
+ Value *arg = m_input_args[input_index];
+
+ ValueHandle handle = get_handle(arg);
+ bool ok = m_value_map.insert(HandleValueMap::value_type(handle, arg)).second;
+ BLI_assert(ok && "Could not insert value!");
+ UNUSED_VARS(ok);
+
+ return handle;
+}
+
+Value *BVMCodeGenerator::create_value(const TypeSpec *typespec)
+{
+ StackIndex stack_index = find_stack_index(typespec->size());
+ m_values.push_back(Value(stack_index));
+ Value *value = &m_values.back();
+
+ return value;
+}
+
+ValueHandle BVMCodeGenerator::alloc_node_value(const TypeSpec *typespec)
+{
+ Value *value = create_value(typespec);
+ ValueHandle handle = get_handle(value);
+
+ bool ok = m_value_map.insert(HandleValueMap::value_type(handle, value)).second;
+ BLI_assert(ok && "Could not insert value!");
+ UNUSED_VARS(ok);
+
+ return handle;
+}
+
+ValueHandle BVMCodeGenerator::create_constant(const TypeSpec *UNUSED(typespec), const NodeConstant *node_value)
+{
+ m_values.push_back(Value(BVM_STACK_INVALID));
+ Value *value = &m_values.back();
+ value->set_constant_value(node_value);
+ ValueHandle handle = get_handle(value);
+
+ bool ok = m_value_map.insert(HandleValueMap::value_type(handle, value)).second;
+ BLI_assert(ok && "Could not insert value!");
+ UNUSED_VARS(ok);
+
+ return handle;
+}
+
+void BVMCodeGenerator::eval_node(const NodeType *nodetype,
+ ArrayRef<ValueHandle> input_args,
+ ArrayRef<ValueHandle> output_args)
+{
+}
+
+StackIndex BVMCodeGenerator::find_stack_index(int size) const
+{
+ int unused = 0;
+
+ for (int i = 0; i < BVM_STACK_SIZE; ++i) {
+ if (m_stack_users[i] == 0) {
+ ++unused;
+ if (unused == size)
+ return i + 1 - size;
+ }
+ else
+ unused = 0;
+ }
+
+ // TODO better reporting ...
+ printf("ERROR: out of stack space");
+
+ return BVM_STACK_INVALID;
+}
+
+StackIndex BVMCodeGenerator::assign_stack_index(const TypeDesc &typedesc)
+{
+ const TypeSpec *typespec = typedesc.get_typespec();
+ int stack_size = EvalStack::stack_size(typespec->size());
+
+ StackIndex stack_offset = find_stack_index(stack_size);
+ for (int i = 0; i < stack_size; ++i) {
+ // TODO keep track of value users
+ m_stack_users[stack_offset + i] += 1;
+ }
+
+ return stack_offset;
+}
+
+
+/* ========================================================================= */
+
+
BVMCompilerBase::BVMCompilerBase()
{
stack_users.resize(BVM_STACK_SIZE, 0);
diff --git a/source/blender/blenvm/bvm/bvm_codegen.h b/source/blender/blenvm/bvm/bvm_codegen.h
index 114d178..b6fa88a 100644
--- a/source/blender/blenvm/bvm/bvm_codegen.h
+++ b/source/blender/blenvm/bvm/bvm_codegen.h
@@ -37,6 +37,7 @@
#include "MEM_guardedalloc.h"
+#include "compiler.h"
#include "node_graph.h"
#include "bvm_instruction_list.h"
@@ -51,6 +52,66 @@ struct NodeGraph;
struct NodeInstance;
struct TypeDesc;
+struct Value {
+ Value(StackIndex m_stack_index);
+ ~Value();
+
+ StackIndex stack_index() const { return m_stack_index; }
+
+ const NodeConstant *constant_value() const { return m_constant_value; }
+ void set_constant_value(const NodeConstant *value);
+
+private:
+ StackIndex m_stack_index;
+ NodeConstant *m_constant_value;
+};
+
+struct BVMCodeGenerator : public CodeGenerator {
+ typedef std::vector<Value> ValueStack;
+ typedef std::map<ValueHandle, Value*> HandleValueMap;
+ typedef std::vector<int> StackUsers;
+ typedef std::vector<Value*> Arguments;
+
+ BVMCodeGenerator();
+ ~BVMCodeGenerator();
+
+ void finalize_function();
+ void debug_function(FILE *file);
+
+ void node_graph_begin(const string &name, const NodeGraph *graph, bool use_globals);
+ void node_graph_end();
+
+ void store_return_value(size_t output_index, const TypeSpec *typespec, ValueHandle value);
+ ValueHandle map_argument(size_t input_index, const TypeSpec *typespec);
+
+ ValueHandle alloc_node_value(const TypeSpec *typespec);
+ ValueHandle create_constant(const TypeSpec *typespec, const NodeConstant *node_value);
+
+ void eval_node(const NodeType *nodetype,
+ ArrayRef<ValueHandle> input_args,
+ ArrayRef<ValueHandle> output_args);
+
+protected:
+ static ValueHandle get_handle(const Value *value);
+
+ StackIndex find_stack_index(int size) const;
+ StackIndex assign_stack_index(const TypeDesc &typedesc);
+ Value *create_value(const TypeSpec *typespec);
+
+private:
+ ValueStack m_values;
+ HandleValueMap m_value_map;
+ StackUsers m_stack_users;
+ Arguments m_input_args;
+ Arguments m_output_args;
+
+ InstructionList m_instructions;
+};
+
+
+/* ========================================================================= */
+
+
typedef std::map<ConstInputKey, StackIndex> InputIndexMap;
typedef std::map<ConstOutputKey, StackIndex> OutputIndexMap;
typedef std::map<ConstOutputKey, int> OutputUsersMap;
More information about the Bf-blender-cvs
mailing list