[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [52702] trunk/blender/intern/cycles: Fix #33375: OSL geom: trianglevertices gave wrong coordinates for static BVH.

Brecht Van Lommel brechtvanlommel at pandora.be
Sat Dec 1 20:15:05 CET 2012


Revision: 52702
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=52702
Author:   blendix
Date:     2012-12-01 19:15:05 +0000 (Sat, 01 Dec 2012)
Log Message:
-----------
Fix #33375: OSL geom:trianglevertices gave wrong coordinates for static BVH.

Also some simple OSL optimization, passing thread data pointer directly instead
of via thread local storage, and creating ustrings for attribute lookup.

Modified Paths:
--------------
    trunk/blender/intern/cycles/device/device_cpu.cpp
    trunk/blender/intern/cycles/kernel/kernel.cpp
    trunk/blender/intern/cycles/kernel/kernel_attribute.h
    trunk/blender/intern/cycles/kernel/kernel_globals.h
    trunk/blender/intern/cycles/kernel/kernel_path.h
    trunk/blender/intern/cycles/kernel/kernel_shader.h
    trunk/blender/intern/cycles/kernel/kernel_triangle.h
    trunk/blender/intern/cycles/kernel/kernel_types.h
    trunk/blender/intern/cycles/kernel/osl/osl_closures.cpp
    trunk/blender/intern/cycles/kernel/osl/osl_globals.h
    trunk/blender/intern/cycles/kernel/osl/osl_services.cpp
    trunk/blender/intern/cycles/kernel/osl/osl_services.h
    trunk/blender/intern/cycles/kernel/osl/osl_shader.cpp
    trunk/blender/intern/cycles/kernel/osl/osl_shader.h
    trunk/blender/intern/cycles/render/object.cpp
    trunk/blender/intern/cycles/render/object.h
    trunk/blender/intern/cycles/render/osl.cpp
    trunk/blender/intern/cycles/render/osl.h
    trunk/blender/intern/cycles/util/util_thread.h

Modified: trunk/blender/intern/cycles/device/device_cpu.cpp
===================================================================
--- trunk/blender/intern/cycles/device/device_cpu.cpp	2012-12-01 19:14:55 UTC (rev 52701)
+++ trunk/blender/intern/cycles/device/device_cpu.cpp	2012-12-01 19:15:05 UTC (rev 52702)
@@ -23,9 +23,12 @@
 #include "device_intern.h"
 
 #include "kernel.h"
+#include "kernel_compat_cpu.h"
 #include "kernel_types.h"
+#include "kernel_globals.h"
 
 #include "osl_shader.h"
+#include "osl_globals.h"
 
 #include "buffers.h"
 
@@ -43,11 +46,16 @@
 {
 public:
 	TaskPool task_pool;
-	KernelGlobals *kg;
+	KernelGlobals kernel_globals;
+#ifdef WITH_OSL
+	OSLGlobals osl_globals;
+#endif
 	
 	CPUDevice(Stats &stats) : Device(stats)
 	{
-		kg = kernel_globals_create();
+#ifdef WITH_OSL
+		kernel_globals.osl = &osl_globals;
+#endif
 
 		/* do now to avoid thread issues */
 		system_cpu_support_optimized();
@@ -56,7 +64,6 @@
 	~CPUDevice()
 	{
 		task_pool.stop();
-		kernel_globals_free(kg);
 	}
 
 	bool support_advanced_shading()
@@ -95,12 +102,12 @@
 
 	void const_copy_to(const char *name, void *host, size_t size)
 	{
-		kernel_const_copy(kg, name, host, size);
+		kernel_const_copy(&kernel_globals, name, host, size);
 	}
 
 	void tex_alloc(const char *name, device_memory& mem, bool interpolation, bool periodic)
 	{
-		kernel_tex_copy(kg, name, mem.data_pointer, mem.data_width, mem.data_height);
+		kernel_tex_copy(&kernel_globals, name, mem.data_pointer, mem.data_width, mem.data_height);
 		mem.device_pointer = mem.data_pointer;
 
 		stats.mem_alloc(mem.memory_size());
@@ -116,7 +123,7 @@
 	void *osl_memory()
 	{
 #ifdef WITH_OSL
-		return kernel_osl_memory(kg);
+		return &osl_globals;
 #else
 		return NULL;
 #endif
@@ -148,9 +155,10 @@
 				return;
 		}
 
+		KernelGlobals kg = kernel_globals;
+
 #ifdef WITH_OSL
-		if(kernel_osl_use(kg))
-			OSLShader::thread_init(kg);
+		OSLShader::thread_init(&kg, &kernel_globals, &osl_globals);
 #endif
 
 		RenderTile tile;
@@ -171,7 +179,7 @@
 
 					for(int y = tile.y; y < tile.y + tile.h; y++) {
 						for(int x = tile.x; x < tile.x + tile.w; x++) {
-							kernel_cpu_optimized_path_trace(kg, render_buffer, rng_state,
+							kernel_cpu_optimized_path_trace(&kg, render_buffer, rng_state,
 								sample, x, y, tile.offset, tile.stride);
 						}
 					}
@@ -192,7 +200,7 @@
 
 					for(int y = tile.y; y < tile.y + tile.h; y++) {
 						for(int x = tile.x; x < tile.x + tile.w; x++) {
-							kernel_cpu_path_trace(kg, render_buffer, rng_state,
+							kernel_cpu_path_trace(&kg, render_buffer, rng_state,
 								sample, x, y, tile.offset, tile.stride);
 						}
 					}
@@ -212,8 +220,7 @@
 		}
 
 #ifdef WITH_OSL
-		if(kernel_osl_use(kg))
-			OSLShader::thread_free(kg);
+		OSLShader::thread_free(&kg);
 #endif
 	}
 
@@ -223,7 +230,7 @@
 		if(system_cpu_support_optimized()) {
 			for(int y = task.y; y < task.y + task.h; y++)
 				for(int x = task.x; x < task.x + task.w; x++)
-					kernel_cpu_optimized_tonemap(kg, (uchar4*)task.rgba, (float*)task.buffer,
+					kernel_cpu_optimized_tonemap(&kernel_globals, (uchar4*)task.rgba, (float*)task.buffer,
 						task.sample, task.resolution, x, y, task.offset, task.stride);
 		}
 		else
@@ -231,22 +238,23 @@
 		{
 			for(int y = task.y; y < task.y + task.h; y++)
 				for(int x = task.x; x < task.x + task.w; x++)
-					kernel_cpu_tonemap(kg, (uchar4*)task.rgba, (float*)task.buffer,
+					kernel_cpu_tonemap(&kernel_globals, (uchar4*)task.rgba, (float*)task.buffer,
 						task.sample, task.resolution, x, y, task.offset, task.stride);
 		}
 	}
 
 	void thread_shader(DeviceTask& task)
 	{
+		KernelGlobals kg = kernel_globals;
+
 #ifdef WITH_OSL
-		if(kernel_osl_use(kg))
-			OSLShader::thread_init(kg);
+		OSLShader::thread_init(&kg, &kernel_globals, &osl_globals);
 #endif
 
 #ifdef WITH_OPTIMIZED_KERNEL
 		if(system_cpu_support_optimized()) {
 			for(int x = task.shader_x; x < task.shader_x + task.shader_w; x++) {
-				kernel_cpu_optimized_shader(kg, (uint4*)task.shader_input, (float4*)task.shader_output, task.shader_eval_type, x);
+				kernel_cpu_optimized_shader(&kg, (uint4*)task.shader_input, (float4*)task.shader_output, task.shader_eval_type, x);
 
 				if(task_pool.cancelled())
 					break;
@@ -256,7 +264,7 @@
 #endif
 		{
 			for(int x = task.shader_x; x < task.shader_x + task.shader_w; x++) {
-				kernel_cpu_shader(kg, (uint4*)task.shader_input, (float4*)task.shader_output, task.shader_eval_type, x);
+				kernel_cpu_shader(&kg, (uint4*)task.shader_input, (float4*)task.shader_output, task.shader_eval_type, x);
 
 				if(task_pool.cancelled())
 					break;
@@ -264,8 +272,7 @@
 		}
 
 #ifdef WITH_OSL
-		if(kernel_osl_use(kg))
-			OSLShader::thread_free(kg);
+		OSLShader::thread_free(&kg);
 #endif
 	}
 

Modified: trunk/blender/intern/cycles/kernel/kernel.cpp
===================================================================
--- trunk/blender/intern/cycles/kernel/kernel.cpp	2012-12-01 19:14:55 UTC (rev 52701)
+++ trunk/blender/intern/cycles/kernel/kernel.cpp	2012-12-01 19:15:05 UTC (rev 52702)
@@ -29,38 +29,6 @@
 
 CCL_NAMESPACE_BEGIN
 
-/* Globals */
-
-KernelGlobals *kernel_globals_create()
-{
-	KernelGlobals *kg = new KernelGlobals();
-#ifdef WITH_OSL
-	kg->osl.use = false;
-#endif
-	return kg;
-}
-
-void kernel_globals_free(KernelGlobals *kg)
-{
-	delete kg;
-}
-
-/* OSL */
-
-#ifdef WITH_OSL
-
-void *kernel_osl_memory(KernelGlobals *kg)
-{
-	return (void*)&kg->osl;
-}
-
-bool kernel_osl_use(KernelGlobals *kg)
-{
-	return kg->osl.use;
-}
-
-#endif
-
 /* Memory Copy */
 
 void kernel_const_copy(KernelGlobals *kg, const char *name, void *host, size_t size)

Modified: trunk/blender/intern/cycles/kernel/kernel_attribute.h
===================================================================
--- trunk/blender/intern/cycles/kernel/kernel_attribute.h	2012-12-01 19:14:55 UTC (rev 52701)
+++ trunk/blender/intern/cycles/kernel/kernel_attribute.h	2012-12-01 19:15:05 UTC (rev 52702)
@@ -19,13 +19,6 @@
 #ifndef __KERNEL_ATTRIBUTE_CL__
 #define __KERNEL_ATTRIBUTE_CL__
 
-#include "util_types.h"
-
-#ifdef __OSL__
-#include <string>
-#include "util_attribute.h"
-#endif
-
 CCL_NAMESPACE_BEGIN
 
 /* note: declared in kernel.h, have to add it here because kernel.h is not available */
@@ -33,20 +26,9 @@
 
 __device_inline int find_attribute(KernelGlobals *kg, ShaderData *sd, uint id)
 {
-
 #ifdef __OSL__
-	if (kernel_osl_use(kg)) {
-		/* for OSL, a hash map is used to lookup the attribute by name. */
-		OSLGlobals::AttributeMap &attr_map = kg->osl.attribute_map[sd->object];
-		ustring stdname(std::string("std::") + std::string(attribute_standard_name((AttributeStandard)id)));
-		OSLGlobals::AttributeMap::const_iterator it = attr_map.find(stdname);
-		if (it != attr_map.end()) {
-			const OSLGlobals::Attribute &osl_attr = it->second;
-			/* return result */
-			return (osl_attr.elem == ATTR_ELEMENT_NONE) ? (int)ATTR_STD_NOT_FOUND : osl_attr.offset;
-		}
-		else
-			return (int)ATTR_STD_NOT_FOUND;
+	if (kg->osl) {
+		return OSLShader::find_attribute(kg, sd, id);
 	}
 	else
 #endif

Modified: trunk/blender/intern/cycles/kernel/kernel_globals.h
===================================================================
--- trunk/blender/intern/cycles/kernel/kernel_globals.h	2012-12-01 19:14:55 UTC (rev 52701)
+++ trunk/blender/intern/cycles/kernel/kernel_globals.h	2012-12-01 19:15:05 UTC (rev 52702)
@@ -18,14 +18,6 @@
 
 /* Constant Globals */
 
-#ifdef __KERNEL_CPU__
-
-#ifdef __OSL__
-#include "osl_globals.h"
-#endif
-
-#endif
-
 CCL_NAMESPACE_BEGIN
 
 /* On the CPU, we pass along the struct KernelGlobals to nearly everywhere in
@@ -35,6 +27,12 @@
 
 #ifdef __KERNEL_CPU__
 
+#ifdef __OSL__
+struct OSLGlobals;
+struct OSLThreadData;
+struct OSLShadingSystem;
+#endif
+
 #define MAX_BYTE_IMAGES   512
 #define MAX_FLOAT_IMAGES  5
 
@@ -51,7 +49,9 @@
 #ifdef __OSL__
 	/* On the CPU, we also have the OSL globals here. Most data structures are shared
 	 * with SVM, the difference is in the shaders and object/mesh attributes. */
-	OSLGlobals osl;
+	OSLGlobals *osl;
+	OSLShadingSystem *osl_ss;
+	OSLThreadData *osl_tdata;
 #endif
 
 } KernelGlobals;

Modified: trunk/blender/intern/cycles/kernel/kernel_path.h
===================================================================
--- trunk/blender/intern/cycles/kernel/kernel_path.h	2012-12-01 19:14:55 UTC (rev 52701)
+++ trunk/blender/intern/cycles/kernel/kernel_path.h	2012-12-01 19:15:05 UTC (rev 52702)
@@ -16,10 +16,16 @@
  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  */
 
+#ifdef __OSL__
+#include "osl_shader.h"
+#endif
+
 #include "kernel_differential.h"
 #include "kernel_montecarlo.h"
 #include "kernel_projection.h"
 #include "kernel_object.h"
+#include "kernel_attribute.h"
+#include "kernel_projection.h"
 #include "kernel_triangle.h"
 #ifdef __QBVH__
 #include "kernel_qbvh.h"

Modified: trunk/blender/intern/cycles/kernel/kernel_shader.h
===================================================================
--- trunk/blender/intern/cycles/kernel/kernel_shader.h	2012-12-01 19:14:55 UTC (rev 52701)
+++ trunk/blender/intern/cycles/kernel/kernel_shader.h	2012-12-01 19:15:05 UTC (rev 52702)
@@ -26,10 +26,6 @@
  *
  */
 
-#ifdef __OSL__
-#include "osl_shader.h"
-#endif
-
 #include "closure/bsdf.h"
 #include "closure/emissive.h"
 #include "closure/volume.h"
@@ -61,7 +57,7 @@
 	const Intersection *isect, const Ray *ray)
 {
 #ifdef __OSL__
-	if (kernel_osl_use(kg))
+	if (kg->osl)
 		OSLShader::init(kg, sd);
 #endif
 
@@ -147,7 +143,7 @@
 	int shader, int object, int prim, float u, float v, float t, float time)
 {
 #ifdef __OSL__
-	if (kernel_osl_use(kg))
+	if (kg->osl)
 		OSLShader::init(kg, sd);
 #endif
 
@@ -278,7 +274,7 @@
 __device_inline void shader_setup_from_background(KernelGlobals *kg, ShaderData *sd, const Ray *ray)
 {
 #ifdef __OSL__
-	if (kernel_osl_use(kg))
+	if (kg->osl)
 		OSLShader::init(kg, sd);
 #endif
 
@@ -387,7 +383,7 @@
 	bsdf_eval_init(eval, NBUILTIN_CLOSURES, make_float3(0.0f, 0.0f, 0.0f), kernel_data.film.use_light_pass);
 
 #ifdef __OSL__
-	if (kernel_osl_use(kg))
+	if (kg->osl)
 		return _shader_bsdf_multi_eval_osl(sd, omega_in, pdf, -1, eval, 0.0f, 0.0f);
 	else
 #endif
@@ -444,7 +440,7 @@
 
 	*pdf = 0.0f;
 #ifdef __OSL__
-	if (kernel_osl_use(kg))
+	if (kg->osl)
 		label = OSLShader::bsdf_sample(sd, sc, randu, randv, eval, *omega_in, *domega_in, *pdf);
 	else
 #endif
@@ -456,7 +452,7 @@
 		if(sd->num_closure > 1) {
 			float sweight = sc->sample_weight;
 #ifdef __OSL__
-			if (kernel_osl_use(kg))
+			if (kg->osl)

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list