[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [37053] branches/cycles/intern/cycles: Cycles: OSL build & image manager fixes.

Brecht Van Lommel brechtvanlommel at pandora.be
Tue May 31 18:21:30 CEST 2011


Revision: 37053
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=37053
Author:   blendix
Date:     2011-05-31 16:21:30 +0000 (Tue, 31 May 2011)
Log Message:
-----------
Cycles: OSL build & image manager fixes.

Modified Paths:
--------------
    branches/cycles/intern/cycles/CMakeLists.txt
    branches/cycles/intern/cycles/kernel/kernel_compat_opencl.h
    branches/cycles/intern/cycles/kernel/kernel_globals.h
    branches/cycles/intern/cycles/kernel/osl/osl_services.cpp
    branches/cycles/intern/cycles/render/image.cpp
    branches/cycles/intern/cycles/render/image.h
    branches/cycles/intern/cycles/render/nodes.cpp
    branches/cycles/intern/cycles/render/osl.cpp
    branches/cycles/intern/cycles/util/util_types.h

Modified: branches/cycles/intern/cycles/CMakeLists.txt
===================================================================
--- branches/cycles/intern/cycles/CMakeLists.txt	2011-05-31 16:19:02 UTC (rev 37052)
+++ branches/cycles/intern/cycles/CMakeLists.txt	2011-05-31 16:21:30 UTC (rev 37053)
@@ -28,7 +28,7 @@
 SET(CYCLES_CUDA "/usr/local/cuda" CACHE PATH "Path to CUDA installation")
 SET(CYCLES_OPENCL "" CACHE PATH "Path to OpenCL installation")
 SET(CYCLES_PARTIO "" CACHE PATH "Path to Partio installation")
-SET(CYCLES_GLEW "" CACHE PATH "Path to GLUT installation")
+SET(CYCLES_GLEW "" CACHE PATH "Path to GLEW installation")
 
 # Install, todo: deduplicate install path code
 

Modified: branches/cycles/intern/cycles/kernel/kernel_compat_opencl.h
===================================================================
--- branches/cycles/intern/cycles/kernel/kernel_compat_opencl.h	2011-05-31 16:19:02 UTC (rev 37052)
+++ branches/cycles/intern/cycles/kernel/kernel_compat_opencl.h	2011-05-31 16:21:30 UTC (rev 37053)
@@ -42,6 +42,25 @@
 	return (1.0f - t)*data[index] + t*data[nindex];
 }
 
+#ifdef make_float2
+#undef make_float2
+#endif
+#ifdef make_float3
+#undef make_float3
+#endif
+#ifdef make_float4
+#undef make_float4
+#endif
+#ifdef make_int2
+#undef make_int2
+#endif
+#ifdef make_int3
+#undef make_int3
+#endif
+#ifdef make_int4
+#undef make_int4
+#endif
+
 #define make_float2(x, y) ((float2)(x, y))
 #define make_float3(x, y, z) ((float3)(x, y, z, 0.0f))
 #define make_float4(x, y, z, w) ((float4)(x, y, z, w))
@@ -49,6 +68,13 @@
 #define make_int3(x, y, z) ((int3)(x, y, z, 0))
 #define make_int4(x, y, z, w) ((int4)(x, y, z, w))
 
+#ifdef float3
+#undef float3
+#endif
+#ifdef int3
+#undef int3
+#endif
+
 typedef float4 float3;
 typedef int4 int3;
 

Modified: branches/cycles/intern/cycles/kernel/kernel_globals.h
===================================================================
--- branches/cycles/intern/cycles/kernel/kernel_globals.h	2011-05-31 16:19:02 UTC (rev 37052)
+++ branches/cycles/intern/cycles/kernel/kernel_globals.h	2011-05-31 16:21:30 UTC (rev 37053)
@@ -18,6 +18,14 @@
 
 /* Constant Globals */
 
