[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [55707] trunk/blender/intern/cycles: Cycles: code refactoring to add generic lookup table memory.

Brecht Van Lommel brechtvanlommel at pandora.be
Mon Apr 1 22:26:44 CEST 2013


Revision: 55707
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=55707
Author:   blendix
Date:     2013-04-01 20:26:43 +0000 (Mon, 01 Apr 2013)
Log Message:
-----------
Cycles: code refactoring to add generic lookup table memory.

Modified Paths:
--------------
    trunk/blender/intern/cycles/blender/blender_sync.cpp
    trunk/blender/intern/cycles/device/device_memory.h
    trunk/blender/intern/cycles/kernel/kernel_camera.h
    trunk/blender/intern/cycles/kernel/kernel_compat_cpu.h
    trunk/blender/intern/cycles/kernel/kernel_compat_cuda.h
    trunk/blender/intern/cycles/kernel/kernel_compat_opencl.h
    trunk/blender/intern/cycles/kernel/kernel_textures.h
    trunk/blender/intern/cycles/kernel/kernel_types.h
    trunk/blender/intern/cycles/render/CMakeLists.txt
    trunk/blender/intern/cycles/render/film.cpp
    trunk/blender/intern/cycles/render/film.h
    trunk/blender/intern/cycles/render/scene.cpp
    trunk/blender/intern/cycles/render/scene.h

Added Paths:
-----------
    trunk/blender/intern/cycles/render/tables.cpp
    trunk/blender/intern/cycles/render/tables.h

Removed Paths:
-------------
    trunk/blender/intern/cycles/render/filter.cpp
    trunk/blender/intern/cycles/render/filter.h

Modified: trunk/blender/intern/cycles/blender/blender_sync.cpp
===================================================================
--- trunk/blender/intern/cycles/blender/blender_sync.cpp	2013-04-01 19:31:09 UTC (rev 55706)
+++ trunk/blender/intern/cycles/blender/blender_sync.cpp	2013-04-01 20:26:43 UTC (rev 55707)
@@ -19,7 +19,6 @@
 #include "background.h"
 #include "camera.h"
 #include "film.h"
-#include "../render/filter.h"
 #include "graph.h"
 #include "integrator.h"
 #include "light.h"
@@ -213,18 +212,11 @@
 	Film prevfilm = *film;
 
 	film->exposure = get_float(cscene, "film_exposure");
+	film->filter_type = (FilterType)RNA_enum_get(&cscene, "filter_type");
+	film->filter_width = (film->filter_type == FILTER_BOX)? 1.0f: get_float(cscene, "filter_width");
 
 	if(film->modified(prevfilm))
 		film->tag_update(scene);
-
-	Filter *filter = scene->filter;
-	Filter prevfilter = *filter;
-
-	filter->filter_type = (FilterType)RNA_enum_get(&cscene, "filter_type");
-	filter->filter_width = (filter->filter_type == FILTER_BOX)? 1.0f: get_float(cscene, "filter_width");
-
-	if(filter->modified(prevfilter))
-		filter->tag_update(scene);
 }
 
 /* Render Layer */

Modified: trunk/blender/intern/cycles/device/device_memory.h
===================================================================
--- trunk/blender/intern/cycles/device/device_memory.h	2013-04-01 19:31:09 UTC (rev 55706)
+++ trunk/blender/intern/cycles/device/device_memory.h	2013-04-01 20:26:43 UTC (rev 55707)
@@ -216,6 +216,14 @@
 		return mem;
 	}
 
+	void copy_at(T *ptr, size_t offset, size_t size)
+	{
+		if(size > 0) {
+			size_t mem_size = size*data_elements*datatype_size(data_type);
+			memcpy(&data[0] + offset, ptr, mem_size);
+		}
+	}
+
 	void reference(T *ptr, size_t width, size_t height = 0)
 	{
 		data.clear();

Modified: trunk/blender/intern/cycles/kernel/kernel_camera.h
===================================================================
--- trunk/blender/intern/cycles/kernel/kernel_camera.h	2013-04-01 19:31:09 UTC (rev 55706)
+++ trunk/blender/intern/cycles/kernel/kernel_camera.h	2013-04-01 20:26:43 UTC (rev 55707)
@@ -224,8 +224,9 @@
 	float lens_u, float lens_v, float time, Ray *ray)
 {
 	/* pixel filter */
-	float raster_x = x + kernel_tex_interp(__filter_table, filter_u, FILTER_TABLE_SIZE);
-	float raster_y = y + kernel_tex_interp(__filter_table, filter_v, FILTER_TABLE_SIZE);
+	int filter_table_offset = kernel_data.film.filter_table_offset;
+	float raster_x = x + kernel_tex_lookup(__lookup_table, filter_u, filter_table_offset, FILTER_TABLE_SIZE);
+	float raster_y = y + kernel_tex_lookup(__lookup_table, filter_v, filter_table_offset, FILTER_TABLE_SIZE);
 
 #ifdef __CAMERA_MOTION__
 	/* motion blur */

Modified: trunk/blender/intern/cycles/kernel/kernel_compat_cpu.h
===================================================================
--- trunk/blender/intern/cycles/kernel/kernel_compat_cpu.h	2013-04-01 19:31:09 UTC (rev 55706)
+++ trunk/blender/intern/cycles/kernel/kernel_compat_cpu.h	2013-04-01 20:26:43 UTC (rev 55707)
@@ -57,7 +57,7 @@
 	}
 #endif
 
