[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