[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