+#ifdef __KERNEL_CPU__
+
+#ifdef WITH_OSL
+#include "osl_globals.h"
+#endif
+
+#endif
+
 CCL_NAMESPACE_BEGIN
 
 /* On the CPU, we pass along the struct KernelGlobals to nearly everywhere in
@@ -27,10 +35,6 @@
 
 #ifdef __KERNEL_CPU__
 
-#ifdef WITH_OSL
-//#include "osl_globals.h"
-#endif
-
 typedef struct KernelGlobals {
 
 #define KERNEL_TEX(type, ttype, name) ttype name;
@@ -42,7 +46,7 @@
 #ifdef WITH_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;
 #endif
 
 } KernelGLobals;

Modified: branches/cycles/intern/cycles/kernel/osl/osl_services.cpp
===================================================================
--- branches/cycles/intern/cycles/kernel/osl/osl_services.cpp	2011-05-31 16:19:02 UTC (rev 37052)
+++ branches/cycles/intern/cycles/kernel/osl/osl_services.cpp	2011-05-31 16:21:30 UTC (rev 37053)
@@ -176,6 +176,7 @@
 			(derivatives)? &fval[1]: NULL, (derivatives)? &fval[2]: NULL);
 	}
 	else {
+		/* todo: this won't work when float3 has w component */
 		float3 *fval = (float3*)val;
 		fval[0] = triangle_attribute_float3(kg, sd, attr.elem, attr.offset,
 			(derivatives)? &fval[1]: NULL, (derivatives)? &fval[2]: NULL);

Modified: branches/cycles/intern/cycles/render/image.cpp
===================================================================
--- branches/cycles/intern/cycles/render/image.cpp	2011-05-31 16:19:02 UTC (rev 37052)
+++ branches/cycles/intern/cycles/render/image.cpp	2011-05-31 16:21:30 UTC (rev 37053)
@@ -25,11 +25,16 @@
 #include "util_path.h"
 #include "util_progress.h"
 
+#ifdef WITH_OSL
+#include <OSL/oslexec.h>
+#endif
+
 CCL_NAMESPACE_BEGIN
 
 ImageManager::ImageManager()
 {
 	need_update = true;
+	osl_texture_system = NULL;
 }
 
 ImageManager::~ImageManager()
@@ -39,6 +44,11 @@
 	}
 }
 
+void ImageManager::set_osl_texture_system(void *texture_system)
+{
+	osl_texture_system = texture_system;
+}
+
 int ImageManager::add_image(const string& filename)
 {
 	Image *img;
@@ -77,8 +87,17 @@
 	return slot;
 }
 
-void ImageManager::remove_image(int slot)
+void ImageManager::remove_image(const string& filename)
 {
+	size_t slot;
+
+	for(slot = 0; slot < images.size(); slot++)
+		if(images[slot] && images[slot]->filename == filename)
+			break;
+	
+	if(slot == images.size())
+		return;
+
 	assert(images[slot]);
 
 	/* decrement user count */
@@ -90,8 +109,6 @@
 	   that use them, but we do not want to reload the image all the time. */
 	if(images[slot]->users == 0)
 		need_update = true;
-	
-	/* todo: remove OSL image from cache */
 }
 
 bool ImageManager::file_load_image(Image *img, device_vector<uchar4>& tex_img)
