[Bf-blender-cvs] [b11e093bd68] soc-2019-embree-gpu: Cycles: Patch embree version
MATILLAT Quentin
noreply at git.blender.org
Mon Aug 19 18:37:08 CEST 2019
Commit: b11e093bd6821d6835f0d776d3c591995d695408
Author: MATILLAT Quentin
Date: Sun Aug 18 16:10:54 2019 +0200
Branches: soc-2019-embree-gpu
https://developer.blender.org/rBb11e093bd6821d6835f0d776d3c591995d695408
Cycles: Patch embree version
===================================================================
M build_files/build_environment/install_deps.sh
A build_files/build_environment/patches/embree.diff
===================================================================
diff --git a/build_files/build_environment/install_deps.sh b/build_files/build_environment/install_deps.sh
index c54af829b38..5daef33fa7c 100755
--- a/build_files/build_environment/install_deps.sh
+++ b/build_files/build_environment/install_deps.sh
@@ -2477,7 +2477,7 @@ compile_Embree() {
fi
# To be changed each time we make edits that would modify the compiled results!
- embree_magic=9
+ embree_magic=10
_init_embree
# Clean install if needed!
@@ -2512,6 +2512,9 @@ compile_Embree() {
git reset --hard
fi
+ INFO "Applying patch on to of Embree sources"
+ git apply $SCRIPT_DIR/patches/embree.diff
+
# Always refresh the whole build!
if [ -d build ]; then
rm -rf build
diff --git a/build_files/build_environment/patches/embree.diff b/build_files/build_environment/patches/embree.diff
new file mode 100644
index 00000000000..3ca9b523f84
--- /dev/null
+++ b/build_files/build_environment/patches/embree.diff
@@ -0,0 +1,402 @@
+From 4a3ec5e090fa208eef6900bd9217b93e62111168 Mon Sep 17 00:00:00 2001
+From: MATILLAT Quentin <qmatillat at gmail.com>
+Date: Sun, 18 Aug 2019 15:29:34 +0200
+Subject: [PATCH] Add ability to export curve from BVH
+
+---
+ include/embree3/rtcore_builder.h | 22 +++
+ include/embree3/rtcore_common.h | 7 +
+ kernels/bvh/bvh_builder_hair.cpp | 3 +-
+ kernels/common/rtcore_builder.cpp | 297 ++++++++++++++++++++++--------
+ 4 files changed, 251 insertions(+), 78 deletions(-)
+
+diff --git a/include/embree3/rtcore_builder.h b/include/embree3/rtcore_builder.h
+index af84035b0..77e754f7e 100644
+--- a/include/embree3/rtcore_builder.h
++++ b/include/embree3/rtcore_builder.h
+@@ -131,6 +131,28 @@ RTC_API void rtcRetainBVH(RTCBVH bvh);
+ /* Releases the BVH (decrements reference count). */
+ RTC_API void rtcReleaseBVH(RTCBVH bvh);
+
++struct BVHPrimitive {
++ unsigned int geomID;
++ unsigned int primID;
++};
++
++struct RTCBVHExtractFunction
++{
++ // Leaf creator function
++ void* (*createLeaf) (unsigned int nbPrim, const BVHPrimitive prims[], void *userData);
++ void* (*createInstance) (unsigned int nbPrim, const unsigned int geomID[], void *userData);
++ void* (*createCurve) (unsigned int nbPrim, const BVHPrimitive prims[], void *userData);
++
++ // InnerNode creator function
++ void* (*createInnerNode) (unsigned int nbChild, void* children[], void *userData);
++
++ void (*setAlignedBounds) (void *node, const RTCBounds &bounds, void *userData);
++ void (*setLinearBounds) (void *node, const RTCLinearBounds &lbounds, void *userData);
++ void (*setUnalignedBounds) (void *node, const RTCAffineSpace &affSpace, void *userData);
++};
++
++RTC_API void *rtcExtractBVH(RTCScene hscene, RTCBVHExtractFunction args, void *userData);
++
+ #if defined(__cplusplus)
+ }
+ #endif
+diff --git a/include/embree3/rtcore_common.h b/include/embree3/rtcore_common.h
+index 29dfcba11..7eb21c28c 100644
+--- a/include/embree3/rtcore_common.h
++++ b/include/embree3/rtcore_common.h
+@@ -191,6 +191,13 @@ struct RTC_ALIGN(16) RTCLinearBounds
+ struct RTCBounds bounds1;
+ };
+
++/* AffineSpace representation */
++struct RTC_ALIGN(16) RTCAffineSpace
++{
++ float linear[3*3];
++ float affine[3];
++};
++
+ /* Intersection context flags */
+ enum RTCIntersectContextFlags
+ {
+diff --git a/kernels/bvh/bvh_builder_hair.cpp b/kernels/bvh/bvh_builder_hair.cpp
+index 14273787f..cad238123 100644
+--- a/kernels/bvh/bvh_builder_hair.cpp
++++ b/kernels/bvh/bvh_builder_hair.cpp
+@@ -135,8 +135,9 @@ namespace embree
+ #if defined(__AVX__)
+ Builder* BVH8Curve8vBuilder_OBB_New (void* bvh, Scene* scene, size_t mode) { return new BVHNHairBuilderSAH<8,Curve8v,Line8i>((BVH8*)bvh,scene); }
+ Builder* BVH4Curve8iBuilder_OBB_New (void* bvh, Scene* scene, size_t mode) { return new BVHNHairBuilderSAH<4,Curve8i,Line8i>((BVH4*)bvh,scene); }
+-#endif
+
++ unsigned int getLine8iPrimId(Line8i *line, unsigned int i) { return line->primID(i); }
++#endif
+ }
+ }
+ #endif
+diff --git a/kernels/common/rtcore_builder.cpp b/kernels/common/rtcore_builder.cpp
+index 56858294c..9ef862979 100644
+--- a/kernels/common/rtcore_builder.cpp
++++ b/kernels/common/rtcore_builder.cpp
+@@ -29,8 +29,17 @@
+ #include "../builders/bvh_builder_sah.h"
+ #include "../builders/bvh_builder_morton.h"
+
++#include "../bvh/bvh.h"
++#include "../geometry/instance.h"
++#include "../geometry/trianglev.h"
++#include "../geometry/trianglei.h"
++#include "../geometry/curveNi.h"
++#include "../geometry/linei.h"
++
+ namespace embree
+ {
++ DECLARE_ISA_FUNCTION(unsigned int, getLine8iPrimId, Line8i* COMMA unsigned int);
++
+ namespace isa // FIXME: support more ISAs for builders
+ {
+ struct BVH : public RefCount
+@@ -334,92 +343,226 @@ namespace embree
+ return root;
+ }
+
+- RTC_API void* rtcBuildBVH(const RTCBuildArguments* arguments)
+- {
+- BVH* bvh = (BVH*) arguments->bvh;
+- RTC_CATCH_BEGIN;
+- RTC_TRACE(rtcBuildBVH);
+- RTC_VERIFY_HANDLE(bvh);
+- RTC_VERIFY_HANDLE(arguments);
+- RTC_VERIFY_HANDLE(arguments->createNode);
+- RTC_VERIFY_HANDLE(arguments->setNodeChildren);
+- RTC_VERIFY_HANDLE(arguments->setNodeBounds);
+- RTC_VERIFY_HANDLE(arguments->createLeaf);
+-
+- if (arguments->primitiveArrayCapacity < arguments->primitiveCount)
+- throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"primitiveArrayCapacity must be greater or equal to primitiveCount")
+-
+- /* initialize the allocator */
+- bvh->allocator.init_estimate(arguments->primitiveCount*sizeof(BBox3fa));
+- bvh->allocator.reset();
+-
+- /* switch between differnet builders based on quality level */
+- if (arguments->buildQuality == RTC_BUILD_QUALITY_LOW)
+- return rtcBuildBVHMorton(arguments);
+- else if (arguments->buildQuality == RTC_BUILD_QUALITY_MEDIUM)
+- return rtcBuildBVHBinnedSAH(arguments);
+- else if (arguments->buildQuality == RTC_BUILD_QUALITY_HIGH) {
+- if (arguments->splitPrimitive == nullptr || arguments->primitiveArrayCapacity <= arguments->primitiveCount)
+- return rtcBuildBVHBinnedSAH(arguments);
+- else
+- return rtcBuildBVHSpatialSAH(arguments);
++ void* createLeaf(const BVH4::NodeRef node,
++ const PrimitiveType *leafType,
++ const RTCBVHExtractFunction args,
++ void *userData) {
++ size_t nb;
++ if(leafType == &Triangle4v::type) {
++ Triangle4v *prims = reinterpret_cast<Triangle4v *>(node.leaf(nb));
++ BVHPrimitive primsArray[4*nb];
++ unsigned int realNum = 0;
++ for(int i = 0; i < nb; ++i) {
++ for(size_t j = 0; j < prims[i].size(); j++) {
++ primsArray[realNum].geomID = prims[i].geomID(j);
++ primsArray[realNum].primID = prims[i].primID(j);
++ ++realNum;
++ }
++ }
++
++ return args.createLeaf(realNum, primsArray, userData);
++ } else if(leafType == &Triangle4i::type) {
++ Triangle4i *prims = reinterpret_cast<Triangle4i *>(node.leaf(nb));
++ BVHPrimitive primsArray[4*nb];
++ unsigned int realNum = 0;
++ for(int i = 0; i < nb; ++i) {
++ for(size_t j = 0; j < prims[i].size(); j++) {
++ primsArray[realNum].geomID = prims[i].geomID(j);
++ primsArray[realNum].primID = prims[i].primID(j);
++ ++realNum;
++ }
++ }
++
++ return args.createLeaf(realNum, primsArray, userData);
++ } else if(leafType == &InstancePrimitive::type) {
++ InstancePrimitive *prims = reinterpret_cast<InstancePrimitive *>(node.leaf(nb));
++ uint geomIDs[nb];
++ for(int i = 0; i < nb; ++i)
++ geomIDs[i] = prims[i].instance->geomID;
++
++ return args.createInstance(nb, geomIDs, userData);
++ } else if(leafType == &Curve8i::type) {
++ typedef unsigned char Primitive;
++
++ Primitive* prim = (Primitive*)node.leaf(nb);
++ if(nb == 0) return nullptr;
++
++ assert(nb == 1);
++ Geometry::GType ty = (Geometry::GType)(*prim);
++
++ BVHPrimitive primsArray[8];
++ unsigned int realNum = 0;
++
++ switch(ty) {
++ case Geometry::GTY_FLAT_LINEAR_CURVE: {
++ // Access to PrimID from right ISA, otherwise lead to allignement issue
++ DEFINE_ISA_FUNCTION(unsigned int, getLine8iPrimId, Line8i* COMMA unsigned int)
++ SELECT_SYMBOL_INIT_AVX(getCPUFeatures(), getLine8iPrimId)
++
++ Line8i *line = reinterpret_cast<Line8i*>(prim);
++
++ for(size_t i = 0; i < line->m; i++) {
++ primsArray[realNum].geomID = line->geomID();
++ primsArray[realNum].primID = getLine8iPrimId(line, i);
++ ++realNum;
++ }
++ } break;
++ case Geometry::GTY_ROUND_HERMITE_CURVE: {
++ Curve8i *curve = reinterpret_cast<Curve8i*>(prim);
++ const auto N = curve->N;
++ for(size_t i = 0; i < N; i++) {
++ primsArray[realNum].geomID = curve->geomID(N);
++ primsArray[realNum].primID = curve->primID(N)[i];
++ ++realNum;
++ }
++ } break;
++ default:
++ throw_RTCError(RTC_ERROR_INVALID_OPERATION,"Unexpected geom type");
++ }
++
++ return args.createCurve(realNum, primsArray, userData);
++ } else {
++ throw_RTCError(RTC_ERROR_INVALID_OPERATION,"Unexpected primitive type");
++ }
++ }
++
++ inline RTCBounds boundsToRTC(const BBox3fa &bounds) {
++ RTCBounds bb;
++ bb.lower_x = bounds.lower.x;
++ bb.lower_y = bounds.lower.y;
++ bb.lower_z = bounds.lower.z;
++
++ bb.upper_x = bounds.upper.x;
++ bb.upper_y = bounds.upper.y;
++ bb.upper_z = bounds.upper.z;
++
++ bb.align0 = 0;
++ bb.align1 = 1;
++
++ return bb;
++ }
++
++
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list