[Bf-blender-cvs] [421159e620a] soc-2019-embree-gpu: Fix the building of empty tree
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
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
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
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
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`
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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