[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