-	float interp(float x, int size)
+	float lookup(float x, int offset, int size)
 	{
 		kernel_assert(size == width);
 
@@ -67,7 +67,7 @@
 		int nindex = min(index+1, width-1);
 		float t = x - index;
 
-		return (1.0f - t)*data[index] + t*data[nindex];
+		return (1.0f - t)*data[index + offset] + t*data[nindex + offset];
 	}
 
 	T *data;
@@ -157,7 +157,7 @@
 #define kernel_tex_fetch(tex, index) (kg->tex.fetch(index))
 #define kernel_tex_fetch_m128(tex, index) (kg->tex.fetch_m128(index))
 #define kernel_tex_fetch_m128i(tex, index) (kg->tex.fetch_m128i(index))
-#define kernel_tex_interp(tex, t, size) (kg->tex.interp(t, size))
+#define kernel_tex_lookup(tex, t, offset, size) (kg->tex.lookup(t, offset, size))
 #define kernel_tex_image_interp(tex, x, y) ((tex < MAX_FLOAT_IMAGES) ? kg->texture_float_images[tex].interp(x, y) : kg->texture_byte_images[tex - MAX_FLOAT_IMAGES].interp(x, y))
 
 #define kernel_data (kg->__data)

Modified: trunk/blender/intern/cycles/kernel/kernel_compat_cuda.h
===================================================================
--- trunk/blender/intern/cycles/kernel/kernel_compat_cuda.h	2013-04-01 19:31:09 UTC (rev 55706)
+++ trunk/blender/intern/cycles/kernel/kernel_compat_cuda.h	2013-04-01 20:26:43 UTC (rev 55707)
@@ -58,7 +58,7 @@
 /* Macros to handle different memory storage on different devices */
 
 #define kernel_tex_fetch(t, index) tex1Dfetch(t, index)
-#define kernel_tex_interp(t, x, size) tex1D(t, x)
+#define kernel_tex_lookup(t, x, offset, size) tex1D(t, x) // XXX broken!
 #define kernel_tex_image_interp(t, x, y) tex2D(t, x, y)
 
 #define kernel_data __data

Modified: trunk/blender/intern/cycles/kernel/kernel_compat_opencl.h
===================================================================
--- trunk/blender/intern/cycles/kernel/kernel_compat_opencl.h	2013-04-01 19:31:09 UTC (rev 55706)
+++ trunk/blender/intern/cycles/kernel/kernel_compat_opencl.h	2013-04-01 20:26:43 UTC (rev 55707)
@@ -46,7 +46,7 @@
 #define kernel_assert(cond)
 
 /* manual implementation of interpolated 1D lookup */
-__device float kernel_tex_interp_(__global float *data, int width, float x)
+__device float kernel_tex_lookup_(__global float *data, int offset, int width, float x)
 {
 	x = clamp(x, 0.0f, 1.0f)*width;
 
@@ -54,7 +54,7 @@
 	int nindex = min(index+1, width-1);
 	float t = x - index;
 
-	return (1.0f - t)*data[index] + t*data[nindex];
+	return (1.0f - t)*data[index + offset] + t*data[nindex + offset];
 }
 
 /* make_type definitions with opencl style element initializers */
@@ -114,7 +114,7 @@
 
 /* data lookup defines */
 #define kernel_data (*kg->data)
-#define kernel_tex_interp(t, x, size) kernel_tex_interp_(kg->t, size, x)
+#define kernel_tex_lookup(t, x, offset, size) kernel_tex_lookup_(kg->t, offset, size, x)
 #define kernel_tex_fetch(t, index) kg->t[index]
 
 /* define NULL */

Modified: trunk/blender/intern/cycles/kernel/kernel_textures.h
===================================================================
--- trunk/blender/intern/cycles/kernel/kernel_textures.h	2013-04-01 19:31:09 UTC (rev 55706)
+++ trunk/blender/intern/cycles/kernel/kernel_textures.h	2013-04-01 20:26:43 UTC (rev 55707)
@@ -66,8 +66,8 @@
 KERNEL_TEX(uint, texture_uint, __shader_flag)
 KERNEL_TEX(uint, texture_uint, __object_flag)
 
-/* camera/film */
-KERNEL_TEX(float, texture_float, __filter_table)
+/* lookup tables */
+KERNEL_TEX(float, texture_float, __lookup_table)
 
 /* sobol */
 KERNEL_TEX(uint, texture_uint, __sobol_directions)

