[Bf-blender-cvs] [485ed01] temp-cycles-microdisplacement: Adding a geometry cache
Mai Lavelle
noreply at git.blender.org
Mon Apr 11 14:54:30 CEST 2016
Commit: 485ed01dc1e992706a703441d24975940948bda8
Author: Mai Lavelle
Date: Wed Feb 24 12:46:10 2016 -0500
Branches: temp-cycles-microdisplacement
https://developer.blender.org/rB485ed01dc1e992706a703441d24975940948bda8
Adding a geometry cache
Squashed the following 7 commits:
- Add geometry cache ; geom cache
- Add geometry cache ; geom
- Add geometry cache ; bvh
- Add geometry cache ; mesh
- Add geometry cache ; sync
- Add geometry cache ; subd
- Add geometry cache ; geom bvh
===================================================================
M intern/cycles/blender/addon/properties.py
M intern/cycles/blender/addon/ui.py
M intern/cycles/blender/blender_mesh.cpp
M intern/cycles/blender/blender_sync.cpp
M intern/cycles/bvh/bvh.cpp
M intern/cycles/bvh/bvh_build.cpp
M intern/cycles/bvh/bvh_params.h
M intern/cycles/device/device.h
M intern/cycles/device/device_cpu.cpp
M intern/cycles/kernel/CMakeLists.txt
M intern/cycles/kernel/geom/geom.h
M intern/cycles/kernel/geom/geom_bvh_shadow.h
M intern/cycles/kernel/geom/geom_bvh_subsurface.h
M intern/cycles/kernel/geom/geom_bvh_traversal.h
M intern/cycles/kernel/geom/geom_bvh_volume.h
M intern/cycles/kernel/geom/geom_bvh_volume_all.h
A intern/cycles/kernel/geom/geom_cache.cpp
A intern/cycles/kernel/geom/geom_cache.h
A intern/cycles/kernel/geom/geom_cache_triangle.h
M intern/cycles/kernel/geom/geom_qbvh_shadow.h
M intern/cycles/kernel/geom/geom_qbvh_subsurface.h
M intern/cycles/kernel/geom/geom_qbvh_traversal.h
M intern/cycles/kernel/geom/geom_qbvh_volume.h
M intern/cycles/kernel/geom/geom_qbvh_volume_all.h
A intern/cycles/kernel/geom/geom_subpatch.h
M intern/cycles/kernel/kernel_globals.h
M intern/cycles/kernel/kernel_shader.h
M intern/cycles/kernel/kernel_subsurface.h
M intern/cycles/kernel/kernel_types.h
M intern/cycles/kernel/osl/osl_services.cpp
M intern/cycles/kernel/svm/svm_wireframe.h
M intern/cycles/render/mesh.cpp
M intern/cycles/render/mesh.h
M intern/cycles/render/mesh_subdivision.cpp
M intern/cycles/render/object.cpp
M intern/cycles/render/scene.h
M intern/cycles/subd/subd_dice.cpp
M intern/cycles/subd/subd_dice.h
M intern/cycles/subd/subd_split.h
M intern/cycles/util/CMakeLists.txt
A intern/cycles/util/util_lru.h
M intern/cycles/util/util_thread.h
===================================================================
diff --git a/intern/cycles/blender/addon/properties.py b/intern/cycles/blender/addon/properties.py
index de9481e..ca708bf 100644
--- a/intern/cycles/blender/addon/properties.py
+++ b/intern/cycles/blender/addon/properties.py
@@ -498,6 +498,12 @@ class CyclesRenderSettings(bpy.types.PropertyGroup):
"but time can be saved by manually stopping the render when the noise is low enough)",
default=False,
)
+ cls.geom_cache_max_size = IntProperty(
+ name="Geometry Cache Size",
+ description="Maximum size of the geometry cache in MB",
+ min=128, max=1024*4,
+ default=256,
+ )
cls.bake_type = EnumProperty(
name="Bake Type",
diff --git a/intern/cycles/blender/addon/ui.py b/intern/cycles/blender/addon/ui.py
index e3c4f21..cc18818 100644
--- a/intern/cycles/blender/addon/ui.py
+++ b/intern/cycles/blender/addon/ui.py
@@ -385,6 +385,11 @@ class CyclesRender_PT_performance(CyclesButtonsPanel, Panel):
col.label(text="Acceleration structure:")
col.prop(cscene, "debug_use_spatial_splits")
+ col.separator()
+
+ col.label(text="Geometry Cache:")
+ col.prop(cscene, "geom_cache_max_size", text="Max Size")
+
class CyclesRender_PT_layer_options(CyclesButtonsPanel, Panel):
bl_label = "Layer"
diff --git a/intern/cycles/blender/blender_mesh.cpp b/intern/cycles/blender/blender_mesh.cpp
index 410d520..b80d474 100644
--- a/intern/cycles/blender/blender_mesh.cpp
+++ b/intern/cycles/blender/blender_mesh.cpp
@@ -623,19 +623,18 @@ static void create_mesh(Scene *scene,
if(is_zero(cross(mesh->verts[vi[1]] - mesh->verts[vi[0]], mesh->verts[vi[2]] - mesh->verts[vi[0]])) ||
is_zero(cross(mesh->verts[vi[2]] - mesh->verts[vi[0]], mesh->verts[vi[3]] - mesh->verts[vi[0]])))
{
- // TODO(mai): order here is probably wrong
- mesh->set_triangle(ti++, vi[0], vi[1], vi[3], shader, smooth, true);
- mesh->set_triangle(ti++, vi[2], vi[3], vi[1], shader, smooth, true);
+ mesh->set_triangle(ti++, vi[0], vi[1], vi[3], shader, smooth);
+ mesh->set_triangle(ti++, vi[2], vi[3], vi[1], shader, smooth);
face_flags[fi] |= FACE_FLAG_DIVIDE_24;
}
else {
- mesh->set_triangle(ti++, vi[0], vi[1], vi[2], shader, smooth, true);
- mesh->set_triangle(ti++, vi[0], vi[2], vi[3], shader, smooth, true);
+ mesh->set_triangle(ti++, vi[0], vi[1], vi[2], shader, smooth);
+ mesh->set_triangle(ti++, vi[0], vi[2], vi[3], shader, smooth);
face_flags[fi] |= FACE_FLAG_DIVIDE_13;
}
}
else
- mesh->set_triangle(ti++, vi[0], vi[1], vi[2], shader, smooth, false);
+ mesh->set_triangle(ti++, vi[0], vi[1], vi[2], shader, smooth);
}
else {
/* create patches */
@@ -676,11 +675,10 @@ static void create_subd_mesh(Scene *scene,
const vector<uint>& used_shaders,
bool preview)
{
- Mesh *basemesh = new Mesh();
- basemesh->subdivision_type = (Mesh::SubdivisionType)RNA_enum_get(cmesh, "subdivision_type");
- create_mesh(scene, basemesh, b_mesh, used_shaders, true);
+ mesh->subdivision_type = (Mesh::SubdivisionType)RNA_enum_get(cmesh, "subdivision_type");
+ create_mesh(scene, mesh, b_mesh, used_shaders, true);
- SubdParams sdparams(mesh, used_shaders[0], true, false);
+ SubdParams sdparams;
sdparams.dicing_rate = preview ? RNA_float_get(cmesh, "preview_dicing_rate") : RNA_float_get(cmesh, "dicing_rate");
sdparams.max_level = RNA_int_get(cmesh, "max_subdivision_level");
@@ -690,9 +688,7 @@ static void create_subd_mesh(Scene *scene,
/* tesselate */
DiagSplit dsplit(sdparams);
- basemesh->tessellate(&dsplit);
-
- delete basemesh;
+ mesh->split_patches(&dsplit);
}
/* Sync */
diff --git a/intern/cycles/blender/blender_sync.cpp b/intern/cycles/blender/blender_sync.cpp
index 749b8c0..68055a7 100644
--- a/intern/cycles/blender/blender_sync.cpp
+++ b/intern/cycles/blender/blender_sync.cpp
@@ -481,6 +481,8 @@ SceneParams BlenderSync::get_scene_params(BL::Scene& b_scene,
params.use_qbvh = false;
}
+ params.geom_cache_max_size = get_int(cscene, "geom_cache_max_size") * 1024*1024;
+
return params;
}
diff --git a/intern/cycles/bvh/bvh.cpp b/intern/cycles/bvh/bvh.cpp
index f78ad3e..bb2a898 100644
--- a/intern/cycles/bvh/bvh.cpp
+++ b/intern/cycles/bvh/bvh.cpp
@@ -205,7 +205,7 @@ void BVH::pack_instances(size_t nodes_size, size_t leaf_nodes_size)
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
+ else if(pack.prim_type[i] & PRIMITIVE_ALL_TRIANGLE)
pack.prim_index[i] += objects[pack.prim_object[i]]->mesh->tri_offset;
}
@@ -311,6 +311,8 @@ void BVH::pack_instances(size_t nodes_size, size_t leaf_nodes_size)
for(size_t i = 0; i < bvh_prim_index_size; i++) {
if(bvh->pack.prim_type[i] & PRIMITIVE_ALL_CURVE)
pack_prim_index[pack_prim_index_offset] = bvh_prim_index[i] + mesh_curve_offset;
+ else if(bvh->pack.prim_type[i] & PRIMITIVE_SUBPATCH)
+ pack_prim_index[pack_prim_index_offset] = bvh_prim_index[i];
else
pack_prim_index[pack_prim_index_offset] = bvh_prim_index[i] + mesh_tri_offset;
@@ -534,6 +536,12 @@ void RegularBVH::refit_node(int idx, bool leaf, BoundBox& bbox, uint& visibility
}
}
}
+ else if(pack.prim_type[prim] & PRIMITIVE_SUBPATCH) {
+ /* Subpatches. */
+ const Mesh::SubPatch& subpatch = mesh->subpatches[pidx];
+
+ subpatch.bounds_grow(bbox);
+ }
else {
/* triangles */
int tri_offset = (params.top_level)? mesh->tri_offset: 0;
@@ -798,6 +806,12 @@ void QBVH::refit_node(int idx, bool leaf, BoundBox& bbox, uint& visibility)
}
}
}
+ else if(pack.prim_type[prim] & PRIMITIVE_SUBPATCH) {
+ /* Subpatches. */
+ const Mesh::SubPatch& subpatch = mesh->subpatches[pidx];
+
+ subpatch.bounds_grow(bbox);
+ }
else {
/* Triangles. */
int tri_offset = (params.top_level)? mesh->tri_offset: 0;
diff --git a/intern/cycles/bvh/bvh_build.cpp b/intern/cycles/bvh/bvh_build.cpp
index 255051c..e2b2a64 100644
--- a/intern/cycles/bvh/bvh_build.cpp
+++ b/intern/cycles/bvh/bvh_build.cpp
@@ -177,6 +177,20 @@ void BVHBuild::add_reference_mesh(BoundBox& root, BoundBox& center, Mesh *mesh,
}
}
}
+
+ for(uint j = 0; j < mesh->subpatches.size(); j++) {
+ Mesh::SubPatch& subpatch = mesh->subpatches[j];
+ BoundBox bounds = BoundBox::empty;
+ PrimitiveType type = PRIMITIVE_SUBPATCH;
+
+ subpatch.bounds_grow(bounds);
+
+ if(bounds.valid()) {
+ references.push_back(BVHReference(bounds, j, i, type));
+ root.grow(bounds);
+ center.grow(bounds.center2());
+ }
+ }
}
void BVHBuild::add_reference_object(BoundBox& root, BoundBox& center, Object *ob, int i)
@@ -206,6 +220,7 @@ void BVHBuild::add_references(BVHRange& root)
if(!ob->mesh->is_instanced()) {
num_alloc_references += ob->mesh->triangles.size();
num_alloc_references += count_curve_segments(ob->mesh);
+ num_alloc_references += ob->mesh->subpatches.size();
}
else
num_alloc_references++;
@@ -213,6 +228,7 @@ void BVHBuild::add_references(BVHRange& root)
else {
num_alloc_references += ob->mesh->triangles.size();
num_alloc_references += count_curve_segments(ob->mesh);
+ num_alloc_references += ob->mesh->subpatches.size();
}
}
@@ -412,6 +428,7 @@ bool BVHBuild::range_within_max_leaf_size(const BVHRange& range,
size_t num_triangles = 0;
size_t num_curves = 0;
size_t num_motion_curves = 0;
+ size_t num_subpatches = 0;
for(int i = 0; i < size; i++) {
const BVHReference& ref = references[range.start() + i];
@@ -422,11 +439,14 @@ bool BVHBuild::range_within_max_leaf_size(const BVHRange& range,
num_motion_curves++;
else if(ref.prim_type() & PRIMITIVE_ALL_TRIANGLE)
num_triangles++;
+ else if(ref.prim_type() & PRIMITIVE_SUBPATCH)
+ num_subpatches++;
}
return (num_triangles < params.max_triangle_leaf_size) &&
(num_curves < params.max_curve_leaf_size) &&
- (num_motion_curves < params.max_curve_leaf_size);
+ (num_motion_curves < params.max_curve_leaf_size) &&
+ (num_subpatches < params.max_subpatch_leaf_size);
}
/* multithreaded binning builder */
@@ -615,6 +635,8 @@ BVHNode* BVHBuild::create_leaf_node(const BVHRange& range,
BoundBox bounds[PRIMITIVE_NUM_TOTAL] = {BoundBox::empty,
BoundBox::empty,
BoundBox::empty,
+ BoundBox::empty,
+ BoundBox::empty,
BoundBox::empty};
int ob_num = 0;
diff --git a/intern/cycles/bvh/bvh_params.h b/intern/cycles/bvh/bvh_params.h
index cf683df..3969749 100644
--- a/intern/cycles/bvh/bvh_params.h
+++ b/intern/cycles/bvh/bvh_params.h
@@ -39,6 +39,7 @@ public:
int min_leaf_size;
int max_triangle_leaf_size;
int max_curve_leaf_size;
+ int max_subpatch_leaf_size;
/* object or mesh level bvh */
bool top_level;
@@ -66,6 +67,7 @@ public:
min_leaf_size = 1;
max_triangle_leaf_size = 8;
max_curve_leaf_size = 2;
+ max_subpatch_leaf_size = 1;
top_level = false;
use_qbvh = false;
diff --git a/intern/cycles/device/device.h b/intern/cycles/device/device.h
index 30d0003..460cc18 100644
--- a/intern/cycles/device/device.h
+++ b/intern/cycles/device/device.h
@@ -34,6 +34,8 @@ CCL_NAMESPACE_BEGIN
class Progress;
class RenderTile;
+struct GeomCache;
+
/* Device Types */
enum DeviceType {
@@ -232,6 +234,8 @@ public:
/* open shading language, only for CPU device */
virtual void *osl_memory() { return NULL; }
+ virtual GeomCache *get_geom_cache() { return NULL; }
+
/* load/compile kernels, must be called before adding tasks */
virtual bool load_kernels(
const DeviceRequestedFeatures& /*requested_features*/)
diff --git a/intern/cycles/device/device_cpu.cpp b/intern/cycles/device/device_cpu.cpp
index 676b1279..5a9b26d 100644
--- a/intern/cycles/device/device_cpu.cpp
+++ b/intern/cycles
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list