Fix #34601: cycles OSL crash when using preview render and viewport render at
authorBrecht Van Lommel <brechtvanlommel@pandora.be>
Thu, 4 Apr 2013 23:48:07 +0000 (23:48 +0000)
committerBrecht Van Lommel <brechtvanlommel@pandora.be>
Thu, 4 Apr 2013 23:48:07 +0000 (23:48 +0000)
the same time, due to shared texture cache system.

intern/cycles/render/osl.cpp
intern/cycles/render/osl.h

index cefb6315725908a5e4fd77a4a1472f16b12795cb..3294f1ebe4c926a88a840cbcf492343d47621ddd 100644 (file)
@@ -41,6 +41,12 @@ CCL_NAMESPACE_BEGIN
 
 #ifdef WITH_OSL
 
+/* Shared Texture System */
+
+OSL::TextureSystem *OSLShaderManager::ts_shared = NULL;
+int OSLShaderManager::ts_shared_users = 0;
+thread_mutex OSLShaderManager::ts_shared_mutex;
+
 /* Shader Manager */
 
 OSLShaderManager::OSLShaderManager()
@@ -54,7 +60,17 @@ OSLShaderManager::OSLShaderManager()
 OSLShaderManager::~OSLShaderManager()
 {
        OSL::ShadingSystem::destroy(ss);
-       OSL::TextureSystem::destroy(ts);
+
+       /* shared texture system decrease users and destroy if no longer used */
+       {
+               thread_scoped_lock lock(ts_shared_mutex);
+               ts_shared_users--;
+
+               if(ts_shared_users == 0) {
+                       OSL::TextureSystem::destroy(ts_shared);
+                       ts_shared = NULL;
+               }
+       }
 
        delete services;
 }
@@ -133,14 +149,22 @@ void OSLShaderManager::device_free(Device *device, DeviceScene *dscene, Scene *s
 
 void OSLShaderManager::texture_system_init()
 {
-       /* if we let OSL create it, it leaks */
-       ts = TextureSystem::create(true);
-       ts->attribute("automip",  1);
-       ts->attribute("autotile", 64);
-       ts->attribute("gray_to_rgb", 1);
+       /* create texture system, shared between different renders to reduce memory usage */
+       thread_scoped_lock lock(ts_shared_mutex);
+
+       if(ts_shared_users == 0) {
+               ts_shared = TextureSystem::create(true);
+
+               ts_shared->attribute("automip",  1);
+               ts_shared->attribute("autotile", 64);
+               ts_shared->attribute("gray_to_rgb", 1);
+
+               /* effectively unlimited for now, until we support proper mipmap lookups */
+               ts_shared->attribute("max_memory_MB", 16384);
+       }
 
-       /* effectively unlimited for now, until we support proper mipmap lookups */
-       ts->attribute("max_memory_MB", 16384);
+       ts = ts_shared;
+       ts_shared_users++;
 }
 
 void OSLShaderManager::shading_system_init()
index 2d3996df0eb087403ae37bf1f208d1d76285cb94..c459f6bfa08cbada4a3f2452b00e46a6d9385215 100644 (file)
@@ -21,6 +21,7 @@
 
 #include "util_set.h"
 #include "util_string.h"
+#include "util_thread.h"
 
 #include "shader.h"
 
@@ -92,6 +93,10 @@ protected:
        OSLRenderServices *services;
        OSL::ErrorHandler errhandler;
        map<string, OSLShaderInfo> loaded_shaders;
+
+       static OSL::TextureSystem *ts_shared;
+       static thread_mutex ts_shared_mutex;
+       static int ts_shared_users;
 };
 
 #endif