[Bf-blender-cvs] [4510849e3d8] soc-2019-embree-gpu: Add time limits for each nodes

MATILLAT Quentin noreply at git.blender.org
Thu Jul 11 15:07:04 CEST 2019


Commit: 4510849e3d8ddfd2eb167deaf9c0d0aff6754197
Author: MATILLAT Quentin
Date:   Wed Jul 10 17:37:16 2019 +0200
Branches: soc-2019-embree-gpu
https://developer.blender.org/rB4510849e3d8ddfd2eb167deaf9c0d0aff6754197

Add time limits for each nodes

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

M	intern/cycles/bvh/bvh2.cpp
M	intern/cycles/bvh/bvh2.h
M	intern/cycles/bvh/bvh_embree.cpp
M	intern/cycles/bvh/bvh_embree_converter.cpp
M	intern/cycles/bvh/bvh_embree_converter.h
M	intern/cycles/bvh/bvh_node.cpp
M	intern/cycles/bvh/bvh_node.h
M	intern/cycles/kernel/bvh/bvh_traversal.h

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

diff --git a/intern/cycles/bvh/bvh2.cpp b/intern/cycles/bvh/bvh2.cpp
index fbbcb9589f0..edec6a9aebe 100644
--- a/intern/cycles/bvh/bvh2.cpp
+++ b/intern/cycles/bvh/bvh2.cpp
@@ -76,6 +76,8 @@ void BVH2::pack_aligned_inner(const BVHStackEntry &e,
                     e1.node->bounds,
                     e0.encodeIdx(),
                     e1.encodeIdx(),
+                    e.node->time_from,
+                    e.node->time_to,
                     e0.node->visibility,
                     e1.node->visibility);
 }
@@ -85,6 +87,8 @@ void BVH2::pack_aligned_node(int idx,
                              const BoundBox &b1,
                              int c0,
                              int c1,
+                             float timeFrom,
+                             float timeTo,
                              uint visibility0,
                              uint visibility1)
 {
@@ -107,6 +111,9 @@ void BVH2::pack_aligned_node(int idx,
                 __float_as_int(b1.min.z),
                 __float_as_int(b0.max.z),
                 __float_as_int(b1.max.z)),
+      make_int4(__float_as_int(timeFrom),
+                __float_as_int(timeTo),
+                0, 0),
   };
 
   memcpy(&pack.nodes[idx], data, sizeof(int4) * BVH_NODE_SIZE);
@@ -209,6 +216,7 @@ void BVH2::pack_nodes(const BVHNode *root)
       pack_leaf(e, leaf);
     }
     else {
+      assert(e.node->num_children() == 2);
       /* inner node */
       int idx[2];
       for (int i = 0; i < 2; ++i) {
@@ -281,7 +289,7 @@ void BVH2::refit_node(int idx, bool leaf, BoundBox &bbox, uint &visibility)
           idx, aligned_space, aligned_space, bbox0, bbox1, c0, c1, visibility0, visibility1);
     }
     else {
-      pack_aligned_node(idx, bbox0, bbox1, c0, c1, visibility0, visibility1);
+      pack_aligned_node(idx, bbox0, bbox1, c0, c1, __int_as_float(data[4].x), __int_as_float(data[4].y), visibility0, visibility1);
     }
 
     bbox.grow(bbox0);
diff --git a/intern/cycles/bvh/bvh2.h b/intern/cycles/bvh/bvh2.h
index c6a4e6fa73a..08938a04bc1 100644
--- a/intern/cycles/bvh/bvh2.h
+++ b/intern/cycles/bvh/bvh2.h
@@ -34,7 +34,7 @@ class LeafNode;
 class Object;
 class Progress;
 
-#define BVH_NODE_SIZE 4
+#define BVH_NODE_SIZE (4+1)
 #define BVH_NODE_LEAF_SIZE 1
 #define BVH_UNALIGNED_NODE_SIZE 7
 
@@ -65,6 +65,8 @@ class BVH2 : public BVH {
                          const BoundBox &b1,
                          int c0,
                          int c1,
+                         float timeFrom,
+                         float timeTo,
                          uint visibility0,
                          uint visibility1);
 
diff --git a/intern/cycles/bvh/bvh_embree.cpp b/intern/cycles/bvh/bvh_embree.cpp
index 2fb216ad88c..2be512d38c8 100644
--- a/intern/cycles/bvh/bvh_embree.cpp
+++ b/intern/cycles/bvh/bvh_embree.cpp
@@ -816,6 +816,7 @@ void BVHEmbree::add_curves(Object *ob, int i)
   rtcAttachGeometryByID(scene, geom_id, i * 2 + 1);
   rtcReleaseGeometry(geom_id);
 }
