[Bf-blender-cvs] [2ec7502] temp-cycles-microdisplacement: Add geometry cache ; geom cache
Mai Lavelle
noreply at git.blender.org
Tue Apr 12 18:45:50 CEST 2016
Commit: 2ec75023af9d0d409a3126f882df614f4a061050
Author: Mai Lavelle
Date: Wed Feb 24 12:46:10 2016 -0500
Branches: temp-cycles-microdisplacement
https://developer.blender.org/rB2ec75023af9d0d409a3126f882df614f4a061050
Add geometry cache ; geom cache
===================================================================
M intern/cycles/kernel/CMakeLists.txt
M intern/cycles/kernel/geom/geom.h
A intern/cycles/kernel/geom/geom_cache.cpp
A intern/cycles/kernel/geom/geom_cache.h
M intern/cycles/kernel/kernel_globals.h
M intern/cycles/kernel/kernel_types.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/kernel/CMakeLists.txt b/intern/cycles/kernel/CMakeLists.txt
index 3c17429..952befe 100644
--- a/intern/cycles/kernel/CMakeLists.txt
+++ b/intern/cycles/kernel/CMakeLists.txt
@@ -5,6 +5,8 @@ set(INC
../util
osl
svm
+ ../render
+ ../device
)
set(INC_SYS
@@ -13,6 +15,7 @@ set(INC_SYS
set(SRC
kernels/cpu/kernel.cpp
+ geom/geom_cache.cpp
kernels/opencl/kernel.cl
kernels/opencl/kernel_data_init.cl
kernels/opencl/kernel_queue_enqueue.cl
diff --git a/intern/cycles/kernel/geom/geom.h b/intern/cycles/kernel/geom/geom.h
index c94a538..3abcbfd 100644
--- a/intern/cycles/kernel/geom/geom.h
+++ b/intern/cycles/kernel/geom/geom.h
@@ -44,6 +44,9 @@
#include "geom_motion_curve.h"
#include "geom_curve.h"
#include "geom_volume.h"
+#include "geom_cache.h"
+#include "geom_cache_triangle.h"
+#include "geom_subpatch.h"
#include "geom_primitive.h"
#include "geom_bvh.h"
diff --git a/intern/cycles/kernel/geom/geom_cache.cpp b/intern/cycles/kernel/geom/geom_cache.cpp
new file mode 100644
index 0000000..2404b24
--- /dev/null
+++ b/intern/cycles/kernel/geom/geom_cache.cpp
@@ -0,0 +1,199 @@
+/*
+ * Copyright 2011-2016 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.
+ */
+
+#include "util_lru.h"
+
+#include "scene.h"
+#include "object.h"
+#include "mesh.h"
+
+#include "osl_shader.h"
+
+#include "kernel_compat_cpu.h"
+#include "kernel_globals.h"
+#include "kernel_random.h"
+#include "kernel_projection.h"
+#include "kernel_differential.h"
+#include "kernel_montecarlo.h"
+#include "kernel_camera.h"
+
+#include "geom/geom.h"
+
+#include "kernel_accumulate.h"
+#include "kernel_shader.h"
+
+CCL_NAMESPACE_BEGIN
+
+struct GeomCacheThreadData;
+struct SubPatchWraper;
+
+typedef struct GeomCache {
+ struct patch_key_t {
+ uint object, prim;
+
+ patch_key_t() : object(0), prim(0) {}
+ patch_key_t(uint object, uint key) : object(object), prim(key) {}
+
+ bool operator == (const patch_key_t& other) const {
+ return (object == other.object) && (prim == other.prim);
+ }
+
+ struct hasher_t {
+ size_t operator()(const patch_key_t& key) const {
+ return hash_int_2d(key.object, key.prim);
+ }
+ };
+ };
+
+ typedef LRU<patch_key_t, SubPatchWraper, patch_key_t::hasher_t> lru_t;
+ lru_t lru;
+
+ Scene* scene;
+ thread_specific_ptr<GeomCacheThreadData> thread_data;
+
+ GeomCacheThreadData* get_thread_data();
+} GeomCache;
+
+typedef struct GeomCacheThreadData {
+ GeomCache::lru_t::thread_data_t* lru_tdata;
+} GeomCacheThreadData;
+
+GeomCacheThreadData* GeomCache::get_thread_data() {
+ GeomCacheThreadData* tdata = thread_data.get();
+ if(!tdata) {
+ tdata = new GeomCacheThreadData;
+ thread_data.reset(tdata);
+
+ tdata->lru_tdata = lru.get_thread_data();
+ }
+ return tdata;
+}
+
+struct SubPatchWraper {
+ GeomCache::lru_t::ref_t::intrusive_ref_t intrusive_ref;
+ TessellatedSubPatch subpatch;
+};
+
+GeomCache* geom_cache_create()
+{
+ return new GeomCache();
+}
+
+void geom_cache_release(GeomCache* geom_cache)
+{
+ delete geom_cache;
+}
+
+void geom_cache_thread_init(KernelGlobals *kg, GeomCache* geom_cache)
+{
+ kg->geom_cache = geom_cache;
+ kg->geom_cache_tdata = geom_cache->get_thread_data();
+}
+
+void geom_cache_set_scene(GeomCache* geom_cache, void* scene)
+{
+ if(geom_cache)
+ geom_cache->scene = (Scene*)scene;
+}
+
+void geom_cache_clear(GeomCache* geom_cache) {
+ if(!geom_cache)
+ return;
+
+ GeomCache::lru_t* lru = &geom_cache->lru;
+ lru->clear();
+}
+
+void geom_cache_set_max_size(GeomCache * geom_cache, uint max_size) {
+ if(!geom_cache)
+ return;
+
+ GeomCache::lru_t* lru = &geom_cache->lru;
+ lru->set_max_size(max_size);
+}
+
+static void geom_cache_get_tessellated_subpatch_size(GeomCache* geom_cache, int object, int prim, uint* num_verts, uint* num_tris) {
+ Mesh* mesh = geom_cache->scene->objects[object]->mesh;
+ mesh->diced_subpatch_size(prim, num_verts, num_tris);
+}
+
+static void geom_cache_dice_subpatch(GeomCache* geom_cache, TessellatedSubPatch* subpatch, int object, int prim) {
+ Mesh* mesh = geom_cache->scene->objects[object]->mesh;
+ mesh->dice_subpatch(subpatch, prim);
+}
+
+TessellatedSubPatch* geom_cache_get_subpatch(KernelGlobals *kg, int object, int prim)
+{
+ GeomCache* geom_cache = kg->geom_cache;
+ GeomCacheThreadData* tdata = kg->geom_cache_tdata;
+
+ GeomCache::lru_t* lru = &geom_cache->lru;
+
+ GeomCache::patch_key_t key(object, prim);
+ GeomCache::lru_t::ref_t ref;
+
+ if(!lru->find_or_lock(key, ref, tdata->lru_tdata)) {
+ // get patch size
+ uint num_verts, num_tris, bvh_size = 0;
+ geom_cache_get_tessellated_subpatch_size(geom_cache, object, prim, &num_verts, &num_tris);
+
+ size_t size = sizeof(SubPatchWraper) + sizeof(float4)*(num_verts*2 + num_tris + bvh_size);
+
+ // alloc
+ SubPatchWraper* wraper = (SubPatchWraper*)operator new (size);
+ memset(wraper, 0, sizeof(SubPatchWraper));
+ TessellatedSubPatch* subpatch = &wraper->subpatch;
+
+ // insert asap to unblock other threads
+ ref = wraper;
+ ref.set_size(size);
+ lru->insert_and_unlock(key, ref, tdata->lru_tdata);
+
+ subpatch->object = object;
+ subpatch->prim = prim;
+
+ subpatch->vert_offset = 0;
+ subpatch->tri_offset = num_verts*2;
+ subpatch->bvh_offset = -1;
+
+ // dice
+ geom_cache_dice_subpatch(geom_cache, subpatch, object, prim);
+
+ // displace
+ // TODO(mai): implement
+
+ // signal subpatch completion
+ ref.mark_ready();
+ }
+ else {
+ ref.wait_till_ready();
+ }
+
+ /* extra ref so subpatch doesnt deallocate when falling out of scope here, caller needs a ref without ref_t */
+ ref.inc();
+ return &ref->subpatch;
+}
+
+void geom_cache_release_subpatch(KernelGlobals *kg, TessellatedSubPatch *subpatch) {
+ SubPatchWraper* wraper = (SubPatchWraper*)((char*)subpatch - offsetof(SubPatchWraper, subpatch));
+
+ GeomCache::lru_t::ref_t ref(wraper);
+ ref.dec(); /* extra unref to cause subpatch to dellocated when scope ends (if ref not held elsewhere) */
+}
+
+CCL_NAMESPACE_END
+
+
diff --git a/intern/cycles/kernel/geom/geom_cache.h b/intern/cycles/kernel/geom/geom_cache.h
new file mode 100644
index 0000000..5f423ca
--- /dev/null
+++ b/intern/cycles/kernel/geom/geom_cache.h
@@ -0,0 +1,33 @@
+/*
+ * Copyright 2011-2016 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.
+ */
+
+CCL_NAMESPACE_BEGIN
+
+struct GeomCache;
+
+GeomCache* geom_cache_create();
+void geom_cache_release(GeomCache *geom_cache);
+void geom_cache_set_scene(GeomCache *geom_cache, void *scene);
+void geom_cache_thread_init(KernelGlobals *kg, GeomCache *geom_cache);
+void geom_cache_clear(GeomCache *geom_cache);
+void geom_cache_set_max_size(GeomCache * geom_cache, uint max_size);
+
+TessellatedSubPatch* geom_cache_get_subpatch(KernelGlobals *kg, int object, int prim);
+void geom_cache_release_subpatch(KernelGlobals *kg, TessellatedSubPatch *subpatch);
+
+CCL_NAMESPACE_END
+
+
diff --git a/intern/cycles/kernel/kernel_globals.h b/intern/cycles/kernel/kernel_globals.h
index 52e718f..5dc0e91 100644
--- a/intern/cycles/kernel/kernel_globals.h
+++ b/intern/cycles/kernel/kernel_globals.h
@@ -31,6 +31,9 @@ struct OSLThreadData;
struct OSLShadingSystem;
# endif
+struct GeomCache;
+struct GeomCacheThreadData;
+
# define MAX_BYTE_IMAGES 1024
# define MAX_FLOAT_IMAGES 1024
@@ -52,6 +55,9 @@ typedef struct KernelGlobals {
OSLThreadData *osl_tdata;
# endif
+ GeomCache* geom_cache;
+ GeomCacheThreadData* geom_cache_tdata;
+
} KernelGlobals;
#endif /* __KERNEL_CPU__ */
diff --git a/intern/cycles/kernel/kernel_types.h b/intern/cycles/kernel/kernel_types.h
index c43b575..5887141 100644
--- a/intern/cycles/kernel/kernel_types.h
+++ b/intern/cycles/kernel/kernel_types.h
@@ -534,6 +534,42 @@ typedef struct Ray {
#endif
} Ray;
+/* Tessellated geometry from geometry cache */
+
+typedef struct TessellatedSubPatch {
+ int object, prim;
+
+ // index of unsplit patch
+ uint patch;
+
+ // vertex indices of unsplit patch
+ int v[4];
+ // uv of corners of subpatch within patch
+ float2 uv[4];
+
+ // shader and smooth for patch
+ uint shader;
+ bool smooth;
+
+ int num_triangles;
+
+ // offsets into data
+ int vert_offset;
+ int tri_offset;
+ int bvh_offset;
+
+ float4 data[];
+} TessellatedSubPatch;
+
+typedef struct CacheTriangle {
+ float3 verts[3];
+ float3 normals[3];
+ float2 uv[3]; // patch parametric
+ int v[4]; // patch vert indices
+ uint patch; // index of unsplit patch
+ uint shader;
+} CacheTriangle;
+
/* Intersection */
typedef ccl_addr_space struct Intersection {
@@ -542,6 +578,8 @@ typedef ccl_addr_space struct Intersection {
int object;
int type;
+ CacheTriangle cache_triangle;
+
#ifdef __KERNEL_DEBUG__
int num_traversal_steps;
int num_traversed_instances;
@@ -556,16 +594,18 @@ typedef enum PrimitiveType {
PRIMITIVE_MOTION_TRIANGLE = 2,
PRIMITIVE_CURVE = 4,
PRIMITIVE_MOTION_CURVE = 8,
+ PRIMITIVE_SUBPATCH = 16,
+ PRIMITIVE_CACHE_TRIANGLE = 32,
PRIMITIVE_ALL_TRIANGLE = (PRIMITIVE_TRIANGLE|PRIMITIVE_MOTION_TRIANGLE),
PRIMITIVE_ALL_CURVE = (PRIMITIVE_CURVE|PRIMITIVE_MOTION_CURVE),
PRIMITIVE_ALL_MOTION = (PRIMITIVE_MOTION_TRIANGLE|PRIMITIVE_MOTION_CURVE),
- PRIMITIVE_ALL = (PRIMITIVE_ALL_TRIANGLE|PRIMITIVE_ALL_CURVE),
+ PRIMITIVE_ALL = (PRIMIT
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list