@@ -156,10 +173,12 @@
 
 void ImageManager::device_load_image(Device *device, DeviceScene *dscene, int slot)
 {
+	if(osl_texture_system)
+		return;
+
 	Image *img = images[slot];
 	device_vector<uchar4>& tex_img = dscene->tex_image[slot];
 
-	img->need_load = false;
 	if(tex_img.device_pointer)
 		device->tex_free(tex_img);
 
@@ -184,8 +203,16 @@
 void ImageManager::device_free_image(Device *device, DeviceScene *dscene, int slot)
 {
 	if(images[slot]) {
-		device->tex_free(dscene->tex_image[slot]);
-		dscene->tex_image[slot].clear();
+		if(osl_texture_system) {
+#ifdef WITH_OSL
+			ustring filename(images[slot]->filename);
+			((OSL::TextureSystem*)osl_texture_system)->invalidate(filename);
+#endif
+		}
+		else {
+			device->tex_free(dscene->tex_image[slot]);
+			dscene->tex_image[slot].clear();
+		}
 
 		delete images[slot];
 		images[slot] = NULL;
@@ -206,6 +233,7 @@
 				string name = path_filename(images[slot]->filename);
 				progress.set_status("Updating Images", "Loading " + name);
 				device_load_image(device, dscene, slot);
+				images[slot]->need_load = false;
 			}
 
 			if(progress.get_cancel()) return;

Modified: branches/cycles/intern/cycles/render/image.h
===================================================================
--- branches/cycles/intern/cycles/render/image.h	2011-05-31 16:19:02 UTC (rev 37052)
+++ branches/cycles/intern/cycles/render/image.h	2011-05-31 16:21:30 UTC (rev 37053)
@@ -38,11 +38,13 @@
 	~ImageManager();
 
 	int add_image(const string& filename);
-	void remove_image(int slot);
+	void remove_image(const string& filename);
 
 	void device_update(Device *device, DeviceScene *dscene, Progress& progress);
 	void device_free(Device *device, DeviceScene *dscene);
 
+	void set_osl_texture_system(void *texture_system);
+
 	bool need_update;
 
 private:
@@ -54,6 +56,7 @@
 	};
 
 	vector<Image*> images;
+	void *osl_texture_system;
 
 	bool file_load_image(Image *img, device_vector<uchar4>& tex_img);
 

Modified: branches/cycles/intern/cycles/render/nodes.cpp
===================================================================
--- branches/cycles/intern/cycles/render/nodes.cpp	2011-05-31 16:19:02 UTC (rev 37052)
+++ branches/cycles/intern/cycles/render/nodes.cpp	2011-05-31 16:21:30 UTC (rev 37053)
@@ -53,8 +53,8 @@
 
 ImageTextureNode::~ImageTextureNode()
 {
-	if(image_manager && slot != -1)
-		image_manager->remove_image(slot);
+	if(image_manager)
+		image_manager->remove_image(filename);
 }
 
 ShaderNode *ImageTextureNode::clone() const
@@ -117,8 +117,8 @@
 
 EnvironmentTextureNode::~EnvironmentTextureNode()
 {
-	if(image_manager && slot != -1)
-		image_manager->remove_image(slot);
+	if(image_manager)
+		image_manager->remove_image(filename);
 }
 
 ShaderNode *EnvironmentTextureNode::clone() const

Modified: branches/cycles/intern/cycles/render/osl.cpp
===================================================================
--- branches/cycles/intern/cycles/render/osl.cpp	2011-05-31 16:19:02 UTC (rev 37052)
+++ branches/cycles/intern/cycles/render/osl.cpp	2011-05-31 16:21:30 UTC (rev 37053)
@@ -44,9 +44,6 @@
 
 OSLShaderManager::OSLShaderManager()
 {
-	/* todo: verify if we are leaking shaders
-	 * todo: verify if we are leaking image cache memory */
-
 	services = new OSLRenderServices();
 
 	/* if we let OSL create it, it leaks */
@@ -112,6 +109,9 @@
 
 	foreach(Shader *shader, scene->shaders)
 		shader->need_update = false;
+	
+	/* set texture system */
+	scene->image_manager->set_osl_texture_system((void*)ts);
 }
 
 void OSLShaderManager::device_free(Device *device, DeviceScene *dscene)

Modified: branches/cycles/intern/cycles/util/util_types.h
===================================================================
--- branches/cycles/intern/cycles/util/util_types.h	2011-05-31 16:19:02 UTC (rev 37052)
+++ branches/cycles/intern/cycles/util/util_types.h	2011-05-31 16:21:30 UTC (rev 37053)
@@ -172,6 +172,10 @@
 struct float3 {
 	float x, y, z;
 
+#ifdef WITH_OPENCL
+	float w;
+#endif
+
 	float operator[](int i) const { return *(&x + i); }
 	float& operator[](int i) { return *(&x + i); }
 };
@@ -253,7 +257,11 @@
 
 __device float3 make_float3(float x, float y, float z)
 {
+#ifdef WITH_OPENCL
+	float3 a = {x, y, z, 0.0f};
+#else
 	float3 a = {x, y, z};
+#endif
 	return a;
 }
 




More information about the Bf-blender-cvs mailing list