Modified: trunk/blender/intern/cycles/kernel/kernel_types.h
===================================================================
--- trunk/blender/intern/cycles/kernel/kernel_types.h	2013-04-01 19:31:09 UTC (rev 55706)
+++ trunk/blender/intern/cycles/kernel/kernel_types.h	2013-04-01 20:26:43 UTC (rev 55707)
@@ -611,8 +611,9 @@
 
 	int pass_shadow;
 	float pass_shadow_scale;
-	int pass_pad1;
-	int pass_pad2;
+
+	int filter_table_offset;
+	int filter_pad;
 } KernelFilm;
 
 typedef struct KernelBackground {

Modified: trunk/blender/intern/cycles/render/CMakeLists.txt
===================================================================
--- trunk/blender/intern/cycles/render/CMakeLists.txt	2013-04-01 19:31:09 UTC (rev 55706)
+++ trunk/blender/intern/cycles/render/CMakeLists.txt	2013-04-01 20:26:43 UTC (rev 55707)
@@ -20,7 +20,6 @@
 	camera.cpp
 	film.cpp
 	# film_response.cpp (code unused)
-	filter.cpp
 	graph.cpp
 	image.cpp
 	integrator.cpp
@@ -37,6 +36,7 @@
 	shader.cpp
 	sobol.cpp
 	svm.cpp
+	tables.cpp
 	tile.cpp
 )
 
@@ -47,7 +47,6 @@
 	camera.h
 	film.h
 	# film_response.h (code unused)
-	filter.h
 	graph.h
 	image.h
 	integrator.h
@@ -63,6 +62,7 @@
 	shader.h
 	sobol.h
 	svm.h
+	tables.h
 	tile.h
 )
 

Modified: trunk/blender/intern/cycles/render/film.cpp
===================================================================
--- trunk/blender/intern/cycles/render/film.cpp	2013-04-01 19:31:09 UTC (rev 55706)
+++ trunk/blender/intern/cycles/render/film.cpp	2013-04-01 20:26:43 UTC (rev 55707)
@@ -22,9 +22,12 @@
 #include "integrator.h"
 #include "mesh.h"
 #include "scene.h"
+#include "tables.h"
 
 #include "util_algorithm.h"
+#include "util_debug.h"
 #include "util_foreach.h"
+#include "util_math.h"
 
 CCL_NAMESPACE_BEGIN
 
@@ -171,12 +174,84 @@
 	return false;
 }
 
+/* Pixel Filter */
+
+static float filter_func_box(float v, float width)
+{
+	return (float)1;
+}
+
+static float filter_func_gaussian(float v, float width)
+{
+	v *= (float)2/width;
+	return (float)expf((float)-2*v*v);
+}
+
+static vector<float> filter_table(FilterType type, float width)
+{
+	const int filter_table_size = FILTER_TABLE_SIZE-1;
+	vector<float> filter_table_cdf(filter_table_size+1);
+	vector<float> filter_table(filter_table_size+1);
+	float (*filter_func)(float, float) = NULL;
+	int i, half_size = filter_table_size/2;
+
+	switch(type) {
+		case FILTER_BOX:
+			filter_func = filter_func_box;
+			break;
+		case FILTER_GAUSSIAN:
+			filter_func = filter_func_gaussian;
+			break;
+		default:
+			assert(0);
+	}
+
+	/* compute cumulative distribution function */
+	filter_table_cdf[0] = 0.0f;
+	
+	for(i = 0; i < filter_table_size; i++) {
+		float x = i*width*0.5f/(filter_table_size-1);
+		float y = filter_func(x, width);
+		filter_table_cdf[i+1] += filter_table_cdf[i] + fabsf(y);
+	}
+
+	for(i = 0; i <= filter_table_size; i++)
+		filter_table_cdf[i] /= filter_table_cdf[filter_table_size];
+	
+	/* create importance sampling table */
+	for(i = 0; i <= half_size; i++) {
+		float x = i/(float)half_size;
+		int index = upper_bound(filter_table_cdf.begin(), filter_table_cdf.end(), x) - filter_table_cdf.begin();
+		float t;
+
+		if(index < filter_table_size+1) {
+			t = (x - filter_table_cdf[index])/(filter_table_cdf[index+1] - filter_table_cdf[index]);
+		}
+		else {
+			t = 0.0f;
+			index = filter_table_size;
+		}
+
+		float y = ((index + t)/(filter_table_size))*width;
+
+		filter_table[half_size+i] = 0.5f*(1.0f + y);
+		filter_table[half_size-i] = 0.5f*(1.0f - y);
+	}
+
+	return filter_table;
+}
+
 /* Film */
 
 Film::Film()
 {
 	exposure = 0.8f;
 	Pass::add(PASS_COMBINED, passes);
+
+	filter_type = FILTER_BOX;
+	filter_width = 1.0f;
+	filter_table_offset = -1;
+
 	need_update = true;
 }
 
@@ -184,10 +259,12 @@
 {
 }
 
-void Film::device_update(Device *device, DeviceScene *dscene)
+void Film::device_update(Device *device, DeviceScene *dscene, Scene *scene)
 {
 	if(!need_update)
 		return;
+	
+	device_free(device, dscene, scene);
 
 	KernelFilm *kfilm = &dscene->data.film;
 

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list