[Bf-blender-cvs] [3f0a43db2d6] soc-2019-embree-gpu: Code refactor & Performance improvement

MATILLAT Quentin noreply at git.blender.org
Mon Jul 1 18:58:46 CEST 2019


Commit: 3f0a43db2d65a9f7550374ca3931172c2783d3f0
Author: MATILLAT Quentin
Date:   Mon Jul 1 18:57:41 2019 +0200
Branches: soc-2019-embree-gpu
https://developer.blender.org/rB3f0a43db2d65a9f7550374ca3931172c2783d3f0

Code refactor & Performance improvement

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

M	intern/cycles/bvh/CMakeLists.txt
M	intern/cycles/bvh/bvh_embree.cpp
A	intern/cycles/bvh/bvh_embree_converter.cpp
A	intern/cycles/bvh/bvh_embree_converter.h
M	intern/cycles/bvh/bvh_embree_gpu.cpp

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

diff --git a/intern/cycles/bvh/CMakeLists.txt b/intern/cycles/bvh/CMakeLists.txt
index 3952b307096..f85a484a194 100644
--- a/intern/cycles/bvh/CMakeLists.txt
+++ b/intern/cycles/bvh/CMakeLists.txt
@@ -19,6 +19,7 @@ set(SRC
   bvh_sort.cpp
   bvh_split.cpp
   bvh_unaligned.cpp
+  bvh_embree_converter.cpp
 )
 
 set(SRC_HEADERS
@@ -35,6 +36,7 @@ set(SRC_HEADERS
   bvh_sort.h
   bvh_split.h
   bvh_unaligned.h
+  bvh_embree_converter.h
 )
 
 set(LIB
diff --git a/intern/cycles/bvh/bvh_embree.cpp b/intern/cycles/bvh/bvh_embree.cpp
index 5519c746fd1..9e6f6a07294 100644
--- a/intern/cycles/bvh/bvh_embree.cpp
+++ b/intern/cycles/bvh/bvh_embree.cpp
@@ -35,9 +35,6 @@
 
 #ifdef WITH_EMBREE
 
-#include <deque>
-#include <stack>
-
 #  include <pmmintrin.h>
 #  include <xmmintrin.h>
 #  include <embree3/rtcore_geometry.h>
@@ -57,260 +54,11 @@
 #  include "util/util_foreach.h"
 #  include "util/util_logging.h"
 #  include "util/util_progress.h"
-
-#define TASKING_INTERNAL
-#define RTC_NAMESPACE_BEGIN
-#define RTC_NAMESPACE_OPEN
-#define RTC_NAMESPACE_END
-
-#include "embree/kernels/common/scene.h"
-#include "embree/kernels/bvh/bvh.h"
-#include "embree/kernels/geometry/trianglev.h"
-#include "embree/kernels/geometry/instance.h"
-#include "bvh_node.h"
+#  include "bvh_embree_converter.h"
 CCL_NAMESPACE_BEGIN
 
 #  define IS_HAIR(x) (x & 1)
 
-std::stack<LeafNode*> groupByRange(std::vector<uint> ids, BoundBox bb) {
-    std::sort(ids.begin(), ids.end());
-    std::stack<LeafNode*> groups;
-
-    for(uint id : ids) {
-        if(!groups.empty() && groups.top()->hi == id) {
-            groups.top()->hi = id + 1;
-        } else {
-            groups.push(new LeafNode(bb, 4294967295, id, id + 1));
-        }
-    }
-
-    return groups;
-}
-
-
-ccl::BoundBox RTCBoundBoxToCCL(const embree::BBox3fa &bound) {
-    return ccl::BoundBox(
-                make_float3(bound.lower.x, bound.lower.y, bound.lower.z),
-                make_float3(bound.upper.x, bound.upper.y, bound.upper.z));
-
-}
-
-template<typename Primitive>
-BVHNode* nodeEmbreeToCcl(embree::BVH4::NodeRef node, ccl::BoundBox bb, embree::Scene *s, vector<Object*> objects) {
-    if(node.isLeaf()) {
-        size_t nb;
-        Primitive *prims = reinterpret_cast<Primitive *>(node.leaf(nb));
-
-        std::vector<uint> 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());
-
-                ids.push_back(prim_offset + prim_id);
-            }
-        }
-
-        if(ids.empty()) return new LeafNode(BoundBox::empty, 0, 0, 0);
-
-        BVHNode *ret = nullptr;
-        std::stack<LeafNode *> leafs = groupByRange(ids, bb);
-        std::deque<BVHNode *> nodes;
-
-        while(!leafs.empty()) {
-            nodes.push_back(leafs.top());
-            leafs.pop();
-        }
-
-        while(!nodes.empty()) {
-            if(ret == nullptr) {
-                ret = nodes.front();
-                nodes.pop_front();
-                continue;
-            }
-
-            if(ret->is_leaf() || ret->num_children()) {
-                ret = new InnerNode(bb, &ret, 1);
-            }
-
-            InnerNode *innerNode = dynamic_cast<InnerNode*>(ret);
-            innerNode->children[innerNode->num_children_++] = nodes.front();
-            nodes.pop_front();
-
-            if(ret->num_children() == 4) {
-                nodes.push_back(ret);
-                ret = nullptr;
-            }
-        }
-
-        return ret;
-    } else {
-        InnerNode *ret = nullptr;
-
-        if(node.isAlignedNode()) {
-            embree::BVH4::AlignedNode *anode = node.alignedNode();
-
-            BVHNode *children[4];
-            for(uint i = 0; i < 4; i++) {
-                    children[i] = nodeEmbreeToCcl<Primitive>(
-                                anode->children[i],
-                                RTCBoundBoxToCCL(anode->bounds(i)),
-                                s,
-                                objects);
-            }
-
-            ret = new InnerNode(
-                        bb,
-                        children,
-                        4);
-        } else {
-            std::cout << "Unknown node" << std::endl;
-        }
-
-        return ret;
-    }
-}
-
-template<>
-BVHNode* nodeEmbreeToCcl<embree::InstancePrimitive>(embree::BVH4::NodeRef node, ccl::BoundBox bb, embree::Scene *s, vector<Object*> objects) {
-    if(node.isLeaf()) {
-        size_t nb;
-        embree::InstancePrimitive *prims = reinterpret_cast<embree::InstancePrimitive *>(node.leaf(nb));
-
-        std::stack<LeafNode *> leafs;
-
-        for(size_t i = 0; i < nb; i++) {
-            int id = prims[i].instance->geomID;
-            // BoundBox bb(make_float3(-2, -2, -2), make_float3(4, 4, 4)); // RTCBoundBoxToCCL(prims[i].instance->bounds(0));
-            // BoundBox bb = RTCBoundBoxToCCL(prims[i].instance->object->bounds.bounds());
-            // BoundBox bb = RTCBoundBoxToCCL(prims[i].instance->linearBounds(0, embree::BBox1f(0, 1)).bounds());
-            // embree::AffineSpace3fa loc2World = prims[i].instance->getLocal2World();
-
-            LeafNode *leafNode = new LeafNode(objects.at(id)->bounds, 4294967295, id, id + 1);
-            leafs.push(leafNode);
-
-            print_float3("MIN", bb.min);
-            print_float3("MAX", bb.max);
-        }
-
-        std::deque<BVHNode *> nodes;
-        BVHNode *ret = nullptr;
-        while(!leafs.empty()) {
-            nodes.push_back(leafs.top());
-            leafs.pop();
-        }
-
-        while(!nodes.empty()) {
-            if(ret == nullptr) {
-                ret = nodes.front();
-                nodes.pop_front();
-                continue;
-            }
-
-            if(ret->is_leaf() || ret->num_children()) {
-                ret = new InnerNode(bb, &ret, 1);
-            }
-
-            InnerNode *innerNode = dynamic_cast<InnerNode*>(ret);
-            innerNode->children[innerNode->num_children_++] = nodes.front();
-            nodes.pop_front();
-
-            if(ret->num_children() == 4) {
-                nodes.push_back(ret);
-                ret = nullptr;
-            }
-        }
-
-        return ret;
-    } else {
-        InnerNode *ret = nullptr;
-
-        if(node.isAlignedNode()) {
-            embree::BVH4::AlignedNode *anode = node.alignedNode();
-
-            BVHNode *children[4];
-            for(uint i = 0; i < 4; i++) {
-                    children[i] = nodeEmbreeToCcl<embree::InstancePrimitive>(
-                                anode->children[i],
-                                RTCBoundBoxToCCL(anode->bounds(i)),
-                                s,
-                                objects);
-            }
-
-            ret = new InnerNode(
-                        bb,
-                        children,
-                        4);
-        } else {
-            std::cout << "Unknown node" << std::endl;
-        }
-
-        return ret;
-    }
-}
-
-BVHNode* print_bvhInfo(RTCScene scene, vector<Object *> objects) {
-    embree::Scene *s = (embree::Scene *)scene;
-
-    std::cout << "<- Accel used ->" << std::endl;
-    std::vector<BVHNode *> nodes;
-    BoundBox bb = BoundBox::empty;
-    for (embree::Accel *a : s->accels) {
-        std::cout << "Accel " << a->intersectors.intersector1.name << std::endl;
-        embree::AccelData *ad = a->intersectors.ptr;
-        switch (ad->type) {
-        case embree::AccelData::TY_BVH4: {
-            embree::BVH4 *bvh = dynamic_cast<embree::BVHN<4> *>(ad);
-            std::cout << "Prim type -> " << bvh->primTy->name() << std::endl;
-
-            if(bvh->primTy == &embree::Triangle4v::type) {
-                embree::BVH4::NodeRef root = bvh->root;
-                BVHNode *rootNode = nodeEmbreeToCcl<embree::Triangle4v>(root, RTCBoundBoxToCCL(bvh->bounds.bounds()), s, objects);
-                bb.grow(rootNode->bounds);
-                nodes.push_back(rootNode);
-            } else if(bvh->primTy == &embree::InstancePrimitive::type) {
-                embree::BVH4::NodeRef root = bvh->root;
-                BVHNode *rootNode = nodeEmbreeToCcl<embree::InstancePrimitive>(root, RTCBoundBoxToCCL(bvh->bounds.bounds()), s, objects);
-                bb.grow(rootNode->bounds);
-                nodes.push_back(rootNode);
-            } else {
-
-            }
-
-        } break;
-        default:
-            std::cout << "[EMBREE - BVH] Unknown type " << ad->type << std::endl;
-            break;
-        }
-    }
-    std::cout << "[DONE]" << std::endl;
-
-    if(nodes.size() == 1)
-        return nodes.front();
-
-    return new InnerNode(bb, nodes.data(), nodes.size());
-}
-
-BVHNode *bvh_shrink(BVHNode *root) {
-    if(root->num_children() <= 2) return root;
-
-    InnerNode *node = dynamic_cast<InnerNode*>(root);
-
-    node->children[0] = new InnerNode(root->bounds, bvh_shrink(node->children[0]), bvh_shrink(node->children[1]));
-    if(root->num_children() == 3) {
-        node->children[1] = bvh_shrink(node->children[2]);
-    } else {
-        node->children[1] = new InnerNode(root->bounds, bvh_shrink(node->children[2]), bvh_shrink(node->children[3]));
-    }
-    node->num_children_ = 2;
-    return node;
-}
-
 
 /* This gets called by Embree at every valid ray/object intersection.
  * Things like recording subsurface or shadow hits for later evaluation
@@ -747,11 +495,8 @@ void BVHEmbree::build(Progress &progress, Stats *stats_)
 
   progress.set_substatus("Packing geometry");
   if(this->bvh_layout == BVH_LAYOUT_EMBREE_CONVERTED) {
-    BVHNode *root = print_bvhInfo(scene, objects);
-    std::cout << "BVH4 SAH is " << root->computeSubtreeSAHCost(this->params) << std::endl;
-    root = bvh_shrink(root);
-    pack_nodes(root);
-    std::cout << "BVH2 SAH is " << root->computeSubtreeSAHCost(this->params) << std::endl;
+    BVHEmbreeConverter conv(scene, objects, this->params);
+    pack_nodes(conv.getBVH2());
   } else {
     pack_nodes(NULL);
   }
diff --git a/i

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list