[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