+
 void BVHEmbree::pack_nodes(const BVHNode *r)
 {
   if(this->bvh_layout == BVH_LAYOUT_EMBREE_CONVERTED) {
@@ -970,6 +971,7 @@ void BVHEmbree::refit_nodes()
   }
   rtcCommitScene(scene);
 }
+
 CCL_NAMESPACE_END
 
 #endif /* WITH_EMBREE */
diff --git a/intern/cycles/bvh/bvh_embree_converter.cpp b/intern/cycles/bvh/bvh_embree_converter.cpp
index 77dbcdc6747..b9e2ca6954d 100644
--- a/intern/cycles/bvh/bvh_embree_converter.cpp
+++ b/intern/cycles/bvh/bvh_embree_converter.cpp
@@ -40,7 +40,7 @@ struct RangeInput {
 
 std::stack<LeafNode*> groupByRange(std::vector<RangeInput> &ids) {
     std::sort(ids.begin(), ids.end(), [](const RangeInput &lhs, const RangeInput &rhs) -> bool {
-        return lhs.id > rhs.id;
+        return lhs.id < rhs.id;
     });
     std::stack<LeafNode*> groups;
 
@@ -94,11 +94,10 @@ BVHEmbreeConverter::BVHEmbreeConverter(RTCScene scene, std::vector<Object *> obj
       objects(objects),
       params(params) {}
 
-
-template<typename Primitive>
-std::deque<BVHNode*> BVHEmbreeConverter::handleLeaf(const embree::BVH4::NodeRef &node, const BoundBox &) {
+template<>
+std::deque<BVHNode*> BVHEmbreeConverter::handleLeaf<embree::Triangle4i>(const embree::BVH4::NodeRef &node, const BoundBox &bb) {
     size_t nb;
-    Primitive *prims = reinterpret_cast<Primitive *>(node.leaf(nb));
+    embree::Triangle4i *prims = reinterpret_cast<embree::Triangle4i *>(node.leaf(nb));
     std::vector<RangeInput> ids; ids.reserve(nb * 4);
 
     for(size_t i = 0; i < nb; i++) {
@@ -111,32 +110,44 @@ std::deque<BVHNode*> BVHEmbreeConverter::handleLeaf(const embree::BVH4::NodeRef
             size_t prim_offset = reinterpret_cast<size_t>(g->getUserData());
 
             Object *obj = this->objects.at(geom_id / 2);
-            Mesh *m = obj->mesh;
-            BoundBox bb = BoundBox::empty;
-
-            const Mesh::Triangle t = m->get_triangle(prim_id);
-            const float3 *mesh_verts = m->verts.data();
-            const float3 *mesh_vert_steps = nullptr;
-            size_t motion_steps = 1;
-
-            if (m->has_motion_blur()) {
-                const Attribute *attr_motion_vertex = m->attributes.find(ATTR_STD_MOTION_VERTEX_POSITION);
-                if (attr_motion_vertex) {
-                    mesh_vert_steps = attr_motion_vertex->data_float3();
-                    motion_steps = m->motion_steps;
-                }
-            }
 
-            for (uint step = 0; step < motion_steps; ++step) {
-                float3 verts[3];
-                t.verts_for_step(mesh_verts, mesh_vert_steps, m->num_triangles(), motion_steps, step, verts);
+            /* TODO Compute local boundbox
+             * BoundBox bb = RTCBoundBoxToCCL(prims[i].linearBounds(s, embree::BBox1f(0, 1)).bounds());
+             */
 
+            ids.push_back(RangeInput(prim_offset + prim_id, obj->visibility, bb));
+        }
+    }
 
-              for (int i = 0; i < 3; i++) {
-                  bb.grow(verts[i]);
-              }
-            }
+    std::stack<LeafNode *> leafs = groupByRange(ids);
+    std::deque<BVHNode *> nodes;
 
+    while(!leafs.empty()) {
+        nodes.push_back(leafs.top());
+        leafs.pop();
+    }
+
+    return nodes;
+}
+
+template<>
+std::deque<BVHNode*> BVHEmbreeConverter::handleLeaf<embree::Triangle4v>(const embree::BVH4::NodeRef &node, const BoundBox &) {
+    size_t nb;
+    embree::Triangle4v *prims = reinterpret_cast<embree::Triangle4v *>(node.leaf(nb));
+    std::vector<RangeInput> ids; ids.reserve(nb * 4);
+
+    for(size_t i = 0; i < nb; i++) {
+        for(size_t j = 0; j < prims[i].size(); j++) {
+            const auto geom_id = prims[i].geomID(j);
+            const auto prim_id = prims[i].primID(j);
+
+            embree::Geometry *g = s->get(geom_id);
+
+            size_t prim_offset = reinterpret_cast<size_t>(g->getUserData());
+
+            Object *obj = this->objects.at(geom_id / 2);
+
+            BoundBox bb = RTCBoundBoxToCCL(prims[i].bounds());
             ids.push_back(RangeInput(prim_offset + prim_id, obj->visibility, bb));
         }
     }
@@ -157,23 +168,19 @@ std::deque<BVHNode*> BVHEmbreeConverter::handleLeaf<embree::InstancePrimitive>(c
     size_t nb;
     embree::InstancePrimitive *prims = reinterpret_cast<embree::InstancePrimitive *>(node.leaf(nb));
 
-    std::stack<LeafNode *> leafs;
+    std::deque<BVHNode *> leafs;
 
     for(size_t i = 0; i < nb; i++) {
         uint id = prims[i].instance->geomID / 2;
         Object *obj = objects.at(id);
-        // Better solution, but crash -> RTCBoundBoxToCCL(prims[i].instance->bounds(0));
+        /* TODO Better solution, but crash
+         * BoundBox bb = RTCBoundBoxToCCL(prims[i].instance->bounds(0));
+         */
         LeafNode *leafNode = new LeafNode(obj->bounds, obj->visibility, obj->pack_index, obj->pack_index + 1);
-        leafs.push(leafNode);
-    }
-
-    std::deque<BVHNode *> nodes;
-    while(!leafs.empty()) {
-        nodes.push_back(leafs.top());
-        leafs.pop();
+        leafs.push_back(leafNode);
     }
 
-    return nodes;
+    return leafs;
 }
 
 template<typename Primitive>
@@ -189,12 +196,14 @@ BVHNode* BVHEmbreeConverter::nodeEmbreeToCcl(embree::BVH4::NodeRef node, ccl::Bo
                 continue;
             }
 
-            if(ret->is_leaf() || ret->num_children()) {
+            /* If it's a leaf or a full node -> create a new parrent */
+            if(ret->is_leaf() || ret->num_children() == 4) {
                 ret = new InnerNode(bb, &ret, 1);
             }
 
             InnerNode *innerNode = dynamic_cast<InnerNode*>(ret);
             innerNode->children[innerNode->num_children_++] = nodes.front();
+            innerNode->bounds.grow(nodes.front()->bounds);
             nodes.pop_front();
 
             if(ret->num_children() == 4) {
@@ -318,6 +327,7 @@ BVHNode* BVHEmbreeConverter::getBVH4() {
 
 BVHNode* BVHEmbreeConverter::getBVH2() {
     BVHNode *root = this->getBVH4();
+    std::cout << root->getSubtreeSize(BVH_STAT_TIMELIMIT_NODE) << " times nodes" << std::endl;
     std::cout << "BVH4 SAH is " << root->computeSubtreeSAHCost(this->params) << std::endl;
     root = bvh_shrink(root);
     std::cout << "BVH2 SAH is " << root->computeSubtreeSAHCost(this->params) << std::endl;
diff --git a/intern/cycles/bvh/bvh_embree_converter.h b/intern/cycles/bvh/bvh_embree_converter.h
index 3b755c07d81..1406df5ee3c 100644
--- a/intern/cycles/bvh/bvh_embree_converter.h
+++ b/intern/cycles/bvh/bvh_embree_converter.h
@@ -34,6 +34,7 @@
 #include "embree/kernels/geometry/trianglev.h"
 #include "embree/kernels/geometry/trianglei.h"
 #include "embree/kernels/geometry/instance.h"
+#include "embree/kernels/geometry/curveNi.h"
 #include "bvh_node.h"
 
 CCL_NAMESPACE_BEGIN
diff --git a/intern/cycles/bvh/bvh_node.cpp b/intern/cycles/bvh/bvh_node.cpp
index 38b554acfbf..0e3db43ecb1 100644
--- a/intern/cycles/bvh/bvh_node.cpp
+++ b/intern/cycles/bvh/bvh_node.cpp
@@ -91,6 +91,10 @@ int BVHNode::getSubtreeSize(BVH_STAT stat) const
         cnt += 1;
       }
       return cnt;
+    case BVH_STAT_TIMELIMIT_NODE:
+      if(this->time_from != 0 || this->time_to != 1)
+          cnt = 1;
+      break;
     default:
       assert(0); /* unknown mode */
   }
@@ -118,7 +122,7 @@ float BVHNode::computeSubt

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list