[Bf-blender-cvs] [421159e620a] soc-2019-embree-gpu: Fix the building of empty tree

2019-10-15 Thread MATILLAT Quentin
Commit: 421159e620a98b090ef0451dda15e4fbcdc1bfd5
Author: MATILLAT Quentin
Date:   Tue Oct 15 08:10:18 2019 +0200
Branches: soc-2019-embree-gpu
https://developer.blender.org/rB421159e620a98b090ef0451dda15e4fbcdc1bfd5

Fix the building of empty tree

===

M   intern/cycles/bvh/bvh_embree_converter.cpp

===

diff --git a/intern/cycles/bvh/bvh_embree_converter.cpp 
b/intern/cycles/bvh/bvh_embree_converter.cpp
index 894985a174e..512237e35cf 100644
--- a/intern/cycles/bvh/bvh_embree_converter.cpp
+++ b/intern/cycles/bvh/bvh_embree_converter.cpp
@@ -804,9 +804,13 @@ void BVHEmbreeConverter::fillPack(PackedBVH ) {
 
   BVHNode *root = this->getBVH2();
   if(root == nullptr) {
-pack.root_index = 0;
 pack.nodes.clear();
-pack.leaf_nodes.clear();
+pack.leaf_nodes.resize(1);
+pack.leaf_nodes[0].x = 0;
+pack.leaf_nodes[0].y = 0;
+pack.leaf_nodes[0].z = 0;
+pack.leaf_nodes[0].w = 0;
+pack.root_index = -1;
 return;
   }

___
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
https://lists.blender.org/mailman/listinfo/bf-blender-cvs


[Bf-blender-cvs] [4963fc8a701] soc-2019-embree-gpu: Update embree version

2019-10-10 Thread MATILLAT Quentin
Commit: 4963fc8a701ea2ec73e263abc3d243647c3904ee
Author: MATILLAT Quentin
Date:   Thu Oct 10 16:40:17 2019 +0200
Branches: soc-2019-embree-gpu
https://developer.blender.org/rB4963fc8a701ea2ec73e263abc3d243647c3904ee

Update embree version

===

M   build_files/build_environment/install_deps.sh
M   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 b78f7d88a96..779d74f305e 100755
--- a/build_files/build_environment/install_deps.sh
+++ b/build_files/build_environment/install_deps.sh
@@ -2519,7 +2519,7 @@ compile_Embree() {
   fi
 
   # To be changed each time we make edits that would modify the compiled 
results!
-  embree_magic=10
+  embree_magic=11
   _init_embree
 
   # Clean install if needed!
diff --git a/build_files/build_environment/patches/embree.diff 
b/build_files/build_environment/patches/embree.diff
index 5065942227b..d4d9407e100 100644
--- a/build_files/build_environment/patches/embree.diff
+++ b/build_files/build_environment/patches/embree.diff
@@ -1,3 +1,119 @@
+diff --git a/doc/src/api.md b/doc/src/api.md
+index f190dc160..e77d85cf3 100644
+--- a/doc/src/api.md
 b/doc/src/api.md
+@@ -955,6 +955,11 @@ Embree API Reference
+ ```
+ \pagebreak
+ 
++## rtcExtractBVH
++``` {include=src/api/rtcExtractBVH.md}
++```
++\pagebreak
++
+ Performance Recommendations
+ ===
+ 
+diff --git a/doc/src/api/rtcExtractBVH.md b/doc/src/api/rtcExtractBVH.md
+new file mode 100644
+index 0..3c34c0ce2
+--- /dev/null
 b/doc/src/api/rtcExtractBVH.md
+@@ -0,0 +1,94 @@
++% rtcExtractBVH(3) | Embree Ray Tracing Kernels 3
++
++ NAME
++
++rtcExtractBVH - Extract BVH from a scene
++
++ SYNOPSIS
++
++#include 
++
++struct BVHPrimitive
++{
++  unsigned int geomID;
++  unsigned int primID;
++};
++  
++struct RTCBVHExtractFunction
++{
++  void (*expectedSize) (unsigned int num_leaf, unsigned int num_tri, void 
*userData);
++  
++  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);
++  
++  void* (*createInnerNode) (unsigned int nbChild, void* children[], void 
*userData);
++  
++  void (*setAlignedBounds) (void *node, const RTCBounds , void 
*userData);
++  void (*setLinearBounds) (void *node, const RTCLinearBounds , 
void *userData);
++  void (*setUnalignedBounds) (void *node, const RTCAffineSpace , 
void *userData);
++  void (*setUnalignedLinearBounds) (void *node, const RTCAffineSpace 
, const RTCBounds , void *userData);
++};
++
++void* rtcExtractBVH(
++  RTCScene hscene,
++  RTCBVHExtractFunction args,
++  void *userData
++);
++
++ DESCRIPTION
++
++The `rtcExtractBVH` function can be used to extract the BVH tree from a scene
++that has already been built.
++
++The `rtcExtractBVH` take the scene to export as parameter as well as a
++structure that contain callback function pointers and a user-defined pointer
++that is passed to all callback functions when invoked.
++All callback functions are typically called from a multiple threads, thus
++their implementation must be thread-safe.
++
++At least 8 callback functions must be registered, which are invoked during
++build to create BVH leaf (`createLeaf`, `createInstance` and `createCurve`
++member), to create a BVH inner node (`createInnerNode` member) and to set the
++bounding boxes of a node (`setAlignedBounds`, `setLinearBounds`,
++`setUnalignedBounds` and `setUnalignedLinearBounds` member).
++
++The function pointer used to preallocate buffer (`expectedSize` member) is
++optional and may be `NULL`.
++
++The `createLeaf`, `createInstance` and `createCurve` callback also gets the
++number of primitives for this leaf, and an array of size `nbPrim` of
++primitive objects.
++
++The `createInnerNode` callback gets the number of child, as well as an array
++of `nbChild` child previously returned by either `createLeaf`,
++`createInstance` or `createCurve`.
++
++The `setAlignedBounds`, `setLinearBounds`, `setUnalignedBounds` and
++`setUnalignedLinearBounds` callback function gets a pointer to the node as
++input (`node` argument) as well as the bounds for this node.
++
++The `setAlignedBounds` callback function take bounds of type `RTCBounds` which
++represent an aligned bound box.
++
++The `setLinearBounds` callback function take bounds of type `RTCLinearBounds`
++which represent an aligned bound box that can be linearly interpolated over
++time.
++
++The `setUnalignedBounds` callback function take bounds of type 
`RTCAffineSpace`
++which represent an affine space

[Bf-blender-cvs] [4b1c544e565] soc-2019-embree-gpu: Merge branch 'master' into soc-2019-embree-gpu-rebased

2019-10-10 Thread MATILLAT Quentin
Commit: 4b1c544e56532e3f010a4415e04578a0859d9c33
Author: MATILLAT Quentin
Date:   Thu Oct 3 21:11:34 2019 +0200
Branches: soc-2019-embree-gpu
https://developer.blender.org/rB4b1c544e56532e3f010a4415e04578a0859d9c33

Merge branch 'master' into soc-2019-embree-gpu-rebased

===



===



___
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
https://lists.blender.org/mailman/listinfo/bf-blender-cvs


[Bf-blender-cvs] [9d602cb3e96] soc-2019-embree-gpu: Add motion blur for unaligned box

2019-10-04 Thread MATILLAT Quentin
Commit: 9d602cb3e96cf2d265789809b33f0cbf53f674d0
Author: MATILLAT Quentin
Date:   Thu Oct 3 21:00:51 2019 +0200
Branches: soc-2019-embree-gpu
https://developer.blender.org/rB9d602cb3e96cf2d265789809b33f0cbf53f674d0

Add motion blur for unaligned box

===

M   build_files/build_environment/patches/embree.diff
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/kernel/bvh/bvh_nodes.h

===

diff --git a/build_files/build_environment/patches/embree.diff 
b/build_files/build_environment/patches/embree.diff
index d5e69a7e925..5065942227b 100644
--- a/build_files/build_environment/patches/embree.diff
+++ b/build_files/build_environment/patches/embree.diff
@@ -1,20 +1,8 @@
-From cb61d8802827da68b3627af66bc4421573668985 Mon Sep 17 00:00:00 2001
-From: MATILLAT Quentin 
-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 | 298 ++
- 4 files changed, 252 insertions(+), 78 deletions(-)
-
 diff --git a/include/embree3/rtcore_builder.h 
b/include/embree3/rtcore_builder.h
-index af84035b0..77e754f7e 100644
+index af84035b0..3f2c4eddf 100644
 --- a/include/embree3/rtcore_builder.h
 +++ b/include/embree3/rtcore_builder.h
-@@ -131,6 +131,28 @@ RTC_API void rtcRetainBVH(RTCBVH bvh);
+@@ -131,6 +131,35 @@ RTC_API void rtcRetainBVH(RTCBVH bvh);
  /* Releases the BVH (decrements reference count). */
  RTC_API void rtcReleaseBVH(RTCBVH bvh);
  
@@ -25,6 +13,12 @@ index af84035b0..77e754f7e 100644
 +
 +struct RTCBVHExtractFunction
 +{
++  /**
++   * Allow to preallocate buffer, is called before everything else
++   * Can be NULL if not used
++   */
++  void (*expectedSize) (unsigned int num_leaf, unsigned int num_tri, void 
*userData);
++
 +  // Leaf creator function
 +  void* (*createLeaf) (unsigned int nbPrim, const BVHPrimitive prims[], void 
*userData);
 +  void* (*createInstance) (unsigned int nbPrim, const unsigned int geomID[], 
void *userData);
@@ -36,6 +30,7 @@ index af84035b0..77e754f7e 100644
 +  void (*setAlignedBounds) (void *node, const RTCBounds , void 
*userData);
 +  void (*setLinearBounds) (void *node, const RTCLinearBounds , void 
*userData);
 +  void (*setUnalignedBounds) (void *node, const RTCAffineSpace , 
void *userData);
++  void (*setUnalignedLinearBounds) (void *node, const RTCAffineSpace 
, const RTCBounds , void *userData);
 +};
 +
 +RTC_API void *rtcExtractBVH(RTCScene hscene, RTCBVHExtractFunction args, void 
*userData);
@@ -77,10 +72,10 @@ index 14273787f..cad238123 100644
  }
  #endif
 diff --git a/kernels/common/rtcore_builder.cpp 
b/kernels/common/rtcore_builder.cpp
-index 56858294c..7c26c4193 100644
+index 56858294c..057565b2a 100644
 --- a/kernels/common/rtcore_builder.cpp
 +++ b/kernels/common/rtcore_builder.cpp
-@@ -29,8 +29,17 @@
+@@ -29,8 +29,18 @@
  #include "../builders/bvh_builder_sah.h"
  #include "../builders/bvh_builder_morton.h"
  
@@ -89,6 +84,7 @@ index 56858294c..7c26c4193 100644
 +#include "../geometry/trianglev.h"
 +#include "../geometry/trianglei.h"
 +#include "../geometry/curveNi.h"
++#include "../geometry/curveNi_mb.h"
 +#include "../geometry/linei.h"
 +
  namespace embree
@@ -98,7 +94,7 @@ index 56858294c..7c26c4193 100644
namespace isa // FIXME: support more ISAs for builders
{
  struct BVH : public RefCount
-@@ -334,92 +343,227 @@ namespace embree
+@@ -334,92 +344,349 @@ namespace embree
return root;
  }
  
@@ -131,6 +127,9 @@ index 56858294c..7c26c4193 100644
 -  return rtcBuildBVHBinnedSAH(arguments);
 -else
 -  return rtcBuildBVHSpatialSAH(arguments);
+-  }
+-  else
+-throw_RTCError(RTC_ERROR_INVALID_OPERATION,"invalid build quality");
 +void* createLeaf(const BVH4::NodeRef node,
 + const PrimitiveType *leafType,
 + const RTCBVHExtractFunction args,
@@ -217,27 +216,131 @@ index 56858294c..7c26c4193 100644
 +}
 +
 +return args.createCurve(realNum, primsArray, userData);
++} else if(leafType == ::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, otherwi

[Bf-blender-cvs] [648c0538851] soc-2019-embree-gpu: Cycles: Improve convert time from Embree

2019-09-17 Thread MATILLAT Quentin
Commit: 648c0538851969a1e545891027b0a1c17b19e978
Author: MATILLAT Quentin
Date:   Tue Sep 17 15:52:45 2019 +0200
Branches: soc-2019-embree-gpu
https://developer.blender.org/rB648c0538851969a1e545891027b0a1c17b19e978

Cycles: Improve convert time from Embree

===

M   intern/cycles/bvh/bvh_embree_converter.cpp

===

diff --git a/intern/cycles/bvh/bvh_embree_converter.cpp 
b/intern/cycles/bvh/bvh_embree_converter.cpp
index ed6bc66d02b..eb63dfd2a62 100644
--- a/intern/cycles/bvh/bvh_embree_converter.cpp
+++ b/intern/cycles/bvh/bvh_embree_converter.cpp
@@ -360,6 +360,17 @@ BVHNode* BVHEmbreeConverter::getBVH4()
 This->setUnalignedBounds(Node, tr);
   };
 
+  param.expectedSize = [](unsigned int num_prim, unsigned int num_tri, void* 
userData) {
+SET_THIS;
+This->pack->prim_visibility.reserve(num_prim);
+This->pack->prim_object.reserve(num_prim);
+This->pack->prim_type.reserve(num_prim);
+This->pack->prim_index.reserve(num_prim);
+This->pack->prim_tri_index.reserve(num_prim);
+
+This->pack->prim_tri_verts.reserve(num_tri);
+  };
+
   return reinterpret_cast(rtcExtractBVH(this->s, param, this));
 }
 
@@ -725,55 +736,12 @@ void pack_inner(const BVHStackEntry , const 
BVHStackEntry , const BVHStackE
 }
 
 void BVHEmbreeConverter::fillPack(PackedBVH ) {
-  size_t num_prim = 0;
-  size_t num_tri = 0;
-
-  foreach (Object *ob, objects) {
-if (params.top_level) {
-  if (!ob->is_traceable()) {
-continue;
-  }
-  if (!ob->mesh->is_instanced()) {
-if (params.primitive_mask & PRIMITIVE_ALL_TRIANGLE) {
-  num_prim += ob->mesh->num_triangles();
-  num_tri += ob->mesh->num_triangles();
-}
-if (params.primitive_mask & PRIMITIVE_ALL_CURVE) {
-  for (size_t j = 0; j < ob->mesh->num_curves(); ++j) {
-num_prim += ob->mesh->get_curve(j).num_segments();
-  }
-}
-  }
-  else {
-++num_prim;
-  }
-}
-else {
-  if (params.primitive_mask & PRIMITIVE_ALL_TRIANGLE && 
ob->mesh->num_triangles() > 0) {
-num_prim += ob->mesh->num_triangles();
-num_tri += ob->mesh->num_triangles();
-  }
-  if (params.primitive_mask & PRIMITIVE_ALL_CURVE) {
-for (size_t j = 0; j < ob->mesh->num_curves(); ++j) {
-  num_prim += ob->mesh->get_curve(j).num_segments();
-}
-  }
-}
-  }
-
   pack.prim_visibility.clear();
-  pack.prim_visibility.reserve(num_prim);
   pack.prim_object.clear();
-  pack.prim_object.reserve(num_prim);
   pack.prim_type.clear();
-  pack.prim_type.reserve(num_prim);
   pack.prim_index.clear();
-  pack.prim_index.reserve(num_prim);
   pack.prim_tri_index.clear();
-  pack.prim_tri_index.reserve(num_prim);
-
   pack.prim_tri_verts.clear();
-  pack.prim_tri_index.reserve(3 * num_tri);
 
   this->pack = 

___
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
https://lists.blender.org/mailman/listinfo/bf-blender-cvs


[Bf-blender-cvs] [7629463638c] soc-2019-embree-gpu: Add path to `make deps`

2019-08-27 Thread MATILLAT Quentin
Commit: 7629463638c5a59d0818f46a82d63264c3673343
Author: MATILLAT Quentin
Date:   Tue Aug 27 16:30:18 2019 +0200
Branches: soc-2019-embree-gpu
https://developer.blender.org/rB7629463638c5a59d0818f46a82d63264c3673343

Add path to `make deps`

===

M   build_files/build_environment/cmake/embree.cmake

===

diff --git a/build_files/build_environment/cmake/embree.cmake 
b/build_files/build_environment/cmake/embree.cmake
index 2dd42614cc0..36fc2589866 100644
--- a/build_files/build_environment/cmake/embree.cmake
+++ b/build_files/build_environment/cmake/embree.cmake
@@ -41,6 +41,7 @@ ExternalProject_Add(external_embree
   DOWNLOAD_DIR ${DOWNLOAD_DIR}
   URL_HASH MD5=${EMBREE_HASH}
   PREFIX ${BUILD_DIR}/embree
+  PATCH_COMMAND ${PATCH_CMD} --verbose -p 1 -N -d 
${BUILD_DIR}/embree/src/external_embree < ${PATCH_DIR}/embree.diff
   CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBDIR}/embree ${DEFAULT_CMAKE_FLAGS} 
${EMBREE_EXTRA_ARGS}
   INSTALL_DIR ${LIBDIR}/embree
 )

___
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
https://lists.blender.org/mailman/listinfo/bf-blender-cvs


[Bf-blender-cvs] [8495f9e73d7] soc-2019-embree-gpu: Allow to build empty tree

2019-08-27 Thread MATILLAT Quentin
Commit: 8495f9e73d7db4a239d64c0ac43af95ba0fa54ae
Author: MATILLAT Quentin
Date:   Tue Aug 27 16:32:22 2019 +0200
Branches: soc-2019-embree-gpu
https://developer.blender.org/rB8495f9e73d7db4a239d64c0ac43af95ba0fa54ae

Allow to build empty tree

===

M   intern/cycles/bvh/bvh_embree_converter.cpp

===

diff --git a/intern/cycles/bvh/bvh_embree_converter.cpp 
b/intern/cycles/bvh/bvh_embree_converter.cpp
index 969e941fafa..ed6bc66d02b 100644
--- a/intern/cycles/bvh/bvh_embree_converter.cpp
+++ b/intern/cycles/bvh/bvh_embree_converter.cpp
@@ -366,6 +366,7 @@ BVHNode* BVHEmbreeConverter::getBVH4()
 BVHNode* BVHEmbreeConverter::getBVH2()
 {
   BVHNode *root = this->getBVH4();
+  if(root == nullptr) return nullptr;
   return bvh_shrink(root);
 }
 
@@ -777,6 +778,12 @@ void BVHEmbreeConverter::fillPack(PackedBVH ) {
   this->pack = 
 
   BVHNode *root = this->getBVH2();
+  if(root == nullptr) {
+pack.root_index = 0;
+pack.nodes.clear();
+pack.leaf_nodes.clear();
+return;
+  }
 
   const size_t num_nodes = root->getSubtreeSize(BVH_STAT_NODE_COUNT);
   const size_t num_leaf_nodes = root->getSubtreeSize(BVH_STAT_LEAF_COUNT);

___
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
https://lists.blender.org/mailman/listinfo/bf-blender-cvs


[Bf-blender-cvs] [137754bba38] soc-2019-embree-gpu: Update embree to support all kind of curve

2019-08-27 Thread MATILLAT Quentin
Commit: 137754bba38f4a080545401a3db9857accfc7ace
Author: MATILLAT Quentin
Date:   Tue Aug 20 15:07:23 2019 +0200
Branches: soc-2019-embree-gpu
https://developer.blender.org/rB137754bba38f4a080545401a3db9857accfc7ace

Update embree to support all kind of curve

===

M   build_files/build_environment/patches/embree.diff
M   intern/cycles/bvh/bvh_embree_converter.cpp

===

diff --git a/build_files/build_environment/patches/embree.diff 
b/build_files/build_environment/patches/embree.diff
index fc5106b6c24..d5e69a7e925 100644
--- a/build_files/build_environment/patches/embree.diff
+++ b/build_files/build_environment/patches/embree.diff
@@ -1,4 +1,4 @@
-From 1bd1456d289b3587e6c532085375c83bafccadf4 Mon Sep 17 00:00:00 2001
+From cb61d8802827da68b3627af66bc4421573668985 Mon Sep 17 00:00:00 2001
 From: MATILLAT Quentin 
 Date: Sun, 18 Aug 2019 15:29:34 +0200
 Subject: [PATCH] Add ability to export curve from BVH
@@ -7,8 +7,8 @@ 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 | 290 ++
- 4 files changed, 244 insertions(+), 78 deletions(-)
+ kernels/common/rtcore_builder.cpp | 298 ++
+ 4 files changed, 252 insertions(+), 78 deletions(-)
 
 diff --git a/include/embree3/rtcore_builder.h 
b/include/embree3/rtcore_builder.h
 index af84035b0..77e754f7e 100644
@@ -77,7 +77,7 @@ index 14273787f..cad238123 100644
  }
  #endif
 diff --git a/kernels/common/rtcore_builder.cpp 
b/kernels/common/rtcore_builder.cpp
-index 56858294c..94d2e211f 100644
+index 56858294c..7c26c4193 100644
 --- a/kernels/common/rtcore_builder.cpp
 +++ b/kernels/common/rtcore_builder.cpp
 @@ -29,8 +29,17 @@
@@ -98,7 +98,7 @@ index 56858294c..94d2e211f 100644
namespace isa // FIXME: support more ISAs for builders
{
  struct BVH : public RefCount
-@@ -334,92 +343,219 @@ namespace embree
+@@ -334,92 +343,227 @@ namespace embree
return root;
  }
  
@@ -195,7 +195,15 @@ index 56858294c..94d2e211f 100644
 +++realNum;
 +}
 +} break;
-+case Geometry::GTY_ROUND_HERMITE_CURVE: {
++case Geometry::GTY_FLAT_BEZIER_CURVE:
++case Geometry::GTY_ROUND_BEZIER_CURVE:
++case Geometry::GTY_ORIENTED_BEZIER_CURVE:
++case Geometry::GTY_FLAT_BSPLINE_CURVE:
++case Geometry::GTY_ROUND_BSPLINE_CURVE:
++case Geometry::GTY_ORIENTED_BSPLINE_CURVE:
++case Geometry::GTY_FLAT_HERMITE_CURVE:
++case Geometry::GTY_ROUND_HERMITE_CURVE:
++case Geometry::GTY_ORIENTED_HERMITE_CURVE: {
 +Curve8i *curve = reinterpret_cast(prim);
 +const auto N = curve->N;
 +for(size_t i = 0; i < N; i++) {
@@ -396,5 +404,5 @@ index 56858294c..94d2e211f 100644
  }
 -
 -- 
-2.22.1
+2.23.0
 
diff --git a/intern/cycles/bvh/bvh_embree_converter.cpp 
b/intern/cycles/bvh/bvh_embree_converter.cpp
index ed804f59adf..969e941fafa 100644
--- a/intern/cycles/bvh/bvh_embree_converter.cpp
+++ b/intern/cycles/bvh/bvh_embree_converter.cpp
@@ -110,7 +110,7 @@ BVHNode *makeBVHTreeFromList(std::deque nodes)
 BVHNode *bvh_shrink(BVHNode *root)
 {
   if(root->is_leaf()) {
-  if(root->num_triangles() == 0) // Remove empty leafs
+if(root->num_triangles() == 0) // Remove empty leafs
   return nullptr;
 else
   return root;

___
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
https://lists.blender.org/mailman/listinfo/bf-blender-cvs


[Bf-blender-cvs] [46c0763187a] soc-2019-embree-gpu: Cycles: Remove unused BVH Builder using Embree BVH

2019-08-19 Thread MATILLAT Quentin
Commit: 46c0763187abceef77133adb53993fbb3d067952
Author: MATILLAT Quentin
Date:   Sun Aug 18 15:56:51 2019 +0200
Branches: soc-2019-embree-gpu
https://developer.blender.org/rB46c0763187abceef77133adb53993fbb3d067952

Cycles: Remove unused BVH Builder using Embree BVH

===

M   intern/cycles/blender/addon/properties.py
M   intern/cycles/blender/blender_sync.cpp
M   intern/cycles/bvh/CMakeLists.txt
M   intern/cycles/bvh/bvh.cpp
D   intern/cycles/bvh/bvh_embree_gpu.cpp
D   intern/cycles/bvh/bvh_embree_gpu.h
M   intern/cycles/device/device_cpu.cpp
M   intern/cycles/device/device_cuda.cpp
M   intern/cycles/kernel/kernel_types.h
M   intern/cycles/render/mesh.cpp

===

diff --git a/intern/cycles/blender/addon/properties.py 
b/intern/cycles/blender/addon/properties.py
index 4da89ebd4a1..88dbfcdcc1e 100644
--- a/intern/cycles/blender/addon/properties.py
+++ b/intern/cycles/blender/addon/properties.py
@@ -61,7 +61,6 @@ enum_bvh_builder = (
 ('INTERNAL', "Internal", "Use old internal BVH builder"),
 ('EMBREE', "Embree", "Use full featured embree (only on CPU)"),
 ('EMBREE_CONVERT', "Embree, then convert", "Use embree, then convert it to 
BVH2"),
-('EMBREE_BUILDER', "Embree builder", "Use Embree BVH Builder"),
 )
 
 enum_bvh_types = (
diff --git a/intern/cycles/blender/blender_sync.cpp 
b/intern/cycles/blender/blender_sync.cpp
index e249c86f403..9a88076db10 100644
--- a/intern/cycles/blender/blender_sync.cpp
+++ b/intern/cycles/blender/blender_sync.cpp
@@ -702,9 +702,6 @@ SceneParams BlenderSync::get_scene_params(BL::Scene 
_scene, bool background)
   case 2:
   params.bvh_layout = BVH_LAYOUT_EMBREE_CONVERTED;
   break;
-  case 3:
-  params.bvh_layout = BVH_LAYOUT_EMBREE_GPU;
-  break;
   }
 #endif
   return params;
diff --git a/intern/cycles/bvh/CMakeLists.txt b/intern/cycles/bvh/CMakeLists.txt
index f85a484a194..740ecaacca8 100644
--- a/intern/cycles/bvh/CMakeLists.txt
+++ b/intern/cycles/bvh/CMakeLists.txt
@@ -14,7 +14,6 @@ set(SRC
   bvh_binning.cpp
   bvh_build.cpp
   bvh_embree.cpp
-  bvh_embree_gpu.cpp
   bvh_node.cpp
   bvh_sort.cpp
   bvh_split.cpp
@@ -30,7 +29,6 @@ set(SRC_HEADERS
   bvh_binning.h
   bvh_build.h
   bvh_embree.h
-  bvh_embree_gpu.h
   bvh_node.h
   bvh_params.h
   bvh_sort.h
diff --git a/intern/cycles/bvh/bvh.cpp b/intern/cycles/bvh/bvh.cpp
index 715651c96a8..525af8123d4 100644
--- a/intern/cycles/bvh/bvh.cpp
+++ b/intern/cycles/bvh/bvh.cpp
@@ -28,7 +28,6 @@
 
 #ifdef WITH_EMBREE
 #  include "bvh/bvh_embree.h"
-#  include "bvh/bvh_embree_gpu.h"
 #endif
 
 #include "util/util_foreach.h"
@@ -54,8 +53,6 @@ const char *bvh_layout_name(BVHLayout layout)
   return "EMBREE";
 case BVH_LAYOUT_EMBREE_CONVERTED:
   return "EMBREE_CONVERTED";
-case BVH_LAYOUT_EMBREE_GPU:
-  return "EMBREE_GPU";
 case BVH_LAYOUT_ALL:
   return "ALL";
   }
@@ -114,10 +111,6 @@ BVH *BVH::create(const BVHParams , const 
vector )
 case BVH_LAYOUT_EMBREE_CONVERTED:
 #ifdef WITH_EMBREE
   return new BVHEmbree(params, objects);
-#endif
-case BVH_LAYOUT_EMBREE_GPU:
-#ifdef WITH_EMBREE
-  return new BVHEmbreeGPU(params, objects);
 #endif
 case BVH_LAYOUT_NONE:
 case BVH_LAYOUT_ALL:
diff --git a/intern/cycles/bvh/bvh_embree_gpu.cpp 
b/intern/cycles/bvh/bvh_embree_gpu.cpp
deleted file mode 100644
index f7b6fa8bb3c..000
--- a/intern/cycles/bvh/bvh_embree_gpu.cpp
+++ /dev/null
@@ -1,375 +0,0 @@
-/*
- * Copyright 2018, Blender Foundation.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifdef WITH_EMBREE
-
-#include "bvh/bvh_embree_gpu.h"
-
-#include "render/mesh.h"
-#include "render/object.h"
-#include "util/util_foreach.h"
-#include "util/util_logging.h"
-#include "util/util_progress.h"
-
-CCL_NAMESPACE_BEGIN
-
-typedef struct {
-BVHEmbreeGPU *bvhBldr;
-Progress *p;
-} UserParams;
-
-
-BVHEmbreeGPU::BVHEmbreeGPU(const BVHParams& params_, const vector& 
objects_)
-: BVH2(params_, objects_), stats(nullptr)
-{
-_MM_SET_FLUSH_ZERO_MODE(_MM_FLUSH_ZERO_ON);
-_MM_SET_DENORMALS_ZERO_MODE(_MM_DENORMALS_ZERO_ON);

[Bf-blender-cvs] [cc6c338b250] soc-2019-embree-gpu: Cycles: Remove some debug flags

2019-08-19 Thread MATILLAT Quentin
Commit: cc6c338b250376dce6a8e6ea7fcd5ddc542ad470
Author: MATILLAT Quentin
Date:   Mon Aug 19 17:37:08 2019 +0200
Branches: soc-2019-embree-gpu
https://developer.blender.org/rBcc6c338b250376dce6a8e6ea7fcd5ddc542ad470

Cycles: Remove some debug flags

===

M   build_files/build_environment/patches/embree.diff
M   intern/cycles/bvh/bvh.cpp
M   intern/cycles/bvh/bvh.h
M   intern/cycles/bvh/bvh2.cpp
M   intern/cycles/bvh/bvh_embree.cpp
M   intern/cycles/kernel/bvh/bvh_nodes.h
M   intern/cycles/kernel/kernel_types.h
M   intern/cycles/render/mesh.cpp
M   intern/cycles/render/object.h

===

diff --git a/build_files/build_environment/patches/embree.diff 
b/build_files/build_environment/patches/embree.diff
index 3ca9b523f84..fc5106b6c24 100644
--- a/build_files/build_environment/patches/embree.diff
+++ b/build_files/build_environment/patches/embree.diff
@@ -1,4 +1,4 @@
-From 4a3ec5e090fa208eef6900bd9217b93e6268 Mon Sep 17 00:00:00 2001
+From 1bd1456d289b3587e6c532085375c83bafccadf4 Mon Sep 17 00:00:00 2001
 From: MATILLAT Quentin 
 Date: Sun, 18 Aug 2019 15:29:34 +0200
 Subject: [PATCH] Add ability to export curve from BVH
@@ -7,8 +7,8 @@ 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(-)
+ kernels/common/rtcore_builder.cpp | 290 ++
+ 4 files changed, 244 insertions(+), 78 deletions(-)
 
 diff --git a/include/embree3/rtcore_builder.h 
b/include/embree3/rtcore_builder.h
 index af84035b0..77e754f7e 100644
@@ -77,7 +77,7 @@ index 14273787f..cad238123 100644
  }
  #endif
 diff --git a/kernels/common/rtcore_builder.cpp 
b/kernels/common/rtcore_builder.cpp
-index 56858294c..9ef862979 100644
+index 56858294c..94d2e211f 100644
 --- a/kernels/common/rtcore_builder.cpp
 +++ b/kernels/common/rtcore_builder.cpp
 @@ -29,8 +29,17 @@
@@ -98,7 +98,7 @@ index 56858294c..9ef862979 100644
namespace isa // FIXME: support more ISAs for builders
{
  struct BVH : public RefCount
-@@ -334,92 +343,226 @@ namespace embree
+@@ -334,92 +343,219 @@ namespace embree
return root;
  }
  
@@ -205,12 +205,12 @@ index 56858294c..9ef862979 100644
 +}
 +} break;
 +default:
-+throw_RTCError(RTC_ERROR_INVALID_OPERATION,"Unexpected geom 
type");
++throw_RTCError(RTC_ERROR_INVALID_OPERATION, "Unexpected curve 
geom type");
 +}
 +
 +return args.createCurve(realNum, primsArray, userData);
 +} else {
-+throw_RTCError(RTC_ERROR_INVALID_OPERATION,"Unexpected primitive 
type");
++throw_RTCError(RTC_ERROR_INVALID_OPERATION, "Unsupported 
primitive");
 +}
 +}
 +
@@ -258,8 +258,7 @@ index 56858294c..9ef862979 100644
 +  unanode = node.unalignedNode();
 +  bnode = unanode;
 +  } else {
-+  throw_RTCError(RTC_ERROR_INVALID_OPERATION,"Node type is unknown");
-+  return nullptr;
++  throw_RTCError(RTC_ERROR_INVALID_OPERATION, "Unknown node type");
}
 -  else
 -throw_RTCError(RTC_ERROR_INVALID_OPERATION,"invalid build quality");
@@ -366,12 +365,11 @@ index 56858294c..9ef862979 100644
 +  for (Accel *a : scene->accels) {
 +AccelData *ad = a->intersectors.ptr;
 +if(ad->type != AccelData::TY_BVH4) {
-+  throw_RTCError(RTC_ERROR_INVALID_OPERATION,"Unable to extract non 
BVH4 tree")
++  throw_RTCError(RTC_ERROR_INVALID_OPERATION, "Unable to extract non 
BVH4 tree");
 +  continue;
 +}
 +
 +BVH4 *bvh = dynamic_cast(ad);
-+
 +BVH4::NodeRef root = bvh->root;
 +void *node = recurse(root, bvh->primTy, args, userData);
 +args.setAlignedBounds(node, boundsToRTC(bvh->bounds.bounds()), 
userData);
diff --git a/intern/cycles/bvh/bvh.cpp b/intern/cycles/bvh/bvh.cpp
index 525af8123d4..607f10788a5 100644
--- a/intern/cycles/bvh/bvh.cpp
+++ b/intern/cycles/bvh/bvh.cpp
@@ -99,7 +99,6 @@ BVH::BVH(const BVHParams _, const vector 
_)
 
 BVH *BVH::create(const BVHParams , const vector )
 {
-  std::cout << "Using layout : " << bvh_layout_name(params.bvh_layout) << 
std::endl;
   switch (params.bvh_layout) {
 case BVH_LAYOUT_BVH2:
   return new BVH2(params, objects);
@@ -122,12 +121,6 @@ BVH *BVH::create(const BVHParams , const 
vector )
 
 /* Building */
 
-void BVH::buildTimed(Progress , Stats *s) {
-auto start = std::chrono::steady_clock::now();
-this->build(p, s);
-std::cout &

[Bf-blender-cvs] [b11e093bd68] soc-2019-embree-gpu: Cycles: Patch embree version

2019-08-19 Thread MATILLAT Quentin
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 000..3ca9b523f84
--- /dev/null
+++ b/build_files/build_environment/patches/embree.diff
@@ -0,0 +1,402 @@
+From 4a3ec5e090fa208eef6900bd9217b93e6268 Mon Sep 17 00:00:00 2001
+From: MATILLAT Quentin 
+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 , void 
*userData);
++  void (*setLinearBounds) (void *node, const RTCLinearBounds , void 
*userData);
++  void (*setUnalignedBounds) (void *node, const RTCAffineSpace , 
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"
++#i

[Bf-blender-cvs] [e4b2ae0fb62] soc-2019-embree-gpu: Add support for curve and unaligned nodes

2019-08-16 Thread MATILLAT Quentin
Commit: e4b2ae0fb62addc6f1b34db934d1785f960833bf
Author: MATILLAT Quentin
Date:   Fri Aug 16 16:31:12 2019 +0200
Branches: soc-2019-embree-gpu
https://developer.blender.org/rBe4b2ae0fb62addc6f1b34db934d1785f960833bf

Add support for curve and unaligned nodes

===

M   intern/cycles/bvh/bvh_embree.cpp
M   intern/cycles/bvh/bvh_embree_converter.cpp
M   intern/cycles/bvh/bvh_embree_converter.h

===

diff --git a/intern/cycles/bvh/bvh_embree.cpp b/intern/cycles/bvh/bvh_embree.cpp
index 6a1c2c90489..c3bc8dd3509 100644
--- a/intern/cycles/bvh/bvh_embree.cpp
+++ b/intern/cycles/bvh/bvh_embree.cpp
@@ -487,8 +487,8 @@ void BVHEmbree::build(Progress , Stats *stats_)
 
   progress.set_substatus("Packing geometry");
   if(this->bvh_layout == BVH_LAYOUT_EMBREE_CONVERTED) {
-BVHEmbreeConverter conv(scene, objects, this->params);
-conv.fillPack(this->pack, this->objects);
+BVHEmbreeConverter conv(this->scene, this->objects, this->params);
+conv.fillPack(this->pack);
   } else {
 pack_primitives();
 
@@ -817,7 +817,7 @@ void BVHEmbree::add_curves(Object *ob, int i)
   rtcReleaseGeometry(geom_id);
 }
 
-void BVHEmbree::pack_nodes(const BVHNode *r)
+void BVHEmbree::pack_nodes(const BVHNode *)
 {
   /* Quite a bit of this code is for compatibility with Cycles' native BVH. */
   if (!params.top_level) {
diff --git a/intern/cycles/bvh/bvh_embree_converter.cpp 
b/intern/cycles/bvh/bvh_embree_converter.cpp
index fe851b8074f..ed804f59adf 100644
--- a/intern/cycles/bvh/bvh_embree_converter.cpp
+++ b/intern/cycles/bvh/bvh_embree_converter.cpp
@@ -14,9 +14,6 @@
  * limitations under the License.
  */
 
-/* This class implements a converter from Embree internal data structure to
- * Blender's internal structure
- */
 
 #ifdef WITH_EMBREE
 
@@ -28,296 +25,355 @@
 CCL_NAMESPACE_BEGIN
 
 /* Utility functions */
+void packPush(PackedBVH *pack, const size_t packIdx,
+  const int object_id, const int prim_id,
+  const int prim_type, const uint visibility,
+  const uint tri_index)
+{
+  pack->prim_index.resize(packIdx + 1);
+  pack->prim_type.resize(packIdx + 1);
+  pack->prim_object.resize(packIdx + 1);
+  pack->prim_visibility.resize(packIdx + 1);
+  pack->prim_tri_index.resize(packIdx + 1);
+
+  pack->prim_index[packIdx] = prim_id;
+  pack->prim_type[packIdx] = prim_type;
+  pack->prim_object[packIdx] = object_id;
+  pack->prim_visibility[packIdx] = visibility;
+  pack->prim_tri_index[packIdx] = tri_index;
 
-void packPush(PackedBVH *pack, const size_t packIdx, const int object_id, 
const int prim_id, const int prim_type, const uint visibility, const uint 
tri_index) {
-pack->prim_index.resize(packIdx + 1);
-pack->prim_type.resize(packIdx + 1);
-pack->prim_object.resize(packIdx + 1);
-pack->prim_visibility.resize(packIdx + 1);
-pack->prim_tri_index.resize(packIdx + 1);
+}
 
-pack->prim_index[packIdx] = prim_id;
-pack->prim_type[packIdx] = prim_type;
-pack->prim_object[packIdx] = object_id;
-pack->prim_visibility[packIdx] = visibility;
-pack->prim_tri_index[packIdx] = tri_index;
+BoundBox RTCBoundBoxToCCL(const RTCBounds )
+{
+  return BoundBox(make_float3(bound.lower_x, bound.lower_y, bound.lower_z),
+  make_float3(bound.upper_x, bound.upper_y, bound.upper_z));
 
 }
 
-ccl::BoundBox RTCBoundBoxToCCL(const RTCBounds ) {
-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));
+Transform transformSpaceFromBound(const BoundBox ) {
+  Transform space = transform_identity();
 
-}
+  space.x.w -= bounds.min.x;
+  space.y.w -= bounds.min.y;
+  space.z.w -= bounds.min.z;
+  float3 dim = bounds.max - bounds.min;
 
-BVHNode *bvh_shrink(BVHNode *root) {
-if(root->is_leaf()) {
-if(root->num_triangles() == 0) // Remove empty leafs
-return nullptr;
-else
-return root;
-}
+  return transform_scale(1.0f / max(1e-18f, dim.x),
+ 1.0f / max(1e-18f, dim.y),
+ 1.0f / max(1e-18f, dim.z)) * space;
+}
 
-InnerNode *node = dynamic_cast(root);
 
-int num_children = 0;
-BVHNode* children[4];
+BVHNode *merge(BVHNode *oldRoot, BVHNode *n0, BVHNode *n1) {
+  BoundBox childBB = merge(n0->bounds, n1->bounds);
+  BVHNode *root = new InnerNode(childBB, n0, n1);
 
-for(int i = 0; i < node->num_children(); ++i) {
-BVHNode *child = bvh_shrink(node->get_child(i));
-if(child != nullptr)
-children[num_children++] = child;
-}
+  /* If one of the child has linear bound, take the parents bound */
+  if(n0->deltaBounds != nullptr || n1->deltaBounds != n

[Bf-blender-cvs] [209cf2f8909] soc-2019-embree-gpu: Remove embree header

2019-08-11 Thread MATILLAT Quentin
Commit: 209cf2f89090ff8f23e8160d6d3557fed1bd575d
Author: MATILLAT Quentin
Date:   Sun Aug 11 13:17:20 2019 +0200
Branches: soc-2019-embree-gpu
https://developer.blender.org/rB209cf2f89090ff8f23e8160d6d3557fed1bd575d

Remove embree header

===

D   intern/cycles/bvh/embree/common/CMakeLists.txt
D   intern/cycles/bvh/embree/common/algorithms/CMakeLists.txt
D   intern/cycles/bvh/embree/common/algorithms/parallel_filter.h
D   intern/cycles/bvh/embree/common/algorithms/parallel_for.h
D   intern/cycles/bvh/embree/common/algorithms/parallel_for_for.h
D   intern/cycles/bvh/embree/common/algorithms/parallel_for_for_prefix_sum.h
D   intern/cycles/bvh/embree/common/algorithms/parallel_map.h
D   intern/cycles/bvh/embree/common/algorithms/parallel_partition.h
D   intern/cycles/bvh/embree/common/algorithms/parallel_prefix_sum.h
D   intern/cycles/bvh/embree/common/algorithms/parallel_reduce.h
D   intern/cycles/bvh/embree/common/algorithms/parallel_set.h
D   intern/cycles/bvh/embree/common/algorithms/parallel_sort.h
D   intern/cycles/bvh/embree/common/cmake/FindOpenImageIO.cmake
D   intern/cycles/bvh/embree/common/cmake/FindPNG.cmake
D   intern/cycles/bvh/embree/common/cmake/FindTBB.cmake
D   intern/cycles/bvh/embree/common/cmake/check_globals.cmake
D   intern/cycles/bvh/embree/common/cmake/check_isa_default.cmake
D   intern/cycles/bvh/embree/common/cmake/check_stack_frame_size.cmake
D   intern/cycles/bvh/embree/common/cmake/clang.cmake
D   intern/cycles/bvh/embree/common/cmake/crayprgenv.cmake
D   intern/cycles/bvh/embree/common/cmake/create_isa_dummy_file.cmake
D   intern/cycles/bvh/embree/common/cmake/embree-config-builddir.cmake
D   intern/cycles/bvh/embree/common/cmake/embree-config-version.cmake
D   intern/cycles/bvh/embree/common/cmake/embree-config.cmake
D   intern/cycles/bvh/embree/common/cmake/gnu.cmake
D   intern/cycles/bvh/embree/common/cmake/intel.cmake
D   intern/cycles/bvh/embree/common/cmake/ispc.cmake
D   intern/cycles/bvh/embree/common/cmake/msvc.cmake
D   intern/cycles/bvh/embree/common/cmake/msvc_post.cmake
D   intern/cycles/bvh/embree/common/cmake/package.cmake
D   intern/cycles/bvh/embree/common/cmake/rpm_ldconfig.sh
D   intern/cycles/bvh/embree/common/cmake/test.cmake
D   intern/cycles/bvh/embree/common/cmake/tutorial.cmake
D   intern/cycles/bvh/embree/common/cmake/uninstall.cmake.in
D   intern/cycles/bvh/embree/common/lexers/CMakeLists.txt
D   intern/cycles/bvh/embree/common/lexers/parsestream.h
D   intern/cycles/bvh/embree/common/lexers/stream.h
D   intern/cycles/bvh/embree/common/lexers/streamfilters.h
D   intern/cycles/bvh/embree/common/lexers/stringstream.h
D   intern/cycles/bvh/embree/common/lexers/tokenstream.h
D   intern/cycles/bvh/embree/common/math/CMakeLists.txt
D   intern/cycles/bvh/embree/common/math/affinespace.h
D   intern/cycles/bvh/embree/common/math/bbox.h
D   intern/cycles/bvh/embree/common/math/col3.h
D   intern/cycles/bvh/embree/common/math/col4.h
D   intern/cycles/bvh/embree/common/math/color.h
D   intern/cycles/bvh/embree/common/math/constants.h
D   intern/cycles/bvh/embree/common/math/interval.h
D   intern/cycles/bvh/embree/common/math/lbbox.h
D   intern/cycles/bvh/embree/common/math/linearspace2.h
D   intern/cycles/bvh/embree/common/math/linearspace3.h
D   intern/cycles/bvh/embree/common/math/math.h
D   intern/cycles/bvh/embree/common/math/obbox.h
D   intern/cycles/bvh/embree/common/math/quaternion.h
D   intern/cycles/bvh/embree/common/math/range.h
D   intern/cycles/bvh/embree/common/math/vec2.h
D   intern/cycles/bvh/embree/common/math/vec2fa.h
D   intern/cycles/bvh/embree/common/math/vec3.h
D   intern/cycles/bvh/embree/common/math/vec3ba.h
D   intern/cycles/bvh/embree/common/math/vec3fa.h
D   intern/cycles/bvh/embree/common/math/vec3ia.h
D   intern/cycles/bvh/embree/common/math/vec4.h
D   intern/cycles/bvh/embree/common/simd/CMakeLists.txt
D   intern/cycles/bvh/embree/common/simd/avx.h
D   intern/cycles/bvh/embree/common/simd/avx512.h
D   intern/cycles/bvh/embree/common/simd/simd.h
D   intern/cycles/bvh/embree/common/simd/sse.h
D   intern/cycles/bvh/embree/common/simd/varying.h
D   intern/cycles/bvh/embree/common/simd/vboold4_avx.h
D   intern/cycles/bvh/embree/common/simd/vboold4_avx512.h
D   intern/cycles/bvh/embree/common/simd/vboold8_avx512.h
D   intern/cycles/bvh/embree/common/simd/vboolf16_avx512.h
D   intern/cycles/bvh/embree/common/simd/vboolf4_avx512.h
D   intern/cycles/bvh/embree/common/simd/vboolf4_sse2.h
D   intern/cycles/bvh/embree/common/simd/vboolf8_avx.h
D   intern/cycles/bvh/embree/common/simd/vboolf8_avx512.h
D   intern/cycles/bvh/embree/common/simd/vdouble4_avx.h
D   intern/cycles/bvh

[Bf-blender-cvs] [b0f08e8220b] soc-2019-embree-gpu: Cycle: Add linear boundbox interpolation on CPU

2019-08-11 Thread MATILLAT Quentin
Commit: b0f08e8220b7a1cc1ca1f297cd2393c053624abf
Author: MATILLAT Quentin
Date:   Sun Aug 11 12:17:17 2019 +0200
Branches: soc-2019-embree-gpu
https://developer.blender.org/rBb0f08e8220b7a1cc1ca1f297cd2393c053624abf

Cycle: Add linear boundbox interpolation on CPU

===

M   intern/cycles/kernel/bvh/bvh_local.h
M   intern/cycles/kernel/bvh/bvh_nodes.h
M   intern/cycles/kernel/bvh/bvh_shadow_all.h
M   intern/cycles/kernel/bvh/bvh_traversal.h
M   intern/cycles/kernel/bvh/bvh_volume.h
M   intern/cycles/kernel/bvh/bvh_volume_all.h

===

diff --git a/intern/cycles/kernel/bvh/bvh_local.h 
b/intern/cycles/kernel/bvh/bvh_local.h
index 98eb5a89c0e..71a8885f8da 100644
--- a/intern/cycles/kernel/bvh/bvh_local.h
+++ b/intern/cycles/kernel/bvh/bvh_local.h
@@ -143,6 +143,7 @@ ccl_device_inline
shufflexyz,
node_addr,
PATH_RAY_ALL_VISIBILITY,
+   ray->time,
dist);
 #endif  // __KERNEL_SSE2__
 
diff --git a/intern/cycles/kernel/bvh/bvh_nodes.h 
b/intern/cycles/kernel/bvh/bvh_nodes.h
index da613cc9f78..db9203ce328 100644
--- a/intern/cycles/kernel/bvh/bvh_nodes.h
+++ b/intern/cycles/kernel/bvh/bvh_nodes.h
@@ -190,34 +190,59 @@ int ccl_device_forceinline 
bvh_aligned_node_intersect(KernelGlobals *kg,
   const ssef Psplat[3],
   const ssef idirsplat[3],
   const shuffle_swap_t 
shufflexyz[3],
-  const int node_addr,
+  int node_addr,
   const uint visibility,
+  const float rayTime,
   float dist[2])
 {
   /* Intersect two child bounding boxes, SSE3 version adapted from Embree */
   const ssef pn = cast(ssei(0, 0, 0x8000, 0x8000));
 
   /* fetch node data */
-  const ssef *bvh_nodes = (ssef *)kg->__bvh_nodes.data + node_addr;
+  const ssef *bvh_nodes = (ssef *)kg->__bvh_nodes.data;
+
+  /* intersect ray against child nodes */
+  float4 cnodes = kernel_tex_fetch(__bvh_nodes, node_addr++);
+  ssef x = bvh_nodes[node_addr++];
+  ssef y = bvh_nodes[node_addr++];
+  ssef z = bvh_nodes[node_addr++];
+
+  if (__float_as_uint(cnodes.x) & PATH_RAY_NODE_MB) {
+const ssef dx = bvh_nodes[node_addr++];
+const ssef dy = bvh_nodes[node_addr++];
+const ssef dz = bvh_nodes[node_addr++];
+
+x += rayTime * dx;
+y += rayTime * dy;
+z += rayTime * dz;
+  }
 
   /* intersect ray against child nodes */
-  const ssef tminmaxx = (shuffle_swap(bvh_nodes[1], shufflexyz[0]) - 
Psplat[0]) * idirsplat[0];
-  const ssef tminmaxy = (shuffle_swap(bvh_nodes[2], shufflexyz[1]) - 
Psplat[1]) * idirsplat[1];
-  const ssef tminmaxz = (shuffle_swap(bvh_nodes[3], shufflexyz[2]) - 
Psplat[2]) * idirsplat[2];
+  const ssef tminmaxx = (shuffle_swap(x, shufflexyz[0]) - Psplat[0]) * 
idirsplat[0];
+  const ssef tminmaxy = (shuffle_swap(y, shufflexyz[1]) - Psplat[1]) * 
idirsplat[1];
+  const ssef tminmaxz = (shuffle_swap(z, shufflexyz[2]) - Psplat[2]) * 
idirsplat[2];
 
   /* calculate { c0min, c1min, -c0max, -c1max} */
   ssef minmax = max(max(tminmaxx, tminmaxy), max(tminmaxz, tsplat));
   const ssef tminmax = minmax ^ pn;
-  const sseb lrhit = tminmax <= shuffle<2, 3, 0, 1>(tminmax);
+  sseb lrhit = tminmax <= shuffle<2, 3, 0, 1>(tminmax);
 
   dist[0] = tminmax[0];
   dist[1] = tminmax[1];
 
+  if (__float_as_uint(cnodes.x) & PATH_RAY_NODE_4D) {
+const ssef timeLimit = bvh_nodes[node_addr++];
+
+const sseb timeMin = timeLimit < rayTime;
+const sseb timeMax = timeLimit > rayTime;
+
+lrhit &= timeMin & shuffle<2, 3, 0, 1>(timeMax);
+  }
+
   int mask = movemask(lrhit);
 
 #  ifdef __VISIBILITY_FLAG__
   /* this visibility test gives a 5% performance hit, how to solve? */
-  float4 cnodes = kernel_tex_fetch(__bvh_nodes, node_addr + 0);
   int cmask = (((mask & 1) && (__float_as_uint(cnodes.x) & visibility)) ? 1 : 
0) |
   (((mask & 2) && (__float_as_uint(cnodes.y) & visibility)) ? 2 : 
0);
   return cmask;
@@ -289,6 +314,7 @@ ccl_device_forceinline int bvh_node_intersect(KernelGlobals 
*kg,
   const shuffle_swap_t 
shufflexyz[3],
   const int node_addr,
   const uint visibility,
+  const float r

[Bf-blender-cvs] [c6bc309d0c3] soc-2019-embree-gpu: Add initial support for curve

2019-08-09 Thread MATILLAT Quentin
Commit: c6bc309d0c34464122e90b973225934c15165494
Author: MATILLAT Quentin
Date:   Fri Aug 9 16:19:56 2019 +0200
Branches: soc-2019-embree-gpu
https://developer.blender.org/rBc6bc309d0c34464122e90b973225934c15165494

Add initial support for curve

===

M   intern/cycles/bvh/bvh_embree_converter.cpp

===

diff --git a/intern/cycles/bvh/bvh_embree_converter.cpp 
b/intern/cycles/bvh/bvh_embree_converter.cpp
index 22a5ec11f06..fe851b8074f 100644
--- a/intern/cycles/bvh/bvh_embree_converter.cpp
+++ b/intern/cycles/bvh/bvh_embree_converter.cpp
@@ -183,6 +183,60 @@ BVHNode* createInstance(int nbPrim, unsigned int geomID[], 
const RTCBounds 
 return ret;
 }
 
+BVHNode* createCurve(unsigned int nbPrim, BVHPrimitive prims[], const 
RTCBounds , Data *userData) {
+const BoundBox bb = RTCBoundBoxToCCL(bounds);
+std::deque nodes;
+
+for(unsigned int i = 0; i < nbPrim; i++) {
+const auto geom_id = prims[i].geomID;
+const auto prim_id = prims[i].primID;
+
+const unsigned int object_id = geom_id / 2;
+Object *obj = userData->object.at(object_id);
+
+unsigned int curve_id = 0;
+int segment_id = prim_id;
+Mesh::Curve curve = obj->mesh->get_curve(0);
+while(segment_id >= curve.num_segments()) {
+curve = obj->mesh->get_curve(++curve_id);
+segment_id -= curve.num_segments();
+}
+
+int prim_type = PRIMITIVE_PACK_SEGMENT(PRIMITIVE_CURVE, segment_id);
+
+LeafNode *leafNode = new LeafNode(bb, obj->visibility, 
userData->packIdx, userData->packIdx + 1);
+packPush(userData->pack, userData->packIdx++, object_id, curve_id, 
prim_type, obj->visibility, -1);
+
+nodes.push_back(leafNode);
+}
+
+BVHNode *ret = nullptr;
+while(!nodes.empty()) {
+if(ret == nullptr) {
+ret = nodes.front();
+nodes.pop_front();
+continue;
+}
+
+/* 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, , 1);
+}
+
+InnerNode *innerNode = dynamic_cast(ret);
+innerNode->children[innerNode->num_children_++] = nodes.front();
+innerNode->bounds.grow(nodes.front()->bounds);
+nodes.pop_front();
+
+if(ret->num_children() == 4) {
+nodes.push_back(ret);
+ret = nullptr;
+}
+}
+
+return ret;
+}
+
 BVHNode* createAlignedNode(int nbChild, BVHNode* children[], const RTCBounds 
, const RTCBounds* deltaBounds, Data *userData) {
 BoundBox bb = RTCBoundBoxToCCL(bounds);
 InnerNode *ret = new InnerNode(bb, children, nbChild);
@@ -211,6 +265,10 @@ BVHNode* BVHEmbreeConverter::getBVH4() {
 return reinterpret_cast(createInstance(nbPrim, geomID, bounds, 
reinterpret_cast(userData)));
 };
 
+param.createCurve = [](unsigned int nbPrim, BVHPrimitive prims[], const 
RTCBounds , void* userData) -> void* {
+return reinterpret_cast(createCurve(nbPrim, prims, bounds, 
reinterpret_cast(userData)));
+};
+
 param.createAlignedNode = [](int nbChild, void* children[], const 
RTCBounds , const RTCBounds* deltaBounds, void* userData) -> void* {
 return reinterpret_cast(createAlignedNode(nbChild,
  
reinterpret_cast(children),
@@ -606,7 +664,7 @@ void BVHEmbreeConverter::fillPack(PackedBVH , 
vector objects) {
 // Additional size for unaligned nodes
 if (params.use_unaligned_nodes) {
 const size_t num_unaligned_nodes = 
root->getSubtreeSize(BVH_STAT_UNALIGNED_INNER_COUNT);
-node_size = num_unaligned_nodes * BVH_NODE_SIZE_UNALIGNED;
+node_size += num_unaligned_nodes * BVH_NODE_SIZE_UNALIGNED;
 }
 
 // Additional size for linear bound

___
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
https://lists.blender.org/mailman/listinfo/bf-blender-cvs


[Bf-blender-cvs] [e0cc40f93c6] soc-2019-embree-gpu: Move most of the export code to Embree

2019-08-02 Thread MATILLAT Quentin
Commit: e0cc40f93c64093fd6c42d8f9df1bb36280fe6f3
Author: MATILLAT Quentin
Date:   Fri Aug 2 18:49:45 2019 +0200
Branches: soc-2019-embree-gpu
https://developer.blender.org/rBe0cc40f93c64093fd6c42d8f9df1bb36280fe6f3

Move most of the export code to Embree

Need to be compiled with a modified version of Embree available on
github: https://github.com/tinou98/embree

===

M   intern/cycles/bvh/bvh_embree_converter.cpp
M   intern/cycles/bvh/bvh_embree_converter.h

===

diff --git a/intern/cycles/bvh/bvh_embree_converter.cpp 
b/intern/cycles/bvh/bvh_embree_converter.cpp
index e9e72aa1f6b..22a5ec11f06 100644
--- a/intern/cycles/bvh/bvh_embree_converter.cpp
+++ b/intern/cycles/bvh/bvh_embree_converter.cpp
@@ -44,16 +44,10 @@ void packPush(PackedBVH *pack, const size_t packIdx, const 
int object_id, const
 
 }
 
-void pushVec(PackedBVH *pack, const embree::Vec3f p0, const embree::Vec3f p1, 
const embree::Vec3f p2) {
-pack->prim_tri_verts.push_back_slow(make_float4(p0.x, p0.y, p0.z, 1));
-pack->prim_tri_verts.push_back_slow(make_float4(p1.x, p1.y, p1.z, 1));
-pack->prim_tri_verts.push_back_slow(make_float4(p2.x, p2.y, p2.z, 1));
-}
-
-ccl::BoundBox RTCBoundBoxToCCL(const embree::BBox3fa ) {
+ccl::BoundBox RTCBoundBoxToCCL(const RTCBounds ) {
 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));
+make_float3(bound.lower_x, bound.lower_y, bound.lower_z),
+make_float3(bound.upper_x, bound.upper_y, bound.upper_z));
 
 }
 
@@ -110,275 +104,122 @@ BVHNode *bvh_shrink(BVHNode *root) {
 }
 
 BVHEmbreeConverter::BVHEmbreeConverter(RTCScene scene, std::vector 
objects, const BVHParams )
-: s(reinterpret_cast(scene)),
+: s(scene),
   objects(objects),
   params(params) {}
 
-template<>
-std::deque BVHEmbreeConverter::handleLeaf(const 
embree::BVH4::NodeRef , const BoundBox ) {
-size_t from = this->packIdx,
-size = 0;
 
-size_t nb;
-embree::Triangle4i *prims = reinterpret_cast(node.leaf(nb));
+struct Data {
+unsigned int packIdx = 0;
+std::vector object;
+PackedBVH *pack;
+};
+
+BVHNode* createLeaf(unsigned int nbPrim, BVHPrimitive prims[], const RTCBounds 
, Data *userData) {
+const BoundBox bb = RTCBoundBoxToCCL(bounds);
+const unsigned int from = userData->packIdx;
 
 uint visibility = 0;
-for(size_t i = 0; i < nb; i++) {
-for(size_t j = 0; j < prims[i].size(); j++) {
-size++;
-const auto geom_id = prims[i].geomID(j);
-const auto prim_id = prims[i].primID(j);
-
-const int object_id = geom_id / 2;
-Object *obj = this->objects.at(object_id);
-Mesh::Triangle tri = obj->mesh->get_triangle(prim_id);
-
-int prim_type = obj->mesh->has_motion_blur() ? 
PRIMITIVE_MOTION_TRIANGLE : PRIMITIVE_TRIANGLE;
-
-visibility |= obj->visibility;
-packPush(this->pack, this->packIdx++, object_id, prim_id, 
prim_type, obj->visibility, this->pack->prim_tri_verts.size());
-
-/*
-pushVec(this->pack,
-prims[i].getVertex(prims[i].v0, j, this->s),
-prims[i].getVertex(prims[i].v1, j, this->s),
-prims[i].getVertex(prims[i].v2, j, this->s));
-*/
-
-
this->pack->prim_tri_verts.push_back_slow(float3_to_float4(obj->mesh->verts[tri.v[0]]));
-
this->pack->prim_tri_verts.push_back_slow(float3_to_float4(obj->mesh->verts[tri.v[1]]));
-
this->pack->prim_tri_verts.push_back_slow(float3_to_float4(obj->mesh->verts[tri.v[2]]));
-
-/*
-std::cout << "Vertex " << prim_id << " "
-  << prims[i].getVertex(prims[i].v0, j, this->s) << ", "
-  << prims[i].getVertex(prims[i].v1, j, this->s) << ", "
-  << prims[i].getVertex(prims[i].v2, j, this->s) << 
std::endl;
-
-std::cout << "VERTEX " << prim_id << " "
-  << "(" << obj->mesh->verts[tri.v[0]].x << ", " << 
obj->mesh->verts[tri.v[0]].y << ", " << obj->mesh->verts[tri.v[0]].z << "), "
-  << "(" << obj->mesh->verts[tri.v[1]].x << ", " << 
obj->mesh->verts[tri.v[1]].y << ", " << obj->mesh->verts[tri.v[1]].z << "), "
-  << 

[Bf-blender-cvs] [ad6db67771f] soc-2019-embree-gpu: Add support for linear interpolation on bounding box

2019-07-26 Thread MATILLAT Quentin
Commit: ad6db67771ff82ad79d99c00070b7d0ced15a65f
Author: MATILLAT Quentin
Date:   Fri Jul 26 12:16:10 2019 +0200
Branches: soc-2019-embree-gpu
https://developer.blender.org/rBad6db67771ff82ad79d99c00070b7d0ced15a65f

Add support for linear interpolation on bounding box

===

M   intern/cycles/bvh/bvh2.cpp
M   intern/cycles/bvh/bvh2.h
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_nodes.h
M   intern/cycles/kernel/kernel_types.h

===

diff --git a/intern/cycles/bvh/bvh2.cpp b/intern/cycles/bvh/bvh2.cpp
index ed355f16efa..6a2875adaac 100644
--- a/intern/cycles/bvh/bvh2.cpp
+++ b/intern/cycles/bvh/bvh2.cpp
@@ -76,8 +76,6 @@ void BVH2::pack_aligned_inner(const BVHStackEntry ,
 e1.node->bounds,
 e0.encodeIdx(),
 e1.encodeIdx(),
-make_float2(e0.node->time_from, e0.node->time_to),
-make_float2(e1.node->time_from, e1.node->time_to),
 e0.node->visibility,
 e1.node->visibility);
 }
@@ -87,8 +85,6 @@ void BVH2::pack_aligned_node(int idx,
  const BoundBox ,
  int c0,
  int c1,
- float2 time0,
- float2 time1,
  uint visibility0,
  uint visibility1)
 {
@@ -96,19 +92,9 @@ void BVH2::pack_aligned_node(int idx,
   assert(c0 < 0 || c0 < pack.nodes.size());
   assert(c1 < 0 || c1 < pack.nodes.size());
 
-  if(time0.x > 0 || time0.y < 1)
-  visibility0 |= PATH_RAY_NODE_4D;
-  else
-  visibility0 &= ~PATH_RAY_NODE_4D;
-
-  if(time1.x > 0 || time1.y < 1)
-  visibility1 |= PATH_RAY_NODE_4D;
-  else
-  visibility1 &= ~PATH_RAY_NODE_4D;
-
   int4 data[BVH_NODE_SIZE] = {
   make_int4(
-  visibility0 & ~PATH_RAY_NODE_UNALIGNED, visibility1 & 
~PATH_RAY_NODE_UNALIGNED, c0, c1),
+  visibility0 & ~PATH_RAY_NODE_CLEAR, visibility1 & 
~PATH_RAY_NODE_CLEAR, c0, c1),
   make_int4(__float_as_int(b0.min.x),
 __float_as_int(b1.min.x),
 __float_as_int(b0.max.x),
@@ -121,10 +107,6 @@ 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(time0.x),
-__float_as_int(time1.x),
-__float_as_int(time0.y),
-__float_as_int(time1.y)),
   };
 
   memcpy([idx], data, sizeof(int4) * BVH_NODE_SIZE);
@@ -162,8 +144,8 @@ void BVH2::pack_unaligned_node(int idx,
   float4 data[BVH_UNALIGNED_NODE_SIZE];
   Transform space0 = BVHUnaligned::compute_node_transform(bounds0, 
aligned_space0);
   Transform space1 = BVHUnaligned::compute_node_transform(bounds1, 
aligned_space1);
-  data[0] = make_float4(__int_as_float(visibility0 | PATH_RAY_NODE_UNALIGNED),
-__int_as_float(visibility1 | PATH_RAY_NODE_UNALIGNED),
+  data[0] = make_float4(__int_as_float((visibility0 & ~PATH_RAY_NODE_CLEAR) | 
PATH_RAY_NODE_UNALIGNED),
+__int_as_float((visibility1 & ~PATH_RAY_NODE_CLEAR) | 
PATH_RAY_NODE_UNALIGNED),
 __int_as_float(c0),
 __int_as_float(c1));
 
@@ -303,8 +285,6 @@ void BVH2::refit_node(int idx, bool leaf, BoundBox , 
uint )
   pack_aligned_node(idx,
 bbox0, bbox1,
 c0, c1,
-make_float2(__int_as_float(data[4].x), 
__int_as_float(data[4].z)),
-make_float2(__int_as_float(data[4].y), 
__int_as_float(data[4].w)),
 visibility0, visibility1);
 }
 
diff --git a/intern/cycles/bvh/bvh2.h b/intern/cycles/bvh/bvh2.h
index 3a371a1d79c..c6a4e6fa73a 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+1)
+#define BVH_NODE_SIZE 4
 #define BVH_NODE_LEAF_SIZE 1
 #define BVH_UNALIGNED_NODE_SIZE 7
 
@@ -65,8 +65,6 @@ class BVH2 : public BVH {
  const BoundBox ,
  int c0,
  int c1,
- float2 time0,
- float2 time1,
  uint visibility0,
  uint visibility1);
 
diff --git a/intern/cycles/bvh/bvh_embree_converter.cpp 
b/intern/cycles/bvh/bvh_embree_converter.cpp
index 162485a621a..e9e72aa1f6b 100644
--- a/intern/cycles/bvh/bvh_embree_co

[Bf-blender-cvs] [12ad52c887b] soc-2019-embree-gpu: Pre-reserve memory to reduce reallocation

2019-07-19 Thread MATILLAT Quentin
Commit: 12ad52c887b889c6a1abfd3c28c6f16486eed681
Author: MATILLAT Quentin
Date:   Fri Jul 19 11:32:02 2019 +0200
Branches: soc-2019-embree-gpu
https://developer.blender.org/rB12ad52c887b889c6a1abfd3c28c6f16486eed681

Pre-reserve memory to reduce reallocation

===

M   intern/cycles/bvh/bvh_embree_converter.cpp

===

diff --git a/intern/cycles/bvh/bvh_embree_converter.cpp 
b/intern/cycles/bvh/bvh_embree_converter.cpp
index 6b92e2bc008..162485a621a 100644
--- a/intern/cycles/bvh/bvh_embree_converter.cpp
+++ b/intern/cycles/bvh/bvh_embree_converter.cpp
@@ -671,11 +671,25 @@ void pack_inner(const BVHStackEntry , const 
BVHStackEntry , const BVHStackE
 }
 
 void BVHEmbreeConverter::fillPack(PackedBVH , vector objects) {
+int num_prim = 0;
+
+for (size_t i = 0; i < this->s->size(); i++) {
+   const auto tree = this->s->get(i);
+if(tree != nullptr)
+num_prim += 4 * tree->size();
+}
+
 pack.prim_visibility.clear();
+pack.prim_visibility.reserve(num_prim);
 pack.prim_object.clear();
+pack.prim_object.reserve(num_prim);
 pack.prim_type.clear();
+pack.prim_type.reserve(num_prim);
 pack.prim_index.clear();
+pack.prim_index.reserve(num_prim);
 pack.prim_tri_index.clear();
+pack.prim_tri_index.reserve(num_prim);
+
 pack.prim_tri_verts.clear();
 
 this->pack = 

___
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
https://lists.blender.org/mailman/listinfo/bf-blender-cvs


[Bf-blender-cvs] [0317d3083dd] soc-2019-embree-gpu: Directly fill packed structure

2019-07-18 Thread MATILLAT Quentin
Commit: 0317d3083dd35ec03400f5fc58c77fa0faa22a6a
Author: MATILLAT Quentin
Date:   Thu Jul 18 15:16:34 2019 +0200
Branches: soc-2019-embree-gpu
https://developer.blender.org/rB0317d3083dd35ec03400f5fc58c77fa0faa22a6a

Directly fill packed structure

Lead to slightly better performance than internal builder on scene that
use motion blur

===

M   intern/cycles/bvh/bvh_embree.cpp
M   intern/cycles/bvh/bvh_embree_converter.cpp
M   intern/cycles/bvh/bvh_embree_converter.h

===

diff --git a/intern/cycles/bvh/bvh_embree.cpp b/intern/cycles/bvh/bvh_embree.cpp
index 7a2a4b2d984..6a1c2c90489 100644
--- a/intern/cycles/bvh/bvh_embree.cpp
+++ b/intern/cycles/bvh/bvh_embree.cpp
@@ -485,21 +485,19 @@ void BVHEmbree::build(Progress , Stats *stats_)
   rtcSetSceneProgressMonitorFunction(scene, rtc_progress_func, );
   rtcCommitScene(scene);
 
-  pack_primitives();
-
-  if (progress.get_cancel()) {
-delete_rtcScene();
-stats = NULL;
-return;
-  }
-
   progress.set_substatus("Packing geometry");
   if(this->bvh_layout == BVH_LAYOUT_EMBREE_CONVERTED) {
 BVHEmbreeConverter conv(scene, objects, this->params);
-BVHNode *root = conv.getBVH2();
-BVH2::pack_nodes(root);
-root->deleteSubtree();
+conv.fillPack(this->pack, this->objects);
   } else {
+pack_primitives();
+
+if (progress.get_cancel()) {
+  delete_rtcScene();
+  stats = NULL;
+  return;
+}
+
 pack_nodes(NULL);
   }
 
@@ -821,135 +819,131 @@ void BVHEmbree::add_curves(Object *ob, int i)
 
 void BVHEmbree::pack_nodes(const BVHNode *r)
 {
-  if(this->bvh_layout == BVH_LAYOUT_EMBREE_CONVERTED) {
-BVH2::pack_nodes(r);
-  } else {
-  /* Quite a bit of this code is for compatibility with Cycles' native 
BVH. */
-  if (!params.top_level) {
-  return;
-  }
-
-  for (size_t i = 0; i < pack.prim_index.size(); ++i) {
-  if (pack.prim_index[i] != -1) {
-  if (pack.prim_type[i] & PRIMITIVE_ALL_CURVE)
-  pack.prim_index[i] += 
objects[pack.prim_object[i]]->mesh->curve_offset;
-  else
-  pack.prim_index[i] += 
objects[pack.prim_object[i]]->mesh->tri_offset;
-  }
-  }
+  /* Quite a bit of this code is for compatibility with Cycles' native BVH. */
+  if (!params.top_level) {
+return;
+  }
 
-  size_t prim_offset = pack.prim_index.size();
+  for (size_t i = 0; i < pack.prim_index.size(); ++i) {
+if (pack.prim_index[i] != -1) {
+  if (pack.prim_type[i] & PRIMITIVE_ALL_CURVE)
+pack.prim_index[i] += objects[pack.prim_object[i]]->mesh->curve_offset;
+  else
+pack.prim_index[i] += objects[pack.prim_object[i]]->mesh->tri_offset;
+}
+  }
 
-  /* reserve */
-  size_t prim_index_size = pack.prim_index.size();
-  size_t prim_tri_verts_size = pack.prim_tri_verts.size();
+  size_t prim_offset = pack.prim_index.size();
 
-  size_t pack_prim_index_offset = prim_index_size;
-  size_t pack_prim_tri_verts_offset = prim_tri_verts_size;
-  size_t object_offset = 0;
+  /* reserve */
+  size_t prim_index_size = pack.prim_index.size();
+  size_t prim_tri_verts_size = pack.prim_tri_verts.size();
 
-  map mesh_map;
+  size_t pack_prim_index_offset = prim_index_size;
+  size_t pack_prim_tri_verts_offset = prim_tri_verts_size;
+  size_t object_offset = 0;
 
-  foreach (Object *ob, objects) {
-  Mesh *mesh = ob->mesh;
-  BVH *bvh = mesh->bvh;
+  map mesh_map;
 
-  if (mesh->need_build_bvh()) {
-  if (mesh_map.find(mesh) == mesh_map.end()) {
-  prim_index_size += bvh->pack.prim_index.size();
-  prim_tri_verts_size += bvh->pack.prim_tri_verts.size();
-  mesh_map[mesh] = 1;
-  }
-  }
+  foreach (Object *ob, objects) {
+Mesh *mesh = ob->mesh;
+BVH *bvh = mesh->bvh;
+
+if (mesh->need_build_bvh()) {
+  if (mesh_map.find(mesh) == mesh_map.end()) {
+prim_index_size += bvh->pack.prim_index.size();
+prim_tri_verts_size += bvh->pack.prim_tri_verts.size();
+mesh_map[mesh] = 1;
   }
+}
+  }
 
-  mesh_map.clear();
+  mesh_map.clear();
 
-  pack.prim_index.resize(prim_index_size);
-  pack.prim_type.resize(prim_index_size);
-  pack.prim_object.resize(prim_index_size);
-  pack.prim_visibility.clear();
-  pack.prim_tri_verts.resize(prim_tri_verts_size);
-  pack.prim_tri_index.resize(prim_index_size);
-  pack.object_node.resize(objects.size());
+  pack.prim_index.resize(prim_index_size);
+  pack.prim_type.resize(prim_index_size);
+  pack.prim_object.resize(prim_index_size);
+  pack.prim_visibility.clear();
+  pack.prim_tri_verts.resize(prim_tri_verts_size);
+  pack.prim_tri_index.re

[Bf-blender-cvs] [e013a24d072] soc-2019-embree-gpu: Add a visibility flag for time node

2019-07-13 Thread MATILLAT Quentin
Commit: e013a24d0725ea7aa64faec11c2b4873e1622c73
Author: MATILLAT Quentin
Date:   Sat Jul 13 12:51:37 2019 +0200
Branches: soc-2019-embree-gpu
https://developer.blender.org/rBe013a24d0725ea7aa64faec11c2b4873e1622c73

Add a visibility flag for time node

This should help to reduce computation overhead for non time node

===

M   intern/cycles/bvh/bvh2.cpp
M   intern/cycles/bvh/bvh_embree.cpp
M   intern/cycles/bvh/bvh_embree_converter.cpp
M   intern/cycles/bvh/bvh_node.cpp
M   intern/cycles/bvh/bvh_node.h
M   intern/cycles/kernel/bvh/bvh_nodes.h
M   intern/cycles/kernel/bvh/bvh_traversal.h
M   intern/cycles/kernel/kernel_types.h

===

diff --git a/intern/cycles/bvh/bvh2.cpp b/intern/cycles/bvh/bvh2.cpp
index 0475ac33887..ed355f16efa 100644
--- a/intern/cycles/bvh/bvh2.cpp
+++ b/intern/cycles/bvh/bvh2.cpp
@@ -96,6 +96,16 @@ void BVH2::pack_aligned_node(int idx,
   assert(c0 < 0 || c0 < pack.nodes.size());
   assert(c1 < 0 || c1 < pack.nodes.size());
 
+  if(time0.x > 0 || time0.y < 1)
+  visibility0 |= PATH_RAY_NODE_4D;
+  else
+  visibility0 &= ~PATH_RAY_NODE_4D;
+
+  if(time1.x > 0 || time1.y < 1)
+  visibility1 |= PATH_RAY_NODE_4D;
+  else
+  visibility1 &= ~PATH_RAY_NODE_4D;
+
   int4 data[BVH_NODE_SIZE] = {
   make_int4(
   visibility0 & ~PATH_RAY_NODE_UNALIGNED, visibility1 & 
~PATH_RAY_NODE_UNALIGNED, c0, c1),
diff --git a/intern/cycles/bvh/bvh_embree.cpp b/intern/cycles/bvh/bvh_embree.cpp
index 2be512d38c8..7a2a4b2d984 100644
--- a/intern/cycles/bvh/bvh_embree.cpp
+++ b/intern/cycles/bvh/bvh_embree.cpp
@@ -496,7 +496,9 @@ void BVHEmbree::build(Progress , Stats *stats_)
   progress.set_substatus("Packing geometry");
   if(this->bvh_layout == BVH_LAYOUT_EMBREE_CONVERTED) {
 BVHEmbreeConverter conv(scene, objects, this->params);
-pack_nodes(conv.getBVH2());
+BVHNode *root = conv.getBVH2();
+BVH2::pack_nodes(root);
+root->deleteSubtree();
   } else {
 pack_nodes(NULL);
   }
diff --git a/intern/cycles/bvh/bvh_embree_converter.cpp 
b/intern/cycles/bvh/bvh_embree_converter.cpp
index b93b6039c54..fc20f4062a8 100644
--- a/intern/cycles/bvh/bvh_embree_converter.cpp
+++ b/intern/cycles/bvh/bvh_embree_converter.cpp
@@ -83,7 +83,7 @@ BVHNode *bvh_shrink(BVHNode *root) {
 if(root->num_children() == 3) {
 node->children[1] = bvh_shrink(node->children[2]);
 } else {
-   node->children[1] = new InnerNode(merge(node->children[2]->bounds, 
node->children[3]->bounds), bvh_shrink(node->children[2]), 
bvh_shrink(node->children[3]));
+node->children[1] = new InnerNode(merge(node->children[2]->bounds, 
node->children[3]->bounds), bvh_shrink(node->children[2]), 
bvh_shrink(node->children[3]));
 }
 node->num_children_ = 2;
 return node;
@@ -114,7 +114,6 @@ std::deque 
BVHEmbreeConverter::handleLeaf(const em
 /* 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));
 }
 }
@@ -298,7 +297,7 @@ BVHNode* BVHEmbreeConverter::getBVH4() {
 embree::BVH4::NodeRef root = bvh->root;
 BVHNode *rootNode = nullptr;
 if(bvh->primTy == ::Triangle4v::type) {
-rootNode = this->nodeEmbreeToCcl(root, 
RTCBoundBoxToCCL(bvh->bounds.bounds()));
+rootNode = nodeEmbreeToCcl(root, 
RTCBoundBoxToCCL(bvh->bounds.bounds()));
 } else if(bvh->primTy == ::InstancePrimitive::type) {
 rootNode = nodeEmbreeToCcl(root, 
RTCBoundBoxToCCL(bvh->bounds.bounds()));
 } else if(bvh->primTy == ::Triangle4i::type) {
@@ -325,6 +324,23 @@ BVHNode* BVHEmbreeConverter::getBVH4() {
 return new InnerNode(bb, nodes.data(), nodes.size());
 }
 
+BoundBox bvh_tighten(BVHNode *root) {
+if(root->is_leaf())
+return root->bounds;
+
+assert(root->num_children() == 2);
+BoundBox bb = BoundBox::empty;
+for(int i = 0; i < root->num_children(); i++) {
+bb.grow(bvh_tighten(root->get_child(i)));
+}
+
+if(std::abs(root->bounds.area() - bb.area()) > .05f) {
+std::cout << "Area " << root->bounds.area() << "\t" << bb.area() << 
std::endl;
+}
+root->bounds.intersect(bb);
+return root->bounds;
+}
+
 BVHNode* BVHEmbreeConverter::getBVH2() {
 BVHNode *root = this->getBVH4();
 std::cout << root->getSubtreeSize(BVH_STAT_TIMELIMIT_NODE) << " times 
nodes" << std::endl;
@@ -332,6 +348,8 @@ BVHNode* BVHEmbreeConvert

[Bf-blender-cvs] [6f25eda4d7f] soc-2019-embree-gpu: Update timing information

2019-07-11 Thread MATILLAT Quentin
Commit: 6f25eda4d7f60f04e5cd54c9f199ee499763d7c1
Author: MATILLAT Quentin
Date:   Thu Jul 11 15:05:32 2019 +0200
Branches: soc-2019-embree-gpu
https://developer.blender.org/rB6f25eda4d7f60f04e5cd54c9f199ee499763d7c1

Update timing information

Timing information are now stored using the same system as visibility :
Each node store information from his children

===

M   intern/cycles/bvh/bvh2.cpp
M   intern/cycles/bvh/bvh2.h
M   intern/cycles/bvh/bvh_embree_converter.cpp
M   intern/cycles/bvh/bvh_node.cpp
M   intern/cycles/kernel/bvh/bvh_local.h
M   intern/cycles/kernel/bvh/bvh_nodes.h
M   intern/cycles/kernel/bvh/bvh_shadow_all.h
M   intern/cycles/kernel/bvh/bvh_traversal.h
M   intern/cycles/kernel/bvh/bvh_volume.h
M   intern/cycles/kernel/bvh/bvh_volume_all.h

===

diff --git a/intern/cycles/bvh/bvh2.cpp b/intern/cycles/bvh/bvh2.cpp
index edec6a9aebe..0475ac33887 100644
--- a/intern/cycles/bvh/bvh2.cpp
+++ b/intern/cycles/bvh/bvh2.cpp
@@ -76,8 +76,8 @@ void BVH2::pack_aligned_inner(const BVHStackEntry ,
 e1.node->bounds,
 e0.encodeIdx(),
 e1.encodeIdx(),
-e.node->time_from,
-e.node->time_to,
+make_float2(e0.node->time_from, e0.node->time_to),
+make_float2(e1.node->time_from, e1.node->time_to),
 e0.node->visibility,
 e1.node->visibility);
 }
@@ -87,8 +87,8 @@ void BVH2::pack_aligned_node(int idx,
  const BoundBox ,
  int c0,
  int c1,
- float timeFrom,
- float timeTo,
+ float2 time0,
+ float2 time1,
  uint visibility0,
  uint visibility1)
 {
@@ -111,9 +111,10 @@ 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),
+  make_int4(__float_as_int(time0.x),
+__float_as_int(time1.x),
+__float_as_int(time0.y),
+__float_as_int(time1.y)),
   };
 
   memcpy([idx], data, sizeof(int4) * BVH_NODE_SIZE);
@@ -289,7 +290,12 @@ void BVH2::refit_node(int idx, bool leaf, BoundBox , 
uint )
   idx, aligned_space, aligned_space, bbox0, bbox1, c0, c1, 
visibility0, visibility1);
 }
 else {
-  pack_aligned_node(idx, bbox0, bbox1, c0, c1, __int_as_float(data[4].x), 
__int_as_float(data[4].y), visibility0, visibility1);
+  pack_aligned_node(idx,
+bbox0, bbox1,
+c0, c1,
+make_float2(__int_as_float(data[4].x), 
__int_as_float(data[4].z)),
+make_float2(__int_as_float(data[4].y), 
__int_as_float(data[4].w)),
+visibility0, visibility1);
 }
 
 bbox.grow(bbox0);
diff --git a/intern/cycles/bvh/bvh2.h b/intern/cycles/bvh/bvh2.h
index 08938a04bc1..3a371a1d79c 100644
--- a/intern/cycles/bvh/bvh2.h
+++ b/intern/cycles/bvh/bvh2.h
@@ -65,8 +65,8 @@ class BVH2 : public BVH {
  const BoundBox ,
  int c0,
  int c1,
- float timeFrom,
- float timeTo,
+ float2 time0,
+ float2 time1,
  uint visibility0,
  uint visibility1);
 
diff --git a/intern/cycles/bvh/bvh_embree_converter.cpp 
b/intern/cycles/bvh/bvh_embree_converter.cpp
index b9e2ca6954d..b93b6039c54 100644
--- a/intern/cycles/bvh/bvh_embree_converter.cpp
+++ b/intern/cycles/bvh/bvh_embree_converter.cpp
@@ -330,6 +330,7 @@ BVHNode* BVHEmbreeConverter::getBVH2() {
 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 << root->getSubtreeSize(BVH_STAT_TIMELIMIT_NODE) << " times 
nodes" << std::endl;
 std::cout << "BVH2 SAH is " << root->computeSubtreeSAHCost(this->params) 
<< std::endl;
 return root;
 }
diff --git a/intern/cycles/bvh/bvh_node.cpp b/intern/cycles/bvh/bvh_node.cpp
index 0e3db43ecb1..413f5befcca 100644
--- a/intern/cycles/bvh/bvh_node.cpp
+++ b/intern/cycles/bvh/bvh_node.cpp
@@ -92,7 +92,7 @@ int BVHNode::getSubtreeSize(BVH_ST

[Bf-blender-cvs] [4510849e3d8] soc-2019-embree-gpu: Add time limits for each nodes

2019-07-11 Thread MATILLAT Quentin
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 ,
 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 ,
  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([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 , 
uint )
   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 ,
  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 groupByRange(std::vector ) {
 std::sort(ids.begin(), ids.end(), [](const RangeInput , const 
RangeInput ) -> bool {
-return lhs.id > rhs.id;
+return lhs.id < rhs.id;
 });
 std::stack groups;
 
@@ -94,11 +94,10 @@ BVHEmbreeConverter::BVHEmbreeConverter(RTCScene scene, 
std::vector obj
   objects(objects),
   params(params) {}
 
-
-template
-std::deque BVHEmbreeConverter::handleLeaf(const 
embree::BVH4::NodeRef , const BoundBox &) {
+template<>
+std::deque BVHEmbreeConverter::handleLeaf(const 
embree::BVH4::NodeRef , const BoundBox ) {
 size_t nb;
-Primitive *prims = reinterpret_cast(node.leaf(nb));
+embree::Triangle4i *prims = reinterpret_cast(node.leaf(nb));
 std::vector ids; ids.reser

[Bf-blender-cvs] [1480ef3107a] soc-2019-embree-gpu: Add support for Triangle4i and InstancedPrimitive

2019-07-04 Thread MATILLAT Quentin
Commit: 1480ef3107accb19827d3bbfe41f92c93c07c5ea
Author: MATILLAT Quentin
Date:   Thu Jul 4 13:15:05 2019 +0200
Branches: soc-2019-embree-gpu
https://developer.blender.org/rB1480ef3107accb19827d3bbfe41f92c93c07c5ea

Add support for Triangle4i and InstancedPrimitive

===

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/render/object.h
M   release/scripts/addons
M   release/scripts/addons_contrib

===

diff --git a/intern/cycles/bvh/bvh_embree.cpp b/intern/cycles/bvh/bvh_embree.cpp
index 9e6f6a07294..2fb216ad88c 100644
--- a/intern/cycles/bvh/bvh_embree.cpp
+++ b/intern/cycles/bvh/bvh_embree.cpp
@@ -527,6 +527,8 @@ void BVHEmbree::add_instance(Object *ob, int i)
 assert(0);
 return;
   }
+  ob->pack_index = pack.prim_index.size();
+
   BVHEmbree *instance_bvh = (BVHEmbree *)(ob->mesh->bvh);
 
   if (instance_bvh->top_level != this) {
diff --git a/intern/cycles/bvh/bvh_embree_converter.cpp 
b/intern/cycles/bvh/bvh_embree_converter.cpp
index 567390b3f7c..77dbcdc6747 100644
--- a/intern/cycles/bvh/bvh_embree_converter.cpp
+++ b/intern/cycles/bvh/bvh_embree_converter.cpp
@@ -40,8 +40,8 @@ struct RangeInput {
 
 std::stack groupByRange(std::vector ) {
 std::sort(ids.begin(), ids.end(), [](const RangeInput , const 
RangeInput ) -> bool {
-   return lhs.id > rhs.id;
-   });
+return lhs.id > rhs.id;
+});
 std::stack groups;
 
 for(const RangeInput  : ids) {
@@ -68,10 +68,17 @@ ccl::BoundBox RTCBoundBoxToCCL(const embree::BBox3fa 
) {
 }
 
 BVHNode *bvh_shrink(BVHNode *root) {
-if(root->num_children() <= 2) return root;
+if(root->is_leaf()) return root;
 
 InnerNode *node = dynamic_cast(root);
 
+if(node->num_children() == 1) return bvh_shrink(root->get_child(0));
+if(node->num_children() <= 2) {
+node->children[0] = bvh_shrink(node->children[0]);
+node->children[1] = bvh_shrink(node->children[1]);
+return node;
+}
+
 node->children[0] = new InnerNode(merge(node->children[0]->bounds, 
node->children[1]->bounds), bvh_shrink(node->children[0]), 
bvh_shrink(node->children[1]));
 if(root->num_children() == 3) {
 node->children[1] = bvh_shrink(node->children[2]);
@@ -88,39 +95,61 @@ BVHEmbreeConverter::BVHEmbreeConverter(RTCScene scene, 
std::vector obj
   params(params) {}
 
 
-template<>
-std::deque BVHEmbreeConverter::handleLeaf(const 
embree::BVH4::NodeRef , const BoundBox &) {
-size_t nb;
-embree::Triangle4v *prims = reinterpret_cast(node.leaf(nb));
-std::vector ids; ids.reserve(nb * 4);
+template
+std::deque BVHEmbreeConverter::handleLeaf(const 
embree::BVH4::NodeRef , const BoundBox &) {
+size_t nb;
+Primitive *prims = reinterpret_cast(node.leaf(nb));
+std::vector 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);
 
-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);
 
-embree::Geometry *g = s->get(geom_id);
+size_t prim_offset = reinterpret_cast(g->getUserData());
 
-size_t prim_offset = 
reinterpret_cast(g->getUserData());
+Object *obj = this->objects.at(geom_id / 2);
+Mesh *m = obj->mesh;
+BoundBox bb = BoundBox::empty;
 
-Object *obj = this->objects.at(geom_id / 2);
-Mesh *m = obj->mesh;
-BoundBox bb = BoundBox::empty;//obj->bounds;
-m->get_triangle(prim_id).bounds_grow(m->verts.data(), bb);
+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;
 
-ids.push_back(RangeInput(prim_offset + prim_id, 
objects.at(geom_id / 2)->visibility, bb));
+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;
+}
 }
-}
 
-std::stack leafs = groupByRange(

[Bf-blender-cvs] [1671d033d8c] soc-2019-embree-gpu: Add missing header

2019-07-02 Thread MATILLAT Quentin
Commit: 1671d033d8c8eef1f1835e5dace5c398be444034
Author: MATILLAT Quentin
Date:   Tue Jul 2 18:37:28 2019 +0200
Branches: soc-2019-embree-gpu
https://developer.blender.org/rB1671d033d8c8eef1f1835e5dace5c398be444034

Add missing header

===

A   intern/cycles/bvh/embree/kernels/config.h

===

diff --git a/intern/cycles/bvh/embree/kernels/config.h 
b/intern/cycles/bvh/embree/kernels/config.h
new file mode 100644
index 000..7b1ecc48be3
--- /dev/null
+++ b/intern/cycles/bvh/embree/kernels/config.h
@@ -0,0 +1,79 @@
+//  //
+// Copyright 2009-2016 Intel Corporation//
+//  //
+// Licensed under the Apache License, Version 2.0 (the "License");  //
+// you may not use this file except in compliance with the License. //
+// You may obtain a copy of the License at  //
+//  //
+// http://www.apache.org/licenses/LICENSE-2.0   //
+//  //
+// Unless required by applicable law or agreed to in writing, software  //
+// distributed under the License is distributed on an "AS IS" BASIS,//
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //
+// See the License for the specific language governing permissions and  //
+// limitations under the License.   //
+//  //
+
+/* #undef EMBREE_RAY_MASK */
+/* #undef EMBREE_STAT_COUNTERS */
+/* #undef EMBREE_BACKFACE_CULLING */
+#define EMBREE_FILTER_FUNCTION
+/* #undef EMBREE_RETURN_SUBDIV_NORMAL */
+/* #undef EMBREE_IGNORE_INVALID_RAYS */
+#define EMBREE_GEOMETRY_TRIANGLE
+#define EMBREE_GEOMETRY_QUAD
+#define EMBREE_GEOMETRY_CURVE
+#define EMBREE_GEOMETRY_SUBDIVISION
+#define EMBREE_GEOMETRY_USER
+#define EMBREE_GEOMETRY_INSTANCE
+#define EMBREE_GEOMETRY_GRID
+#define EMBREE_GEOMETRY_POINT
+#define EMBREE_RAY_PACKETS
+
+#define EMBREE_CURVE_SELF_INTERSECTION_AVOIDANCE_FACTOR 2.0
+
+#if defined(EMBREE_GEOMETRY_TRIANGLE)
+  #define IF_ENABLED_TRIS(x) x
+#else
+  #define IF_ENABLED_TRIS(x)
+#endif
+
+#if defined(EMBREE_GEOMETRY_QUAD)
+  #define IF_ENABLED_QUADS(x) x
+#else
+  #define IF_ENABLED_QUADS(x)
+#endif
+
+#if defined(EMBREE_GEOMETRY_CURVE) || defined(EMBREE_GEOMETRY_POINT)
+  #define IF_ENABLED_CURVES(x) x
+#else
+  #define IF_ENABLED_CURVES(x)
+#endif
+
+#if defined(EMBREE_GEOMETRY_SUBDIVISION)
+  #define IF_ENABLED_SUBDIV(x) x
+#else
+  #define IF_ENABLED_SUBDIV(x)
+#endif
+
+#if defined(EMBREE_GEOMETRY_USER)
+  #define IF_ENABLED_USER(x) x
+#else
+  #define IF_ENABLED_USER(x)
+#endif
+
+#if defined(EMBREE_GEOMETRY_INSTANCE)
+  #define IF_ENABLED_INSTANCE(x) x
+#else
+  #define IF_ENABLED_INSTANCE(x)
+#endif
+
+#if defined(EMBREE_GEOMETRY_GRID)
+  #define IF_ENABLED_GRIDS(x) x
+#else
+  #define IF_ENABLED_GRIDS(x)
+#endif
+
+
+
+

___
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
https://lists.blender.org/mailman/listinfo/bf-blender-cvs


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

2019-07-01 Thread MATILLAT Quentin
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 
-#include 
-
 #  include 
 #  include 
 #  include 
@@ -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 groupByRange(std::vector ids, BoundBox bb) {
-std::sort(ids.begin(), ids.end());
-std::stack 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 ) {
-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
-BVHNode* nodeEmbreeToCcl(embree::BVH4::NodeRef node, ccl::BoundBox bb, 
embree::Scene *s, vector objects) {
-if(node.isLeaf()) {
-size_t nb;
-Primitive *prims = reinterpret_cast(node.leaf(nb));
-
-std::vector 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(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 leafs = groupByRange(ids, bb);
-std::deque 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, , 1);
-}
-
-InnerNode *innerNode = dynamic_cast(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(
-anode->children[i],
-RTCBoundBoxToCCL(anode->bounds(i)),
-s,
-objects);
-}
-
-ret = new InnerNode(
-bb,
-children,
-4);
-} else {
-std::cout 

[Bf-blender-cvs] [43b1fc97bd8] soc-2019-embree-gpu: Add basic support for instanced mesh

2019-06-28 Thread MATILLAT Quentin
Commit: 43b1fc97bd88ae40a7c87a83c2a116e8c944feeb
Author: MATILLAT Quentin
Date:   Fri Jun 28 21:38:08 2019 +0200
Branches: soc-2019-embree-gpu
https://developer.blender.org/rB43b1fc97bd88ae40a7c87a83c2a116e8c944feeb

Add basic support for instanced mesh

===

M   intern/cycles/bvh/bvh.cpp
M   intern/cycles/bvh/bvh.h
M   intern/cycles/bvh/bvh2.cpp
M   intern/cycles/bvh/bvh_embree.cpp
M   intern/cycles/render/mesh.cpp

===

diff --git a/intern/cycles/bvh/bvh.cpp b/intern/cycles/bvh/bvh.cpp
index 2269ca3be3c..715651c96a8 100644
--- a/intern/cycles/bvh/bvh.cpp
+++ b/intern/cycles/bvh/bvh.cpp
@@ -129,6 +129,12 @@ BVH *BVH::create(const BVHParams , const 
vector )
 
 /* Building */
 
+void BVH::buildTimed(Progress , Stats *s) {
+auto start = std::chrono::steady_clock::now();
+this->build(p, s);
+std::cout << 
std::chrono::duration_cast(std::chrono::steady_clock::now()-start).count()
 << "ms" << std::endl;
+}
+
 void BVH::build(Progress , Stats *)
 {
   progress.set_substatus("Building BVH");
@@ -156,6 +162,7 @@ void BVH::build(Progress , Stats *)
   if (root != bvh2_root) {
 bvh2_root->deleteSubtree();
   }
+  std::cout << "SAH " << root->computeSubtreeSAHCost(this->params) << 
std::endl;
 
   if (progress.get_cancel()) {
 if (root != NULL) {
diff --git a/intern/cycles/bvh/bvh.h b/intern/cycles/bvh/bvh.h
index edce3ca6f2a..65e5268c5e7 100644
--- a/intern/cycles/bvh/bvh.h
+++ b/intern/cycles/bvh/bvh.h
@@ -88,6 +88,7 @@ class BVH {
   {
   }
 
+  void buildTimed(Progress , Stats *s);
   virtual void build(Progress , Stats *stats = NULL);
   void refit(Progress );
 
diff --git a/intern/cycles/bvh/bvh2.cpp b/intern/cycles/bvh/bvh2.cpp
index f419d413ef6..fbbcb9589f0 100644
--- a/intern/cycles/bvh/bvh2.cpp
+++ b/intern/cycles/bvh/bvh2.cpp
@@ -161,6 +161,7 @@ void BVH2::pack_unaligned_node(int idx,
 
 void BVH2::pack_nodes(const BVHNode *root)
 {
+  std::cout << "BVH2 SAH is " << root->computeSubtreeSAHCost(this->params) << 
std::endl;
   const size_t num_nodes = root->getSubtreeSize(BVH_STAT_NODE_COUNT);
   const size_t num_leaf_nodes = root->getSubtreeSize(BVH_STAT_LEAF_COUNT);
   assert(num_leaf_nodes <= num_nodes);
diff --git a/intern/cycles/bvh/bvh_embree.cpp b/intern/cycles/bvh/bvh_embree.cpp
index 778315ddaef..5519c746fd1 100644
--- a/intern/cycles/bvh/bvh_embree.cpp
+++ b/intern/cycles/bvh/bvh_embree.cpp
@@ -66,6 +66,7 @@
 #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"
 CCL_NAMESPACE_BEGIN
 
@@ -95,7 +96,7 @@ ccl::BoundBox RTCBoundBoxToCCL(const embree::BBox3fa ) {
 }
 
 template
-BVHNode* nodeEmbreeToCcl(embree::BVH4::NodeRef node, ccl::BoundBox bb, 
embree::Scene *s) {
+BVHNode* nodeEmbreeToCcl(embree::BVH4::NodeRef node, ccl::BoundBox bb, 
embree::Scene *s, vector objects) {
 if(node.isLeaf()) {
 size_t nb;
 Primitive *prims = reinterpret_cast(node.leaf(nb));
@@ -159,8 +160,8 @@ BVHNode* nodeEmbreeToCcl(embree::BVH4::NodeRef node, 
ccl::BoundBox bb, embree::S
 children[i] = nodeEmbreeToCcl(
 anode->children[i],
 RTCBoundBoxToCCL(anode->bounds(i)),
-s
-);
+s,
+objects);
 }
 
 ret = new InnerNode(
@@ -175,10 +176,90 @@ BVHNode* nodeEmbreeToCcl(embree::BVH4::NodeRef node, 
ccl::BoundBox bb, embree::S
 }
 }
 
-BVHNode* print_bvhInfo(RTCScene scene) {
+template<>
+BVHNode* nodeEmbreeToCcl(embree::BVH4::NodeRef 
node, ccl::BoundBox bb, embree::Scene *s, vector objects) {
+if(node.isLeaf()) {
+size_t nb;
+embree::InstancePrimitive *prims = 
reinterpret_cast(node.leaf(nb));
+
+std::stack 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(&

[Bf-blender-cvs] [bc98b748293] soc-2019-embree-gpu: Add Embree access on GPU

2019-06-21 Thread MATILLAT Quentin
Commit: bc98b748293312914867cb5764ed2beb2941fcb3
Author: MATILLAT Quentin
Date:   Fri Jun 21 19:12:27 2019 +0200
Branches: soc-2019-embree-gpu
https://developer.blender.org/rBbc98b748293312914867cb5764ed2beb2941fcb3

Add Embree access on GPU

Add shrink BVH4 to BVH2 to use Embree access on GPU

===

M   intern/cycles/blender/addon/properties.py
M   intern/cycles/blender/addon/ui.py
M   intern/cycles/blender/blender_sync.cpp
M   intern/cycles/bvh/bvh.cpp
M   intern/cycles/bvh/bvh_embree.cpp
M   intern/cycles/bvh/bvh_embree.h
M   intern/cycles/device/device_cpu.cpp
M   intern/cycles/device/device_cuda.cpp
M   intern/cycles/render/mesh.cpp

===

diff --git a/intern/cycles/blender/addon/properties.py 
b/intern/cycles/blender/addon/properties.py
index 2670c300d14..4da89ebd4a1 100644
--- a/intern/cycles/blender/addon/properties.py
+++ b/intern/cycles/blender/addon/properties.py
@@ -57,6 +57,13 @@ enum_bvh_layouts = (
 ('BVH8', "BVH8", "", 4),
 )
 
+enum_bvh_builder = (
+('INTERNAL', "Internal", "Use old internal BVH builder"),
+('EMBREE', "Embree", "Use full featured embree (only on CPU)"),
+('EMBREE_CONVERT', "Embree, then convert", "Use embree, then convert it to 
BVH2"),
+('EMBREE_BUILDER', "Embree builder", "Use Embree BVH Builder"),
+)
+
 enum_bvh_types = (
 ('DYNAMIC_BVH', "Dynamic BVH", "Objects can be individually updated, at 
the cost of slower render time"),
 ('STATIC_BVH', "Static BVH", "Any object modification requires a complete 
BVH rebuild, but renders faster"),
@@ -522,21 +529,13 @@ class CyclesRenderSettings(bpy.types.PropertyGroup):
 items=enum_bvh_types,
 default='DYNAMIC_BVH',
 )
-use_bvh_embree: BoolProperty(
-name="Use Embree",
-description="Use Embree as ray accelerator",
-default=False,
-)
-use_bvh_embree_converter: BoolProperty(
-name="Convert Embree to Internal BVH",
-description="Use Embree as ray accelerator",
-default=False,
-)
-use_bvh_embree_gpu: BoolProperty(
-name="Use Embree on GPU (experimental)",
-description="Use Embree as ray accelerator",
-default=False,
+bvh_builder: EnumProperty(
+name="BVH Builder",
+description="Choose the BVH builder that will be used",
+items=enum_bvh_builder,
+default='INTERNAL',
 )
+
 debug_use_spatial_splits: BoolProperty(
 name="Use Spatial Splits",
 description="Use BVH spatial splits: longer builder time, faster 
render",
diff --git a/intern/cycles/blender/addon/ui.py 
b/intern/cycles/blender/addon/ui.py
index b970de02fde..8f95586c793 100644
--- a/intern/cycles/blender/addon/ui.py
+++ b/intern/cycles/blender/addon/ui.py
@@ -645,24 +645,13 @@ class 
CYCLES_RENDER_PT_performance_acceleration_structure(CyclesButtonsPanel, Pa
 cscene = scene.cycles
 
 col = layout.column()
-
-if _cycles.with_embree:
-row = col.row()
-row.active = use_cpu(context)
-row.prop(cscene, "use_bvh_embree")
-row2 = col.row()
-row2.active = cscene.use_bvh_embree
-row2.prop(cscene, "use_bvh_embree_converter")
-if _cycles.with_embree:
-row = col.row()
-row.active = use_cuda(context)
-row.prop(cscene, "use_bvh_embree_gpu")
+col.prop(cscene, "bvh_builder")
 col.prop(cscene, "debug_use_spatial_splits")
 sub = col.column()
-sub.active = not cscene.use_bvh_embree or not _cycles.with_embree
+sub.active = cscene.bvh_builder != 'EMBREE' or not _cycles.with_embree
 sub.prop(cscene, "debug_use_hair_bvh")
 sub = col.column()
-sub.active = not cscene.debug_use_spatial_splits and not 
cscene.use_bvh_embree
+sub.active = not cscene.debug_use_spatial_splits and 
cscene.bvh_builder != 'EMBREE'
 sub.prop(cscene, "debug_bvh_time_steps")
 
 
diff --git a/intern/cycles/blender/blender_sync.cpp 
b/intern/cycles/blender/blender_sync.cpp
index a39b7f053ff..e249c86f403 100644
--- a/intern/cycles/blender/blender_sync.cpp
+++ b/intern/cycles/blender/blender_sync.cpp
@@ -695,12 +695,17 @@ SceneParams BlenderSync::get_scene_params(BL::Scene 
_scene, bool background)
   }
 
 #ifdef WITH_EMBREE
-  params.bvh_layout = RNA_boolean_get(, "use_bvh_embree") ? 
BVH_LAYOUT_EMBREE :
-  

[Bf-blender-cvs] [68d764f93c9] soc-2019-embree-gpu: Add GUI option to use all options

2019-06-19 Thread MATILLAT Quentin
Commit: 68d764f93c9edbd9fb1d8889bafcba3081e42a0c
Author: MATILLAT Quentin
Date:   Wed Jun 19 15:36:59 2019 +0200
Branches: soc-2019-embree-gpu
https://developer.blender.org/rB68d764f93c9edbd9fb1d8889bafcba3081e42a0c

Add GUI option to use all options

Current options are :
- bvh_builder: Ask embree to build the BVH tree from bounding boxes
- Raw embree: Use all of embree features (cannot be used on GPU)
- bvh_access: Give all the object to Embree, then use introspection to
  extract the tree

===

M   intern/cycles/blender/addon/properties.py
M   intern/cycles/blender/addon/ui.py
M   intern/cycles/blender/blender_sync.cpp
M   intern/cycles/bvh/bvh.cpp
M   intern/cycles/bvh/bvh_embree.cpp
M   intern/cycles/bvh/bvh_embree.h
M   intern/cycles/device/device_cpu.cpp
M   intern/cycles/kernel/kernel_types.h
M   intern/cycles/render/mesh.cpp

===

diff --git a/intern/cycles/blender/addon/properties.py 
b/intern/cycles/blender/addon/properties.py
index ba0339cf3d0..2670c300d14 100644
--- a/intern/cycles/blender/addon/properties.py
+++ b/intern/cycles/blender/addon/properties.py
@@ -527,6 +527,11 @@ class CyclesRenderSettings(bpy.types.PropertyGroup):
 description="Use Embree as ray accelerator",
 default=False,
 )
+use_bvh_embree_converter: BoolProperty(
+name="Convert Embree to Internal BVH",
+description="Use Embree as ray accelerator",
+default=False,
+)
 use_bvh_embree_gpu: BoolProperty(
 name="Use Embree on GPU (experimental)",
 description="Use Embree as ray accelerator",
diff --git a/intern/cycles/blender/addon/ui.py 
b/intern/cycles/blender/addon/ui.py
index 463cf78b6e6..b970de02fde 100644
--- a/intern/cycles/blender/addon/ui.py
+++ b/intern/cycles/blender/addon/ui.py
@@ -650,6 +650,9 @@ class 
CYCLES_RENDER_PT_performance_acceleration_structure(CyclesButtonsPanel, Pa
 row = col.row()
 row.active = use_cpu(context)
 row.prop(cscene, "use_bvh_embree")
+row2 = col.row()
+row2.active = cscene.use_bvh_embree
+row2.prop(cscene, "use_bvh_embree_converter")
 if _cycles.with_embree:
 row = col.row()
 row.active = use_cuda(context)
diff --git a/intern/cycles/blender/blender_sync.cpp 
b/intern/cycles/blender/blender_sync.cpp
index 6ab5294427c..a39b7f053ff 100644
--- a/intern/cycles/blender/blender_sync.cpp
+++ b/intern/cycles/blender/blender_sync.cpp
@@ -697,6 +697,8 @@ SceneParams BlenderSync::get_scene_params(BL::Scene 
_scene, bool background)
 #ifdef WITH_EMBREE
   params.bvh_layout = RNA_boolean_get(, "use_bvh_embree") ? 
BVH_LAYOUT_EMBREE :

params.bvh_layout;
+  params.bvh_layout = RNA_boolean_get(, "use_bvh_embree_converter") ? 
BVH_LAYOUT_EMBREE_CONVERTED :
+ 
params.bvh_layout;
   params.bvh_layout = RNA_boolean_get(, "use_bvh_embree_gpu") ? 
BVH_LAYOUT_EMBREE_GPU :

params.bvh_layout;
 #endif
diff --git a/intern/cycles/bvh/bvh.cpp b/intern/cycles/bvh/bvh.cpp
index f4f8a274fee..17687ff6e74 100644
--- a/intern/cycles/bvh/bvh.cpp
+++ b/intern/cycles/bvh/bvh.cpp
@@ -108,6 +108,7 @@ BVH *BVH::create(const BVHParams , const 
vector )
 case BVH_LAYOUT_BVH8:
   return new BVH8(params, objects);
 case BVH_LAYOUT_EMBREE:
+case BVH_LAYOUT_EMBREE_CONVERTED:
 #ifdef WITH_EMBREE
   return new BVHEmbree(params, objects);
 #endif
diff --git a/intern/cycles/bvh/bvh_embree.cpp b/intern/cycles/bvh/bvh_embree.cpp
index 712d55adaca..b2fd464b16d 100644
--- a/intern/cycles/bvh/bvh_embree.cpp
+++ b/intern/cycles/bvh/bvh_embree.cpp
@@ -60,6 +60,7 @@
 
 #define TASKING_INTERNAL
 #define RTC_NAMESPACE_BEGIN
+#define RTC_NAMESPACE_OPEN
 #define RTC_NAMESPACE_END
 
 #include "embree/kernels/common/scene.h"
@@ -427,7 +428,8 @@ int BVHEmbree::rtc_shared_users = 0;
 thread_mutex BVHEmbree::rtc_shared_mutex;
 
 BVHEmbree::BVHEmbree(const BVHParams _, const vector 
_)
-: BVH4(params_, objects_),
+: bvh_layout(params_.bvh_layout),
+  BVH4(params_, objects_),
   scene(NULL),
   mem_used(0),
   top_level(NULL),
@@ -633,11 +635,14 @@ void BVHEmbree::build(Progress , Stats *stats_)
   }
 
   progress.set_substatus("Packing geometry");
-  BVHNode *root = print_bvhInfo(scene);
-  root->print();
-  pack_nodes(root);
-  std::cout << "SAH " << root->computeSubtreeSAHCost(this->params) << 
std::endl;
-  // pack_nodes(NULL);
+  if(this->bvh_layout == BVH_LAYOUT_EMBREE_CONVERTED) {
+BVHN

[Bf-blender-cvs] [2ac560181c7] soc-2019-embree-gpu: Convert Embree's internal data to Blender BVH4

2019-06-16 Thread MATILLAT Quentin
Commit: 2ac560181c7bf3b8efbcc0385ac873e7e90acf7f
Author: MATILLAT Quentin
Date:   Sun Jun 16 16:17:02 2019 +0200
Branches: soc-2019-embree-gpu
https://developer.blender.org/rB2ac560181c7bf3b8efbcc0385ac873e7e90acf7f

Convert Embree's internal data to Blender BVH4

===

M   intern/cycles/bvh/bvh_embree.cpp
M   intern/cycles/bvh/bvh_embree.h
M   intern/cycles/render/mesh.cpp

===

diff --git a/intern/cycles/bvh/bvh_embree.cpp b/intern/cycles/bvh/bvh_embree.cpp
index 355e28b4fb9..712d55adaca 100644
--- a/intern/cycles/bvh/bvh_embree.cpp
+++ b/intern/cycles/bvh/bvh_embree.cpp
@@ -35,6 +35,9 @@
 
 #ifdef WITH_EMBREE
 
+#include 
+#include 
+
 #  include 
 #  include 
 #  include 
@@ -67,6 +70,22 @@ CCL_NAMESPACE_BEGIN
 
 #  define IS_HAIR(x) (x & 1)
 
+std::stack groupByRange(std::vector ids, BoundBox bb) {
+std::sort(ids.begin(), ids.end());
+std::stack 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 ) {
 return ccl::BoundBox(
 make_float3(bound.lower.x, bound.lower.y, bound.lower.z),
@@ -77,13 +96,11 @@ ccl::BoundBox RTCBoundBoxToCCL(const embree::BBox3fa 
) {
 template
 BVHNode* nodeEmbreeToCcl(embree::BVH4::NodeRef node, ccl::BoundBox bb, 
embree::Scene *s) {
 if(node.isLeaf()) {
-LeafNode *ret = nullptr; // new LeafNode(bb, vis, lo, hi);
 size_t nb;
 Primitive *prims = reinterpret_cast(node.leaf(nb));
 
-int visibility = 0;
-unsigned int min = 99,
-max = 0;
+std::vector 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);
@@ -92,14 +109,44 @@ BVHNode* nodeEmbreeToCcl(embree::BVH4::NodeRef node, 
ccl::BoundBox bb, embree::S
 embree::Geometry *g = s->get(geom_id);
 
 size_t prim_offset = 
reinterpret_cast(g->getUserData());
-visibility |= g->mask;
 
-const unsigned int id = prim_offset + prim_id;
-if(id < min) min = id;
-if(id > max) max = id;
+ids.push_back(prim_offset + prim_id);
 }
 }
-return new LeafNode(bb, visibility, min, max);
+
+if(ids.empty()) return new LeafNode(BoundBox::empty, 0, 0, 0);
+
+BVHNode *ret = nullptr;
+std::stack leafs = groupByRange(ids, bb);
+std::deque 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, , 1);
+}
+
+InnerNode *innerNode = dynamic_cast(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;
 
@@ -107,7 +154,7 @@ BVHNode* nodeEmbreeToCcl(embree::BVH4::NodeRef node, 
ccl::BoundBox bb, embree::S
 embree::BVH4::AlignedNode *anode = node.alignedNode();
 
 BVHNode *children[4];
-for(int i = 0; i < 4; i++) {
+for(uint i = 0; i < 4; i++) {
 children[i] = nodeEmbreeToCcl(
 anode->children[i],
 RTCBoundBoxToCCL(anode->bounds(i)),
@@ -127,9 +174,7 @@ BVHNode* nodeEmbreeToCcl(embree::BVH4::NodeRef node, 
ccl::BoundBox bb, embree::S
 }
 }
 
-void print_bvhInfo(RTCScene);
-
-void print_bvhInfo(RTCScene scene) {
+BVHNode* print_bvhInfo(RTCScene scene) {
 embree::Scene *s = (embree::Scene *)scene;
 
 std::cout << "<- Accel used ->" << std::endl;
@@ -142,15 +187,15 @@ void print_bvhInfo(RTCScene scene) {
 std::cout << "Prim type -> " << bvh->primTy->name() << std::endl;
 
 embree::BVH4::NodeRef root = bvh->root;
-nodeEmbreeToCcl(root, 
RTCBoundBoxToCCL(bvh->bounds.bounds()), s);
-
-} break;
+return nodeEmbreeToCcl(root, 
RTCBoundBoxToCCL(bvh->bounds.bounds()), s);
+}
 default:
  

[Bf-blender-cvs] [db229b2380c] soc-2019-embree-gpu: Add basic access to Embree's internal data

2019-06-14 Thread MATILLAT Quentin
Commit: db229b2380c71e16364c16997c3431a69974ce88
Author: MATILLAT Quentin
Date:   Fri Jun 14 22:20:21 2019 +0200
Branches: soc-2019-embree-gpu
https://developer.blender.org/rBdb229b2380c71e16364c16997c3431a69974ce88

Add basic access to Embree's internal data

===

M   intern/cycles/bvh/bvh_embree.cpp
A   intern/cycles/bvh/embree/common/CMakeLists.txt
A   intern/cycles/bvh/embree/common/algorithms/CMakeLists.txt
A   intern/cycles/bvh/embree/common/algorithms/parallel_filter.h
A   intern/cycles/bvh/embree/common/algorithms/parallel_for.h
A   intern/cycles/bvh/embree/common/algorithms/parallel_for_for.h
A   intern/cycles/bvh/embree/common/algorithms/parallel_for_for_prefix_sum.h
A   intern/cycles/bvh/embree/common/algorithms/parallel_map.h
A   intern/cycles/bvh/embree/common/algorithms/parallel_partition.h
A   intern/cycles/bvh/embree/common/algorithms/parallel_prefix_sum.h
A   intern/cycles/bvh/embree/common/algorithms/parallel_reduce.h
A   intern/cycles/bvh/embree/common/algorithms/parallel_set.h
A   intern/cycles/bvh/embree/common/algorithms/parallel_sort.h
A   intern/cycles/bvh/embree/common/cmake/FindOpenImageIO.cmake
A   intern/cycles/bvh/embree/common/cmake/FindPNG.cmake
A   intern/cycles/bvh/embree/common/cmake/FindTBB.cmake
A   intern/cycles/bvh/embree/common/cmake/check_globals.cmake
A   intern/cycles/bvh/embree/common/cmake/check_isa_default.cmake
A   intern/cycles/bvh/embree/common/cmake/check_stack_frame_size.cmake
A   intern/cycles/bvh/embree/common/cmake/clang.cmake
A   intern/cycles/bvh/embree/common/cmake/crayprgenv.cmake
A   intern/cycles/bvh/embree/common/cmake/create_isa_dummy_file.cmake
A   intern/cycles/bvh/embree/common/cmake/embree-config-builddir.cmake
A   intern/cycles/bvh/embree/common/cmake/embree-config-version.cmake
A   intern/cycles/bvh/embree/common/cmake/embree-config.cmake
A   intern/cycles/bvh/embree/common/cmake/gnu.cmake
A   intern/cycles/bvh/embree/common/cmake/intel.cmake
A   intern/cycles/bvh/embree/common/cmake/ispc.cmake
A   intern/cycles/bvh/embree/common/cmake/msvc.cmake
A   intern/cycles/bvh/embree/common/cmake/msvc_post.cmake
A   intern/cycles/bvh/embree/common/cmake/package.cmake
A   intern/cycles/bvh/embree/common/cmake/rpm_ldconfig.sh
A   intern/cycles/bvh/embree/common/cmake/test.cmake
A   intern/cycles/bvh/embree/common/cmake/tutorial.cmake
A   intern/cycles/bvh/embree/common/cmake/uninstall.cmake.in
A   intern/cycles/bvh/embree/common/lexers/CMakeLists.txt
A   intern/cycles/bvh/embree/common/lexers/parsestream.h
A   intern/cycles/bvh/embree/common/lexers/stream.h
A   intern/cycles/bvh/embree/common/lexers/streamfilters.h
A   intern/cycles/bvh/embree/common/lexers/stringstream.h
A   intern/cycles/bvh/embree/common/lexers/tokenstream.h
A   intern/cycles/bvh/embree/common/math/CMakeLists.txt
A   intern/cycles/bvh/embree/common/math/affinespace.h
A   intern/cycles/bvh/embree/common/math/bbox.h
A   intern/cycles/bvh/embree/common/math/col3.h
A   intern/cycles/bvh/embree/common/math/col4.h
A   intern/cycles/bvh/embree/common/math/color.h
A   intern/cycles/bvh/embree/common/math/constants.h
A   intern/cycles/bvh/embree/common/math/interval.h
A   intern/cycles/bvh/embree/common/math/lbbox.h
A   intern/cycles/bvh/embree/common/math/linearspace2.h
A   intern/cycles/bvh/embree/common/math/linearspace3.h
A   intern/cycles/bvh/embree/common/math/math.h
A   intern/cycles/bvh/embree/common/math/obbox.h
A   intern/cycles/bvh/embree/common/math/quaternion.h
A   intern/cycles/bvh/embree/common/math/range.h
A   intern/cycles/bvh/embree/common/math/vec2.h
A   intern/cycles/bvh/embree/common/math/vec2fa.h
A   intern/cycles/bvh/embree/common/math/vec3.h
A   intern/cycles/bvh/embree/common/math/vec3ba.h
A   intern/cycles/bvh/embree/common/math/vec3fa.h
A   intern/cycles/bvh/embree/common/math/vec3ia.h
A   intern/cycles/bvh/embree/common/math/vec4.h
A   intern/cycles/bvh/embree/common/simd/CMakeLists.txt
A   intern/cycles/bvh/embree/common/simd/avx.h
A   intern/cycles/bvh/embree/common/simd/avx512.h
A   intern/cycles/bvh/embree/common/simd/simd.h
A   intern/cycles/bvh/embree/common/simd/sse.h
A   intern/cycles/bvh/embree/common/simd/varying.h
A   intern/cycles/bvh/embree/common/simd/vboold4_avx.h
A   intern/cycles/bvh/embree/common/simd/vboold4_avx512.h
A   intern/cycles/bvh/embree/common/simd/vboold8_avx512.h
A   intern/cycles/bvh/embree/common/simd/vboolf16_avx512.h
A   intern/cycles/bvh/embree/common/simd/vboolf4_avx512.h
A   intern/cycles/bvh/embree/common/simd/vboolf4_sse2.h
A   intern/cycles/bvh/embree/common/simd/vboolf8_avx.h
A   intern/cycles/bvh/embree/common/simd/vboolf8_avx512.h
A   intern/cycles

[Bf-blender-cvs] [d40ca519f33] soc-2019-embree-gpu: Add support for instancied mesh

2019-06-07 Thread MATILLAT Quentin
Commit: d40ca519f33ef1c5d046254a741bdb05d1d17f03
Author: MATILLAT Quentin
Date:   Fri Jun 7 10:24:09 2019 +0200
Branches: soc-2019-embree-gpu
https://developer.blender.org/rBd40ca519f33ef1c5d046254a741bdb05d1d17f03

Add support for instancied mesh

===

M   intern/cycles/bvh/bvh.cpp
M   intern/cycles/bvh/bvh_embree_gpu.cpp
M   intern/cycles/bvh/bvh_embree_gpu.h

===

diff --git a/intern/cycles/bvh/bvh.cpp b/intern/cycles/bvh/bvh.cpp
index b51d6b280d9..f4f8a274fee 100644
--- a/intern/cycles/bvh/bvh.cpp
+++ b/intern/cycles/bvh/bvh.cpp
@@ -52,6 +52,8 @@ const char *bvh_layout_name(BVHLayout layout)
   return "NONE";
 case BVH_LAYOUT_EMBREE:
   return "EMBREE";
+case BVH_LAYOUT_EMBREE_GPU:
+  return "EMBREE_GPU";
 case BVH_LAYOUT_ALL:
   return "ALL";
   }
diff --git a/intern/cycles/bvh/bvh_embree_gpu.cpp 
b/intern/cycles/bvh/bvh_embree_gpu.cpp
index f42040c4f69..840ff29e674 100644
--- a/intern/cycles/bvh/bvh_embree_gpu.cpp
+++ b/intern/cycles/bvh/bvh_embree_gpu.cpp
@@ -33,7 +33,7 @@ typedef struct {
 
 
 BVHEmbreeGPU::BVHEmbreeGPU(const BVHParams& params_, const vector& 
objects_)
-: BVH(params_, objects_), stats(nullptr)
+: BVH2(params_, objects_), stats(nullptr)
 {
 _MM_SET_FLUSH_ZERO_MODE(_MM_FLUSH_ZERO_ON);
 _MM_SET_DENORMALS_ZERO_MODE(_MM_DENORMALS_ZERO_ON);
@@ -74,6 +74,20 @@ void CCLBoundBoxToRTC(const ccl::BoundBox , RTCBounds 
*bound) {
 bound->upper_z = bb.max.z;
 }
 
+RTCBuildPrimitive makeBuildPrimitive(const BoundBox , unsigned int geomId, 
unsigned int primId = -1) {
+RTCBuildPrimitive prim;
+prim.lower_x = bb.min.x;
+prim.lower_y = bb.min.y;
+prim.lower_z = bb.min.z;
+prim.upper_x = bb.max.x;
+prim.upper_y = bb.max.y;
+prim.upper_z = bb.max.z;
+prim.geomID = geomId;
+prim.primID = primId;
+
+return prim;
+}
+
 void BVHEmbreeGPU::build(Progress& progress, Stats *stats_)
 {
 this->stats = stats_;
@@ -100,13 +114,17 @@ void BVHEmbreeGPU::build(Progress& progress, Stats 
*stats_)
 
 args.buildFlags = (dynamic ? RTC_BUILD_FLAG_DYNAMIC : RTC_BUILD_FLAG_NONE);
 args.buildQuality = dynamic ? RTC_BUILD_QUALITY_LOW :
-  (params.use_spatial_split ? 
RTC_BUILD_QUALITY_HIGH : RTC_BUILD_QUALITY_MEDIUM);
+  ((params.use_spatial_split && 
!params.top_level) ? RTC_BUILD_QUALITY_HIGH : RTC_BUILD_QUALITY_MEDIUM);
 
 /* Count triangles first so we can reserve arrays once. */
 size_t prim_count = 0;
 
 foreach(Object *ob, objects) {
-prim_count += ob->mesh->num_triangles();
+if(params.top_level && ob->mesh->is_instanced()) {
+prim_count += 1;
+} else {
+prim_count += ob->mesh->num_triangles();
+}
 }
 
 pack.prim_object.reserve(prim_count);
@@ -122,23 +140,49 @@ void BVHEmbreeGPU::build(Progress& progress, Stats 
*stats_)
 vector prims;
 prims.reserve(objects.size() * 3);
 foreach(Object *ob, objects) {
-add_object(ob, i);
+if (params.top_level && !ob->is_traceable())
+continue;
+
+if (params.top_level && ob->mesh->is_instanced()) {
+args.maxLeafSize = 1;
+const auto offset = pack.prim_index.size();
+this->offset[i] = offset;
+
+pack.prim_type.push_back_reserved(0);
+pack.prim_index.push_back_reserved(-1);
+pack.prim_object.push_back_reserved(i);
+
+prims.push_back(makeBuildPrimitive(ob->bounds, i));
+} else {
+add_object(ob, i);
+
+const float3 *mesh_verts = ob->mesh->verts.data();
+const float3 *mesh_vert_steps = NULL;
+size_t motion_steps = 1;
+
+if (ob->mesh->has_motion_blur()) {
+const Attribute *attr_motion_vertex = 
ob->mesh->attributes.find(ATTR_STD_MOTION_VERTEX_POSITION);
+if (attr_motion_vertex) {
+mesh_vert_steps = attr_motion_vertex->data_float3();
+motion_steps = ob->mesh->motion_steps;
+}
+}
 
-const float3 *mesh_verts = ob->mesh->verts.data();
-for(size_t tri = 0; tri < ob->mesh->num_triangles(); ++tri) {
-BoundBox bb = BoundBox::empty;
-ob->mesh->get_triangle(tri).bounds_grow(mesh_verts, bb);
-RTCBuildPrimitive prim;
-prim.lower_x = bb.min.x;
-prim.lower_y = bb.min.y;
-prim.lower_z = bb.min.z;
-prim.upper_x = bb.max.x;
-prim.upper_y = bb.max.y;
-prim.upper_z = bb.max.z;
-prim.geomID = i;
-prim.primID = tri;
-
-

[Bf-blender-cvs] [b9928e843d2] soc-2019-embree-gpu: Fix crash when empty scene

2019-05-31 Thread MATILLAT Quentin
Commit: b9928e843d296bf0c912f1e831b2f31ba8339c53
Author: MATILLAT Quentin
Date:   Fri May 31 18:12:35 2019 +0200
Branches: soc-2019-embree-gpu
https://developer.blender.org/rBb9928e843d296bf0c912f1e831b2f31ba8339c53

Fix crash when empty scene

===

M   intern/cycles/bvh/bvh_embree_gpu.cpp

===

diff --git a/intern/cycles/bvh/bvh_embree_gpu.cpp 
b/intern/cycles/bvh/bvh_embree_gpu.cpp
index 52367089ce4..f42040c4f69 100644
--- a/intern/cycles/bvh/bvh_embree_gpu.cpp
+++ b/intern/cycles/bvh/bvh_embree_gpu.cpp
@@ -186,7 +186,9 @@ void BVHEmbreeGPU::build(Progress& progress, Stats *stats_)
 UserParams *userParams = static_cast(user_ptr);
 void* ptr = rtcThreadLocalAlloc(alloc, sizeof(LeafNode), 16);
 
-int min = 99,
+if(numPrims == 0) return new (ptr) LeafNode(BoundBox::empty, 0, 0, 0);
+
+int min = std::numeric_limits::max(),
 max = 0;
 uint visibility = 0;
 BoundBox bounds = BoundBox::empty;

___
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
https://lists.blender.org/mailman/listinfo/bf-blender-cvs


[Bf-blender-cvs] [6532a2e6952] soc-2019-embree-gpu: Initial implementation for Embree GPU

2019-05-31 Thread MATILLAT Quentin
Commit: 6532a2e6952641344ac077c3250d9706b5b1c0ae
Author: MATILLAT Quentin
Date:   Fri May 31 15:52:54 2019 +0200
Branches: soc-2019-embree-gpu
https://developer.blender.org/rB6532a2e6952641344ac077c3250d9706b5b1c0ae

Initial implementation for Embree GPU

===

M   intern/cycles/blender/addon/properties.py
M   intern/cycles/blender/addon/ui.py
M   intern/cycles/blender/blender_sync.cpp
M   intern/cycles/bvh/CMakeLists.txt
M   intern/cycles/bvh/bvh.cpp
A   intern/cycles/bvh/bvh_embree_gpu.cpp
A   intern/cycles/bvh/bvh_embree_gpu.h
M   intern/cycles/device/device_cuda.cpp
M   intern/cycles/kernel/kernel_types.h
M   intern/cycles/render/mesh.cpp

===

diff --git a/intern/cycles/blender/addon/properties.py 
b/intern/cycles/blender/addon/properties.py
index d9e145c8b75..ba0339cf3d0 100644
--- a/intern/cycles/blender/addon/properties.py
+++ b/intern/cycles/blender/addon/properties.py
@@ -527,6 +527,11 @@ class CyclesRenderSettings(bpy.types.PropertyGroup):
 description="Use Embree as ray accelerator",
 default=False,
 )
+use_bvh_embree_gpu: BoolProperty(
+name="Use Embree on GPU (experimental)",
+description="Use Embree as ray accelerator",
+default=False,
+)
 debug_use_spatial_splits: BoolProperty(
 name="Use Spatial Splits",
 description="Use BVH spatial splits: longer builder time, faster 
render",
diff --git a/intern/cycles/blender/addon/ui.py 
b/intern/cycles/blender/addon/ui.py
index a49efb3567f..463cf78b6e6 100644
--- a/intern/cycles/blender/addon/ui.py
+++ b/intern/cycles/blender/addon/ui.py
@@ -650,6 +650,10 @@ class 
CYCLES_RENDER_PT_performance_acceleration_structure(CyclesButtonsPanel, Pa
 row = col.row()
 row.active = use_cpu(context)
 row.prop(cscene, "use_bvh_embree")
+if _cycles.with_embree:
+row = col.row()
+row.active = use_cuda(context)
+row.prop(cscene, "use_bvh_embree_gpu")
 col.prop(cscene, "debug_use_spatial_splits")
 sub = col.column()
 sub.active = not cscene.use_bvh_embree or not _cycles.with_embree
diff --git a/intern/cycles/blender/blender_sync.cpp 
b/intern/cycles/blender/blender_sync.cpp
index 8d93d517d4e..6ab5294427c 100644
--- a/intern/cycles/blender/blender_sync.cpp
+++ b/intern/cycles/blender/blender_sync.cpp
@@ -697,6 +697,8 @@ SceneParams BlenderSync::get_scene_params(BL::Scene 
_scene, bool background)
 #ifdef WITH_EMBREE
   params.bvh_layout = RNA_boolean_get(, "use_bvh_embree") ? 
BVH_LAYOUT_EMBREE :

params.bvh_layout;
+  params.bvh_layout = RNA_boolean_get(, "use_bvh_embree_gpu") ? 
BVH_LAYOUT_EMBREE_GPU :
+   
params.bvh_layout;
 #endif
   return params;
 }
diff --git a/intern/cycles/bvh/CMakeLists.txt b/intern/cycles/bvh/CMakeLists.txt
index 36bbd937e1a..3952b307096 100644
--- a/intern/cycles/bvh/CMakeLists.txt
+++ b/intern/cycles/bvh/CMakeLists.txt
@@ -14,6 +14,7 @@ set(SRC
   bvh_binning.cpp
   bvh_build.cpp
   bvh_embree.cpp
+  bvh_embree_gpu.cpp
   bvh_node.cpp
   bvh_sort.cpp
   bvh_split.cpp
@@ -28,6 +29,7 @@ set(SRC_HEADERS
   bvh_binning.h
   bvh_build.h
   bvh_embree.h
+  bvh_embree_gpu.h
   bvh_node.h
   bvh_params.h
   bvh_sort.h
diff --git a/intern/cycles/bvh/bvh.cpp b/intern/cycles/bvh/bvh.cpp
index 53c66777928..b51d6b280d9 100644
--- a/intern/cycles/bvh/bvh.cpp
+++ b/intern/cycles/bvh/bvh.cpp
@@ -28,6 +28,7 @@
 
 #ifdef WITH_EMBREE
 #  include "bvh/bvh_embree.h"
+#  include "bvh/bvh_embree_gpu.h"
 #endif
 
 #include "util/util_foreach.h"
@@ -107,6 +108,10 @@ BVH *BVH::create(const BVHParams , const 
vector )
 case BVH_LAYOUT_EMBREE:
 #ifdef WITH_EMBREE
   return new BVHEmbree(params, objects);
+#endif
+case BVH_LAYOUT_EMBREE_GPU:
+#ifdef WITH_EMBREE
+  return new BVHEmbreeGPU(params, objects);
 #endif
 case BVH_LAYOUT_NONE:
 case BVH_LAYOUT_ALL:
diff --git a/intern/cycles/bvh/bvh_embree_gpu.cpp 
b/intern/cycles/bvh/bvh_embree_gpu.cpp
new file mode 100644
index 000..52367089ce4
--- /dev/null
+++ b/intern/cycles/bvh/bvh_embree_gpu.cpp
@@ -0,0 +1,458 @@
+/*
+ * Copyright 2018, Blender Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDIT