diff options
author | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2011-05-31 20:21:30 +0400 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2011-05-31 20:21:30 +0400 |
commit | 966e004bbea6304840cd73f262d91a5e65464e5f (patch) | |
tree | b9d4a9e233e471e2fa143e27b26058d6093c9d56 /intern/cycles | |
parent | fc68daff582664bc1ccba57b9408973c5e8d83ec (diff) |
Cycles: OSL build & image manager fixes.
Diffstat (limited to 'intern/cycles')
-rw-r--r-- | intern/cycles/CMakeLists.txt | 2 | ||||
-rw-r--r-- | intern/cycles/kernel/kernel_compat_opencl.h | 26 | ||||
-rw-r--r-- | intern/cycles/kernel/kernel_globals.h | 14 | ||||
-rw-r--r-- | intern/cycles/kernel/osl/osl_services.cpp | 1 | ||||
-rw-r--r-- | intern/cycles/render/image.cpp | 40 | ||||
-rw-r--r-- | intern/cycles/render/image.h | 5 | ||||
-rw-r--r-- | intern/cycles/render/nodes.cpp | 8 | ||||
-rw-r--r-- | intern/cycles/render/osl.cpp | 6 | ||||
-rw-r--r-- | intern/cycles/util/util_types.h | 8 |
9 files changed, 90 insertions, 20 deletions
diff --git a/intern/cycles/CMakeLists.txt b/intern/cycles/CMakeLists.txt index 5877b26b7f5..38be2f62ec4 100644 --- a/intern/cycles/CMakeLists.txt +++ b/intern/cycles/CMakeLists.txt @@ -28,7 +28,7 @@ SET(CYCLES_BOOST "/usr" CACHE PATH "Path to Boost installation") 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 diff --git a/intern/cycles/kernel/kernel_compat_opencl.h b/intern/cycles/kernel/kernel_compat_opencl.h index c8be03d7dd0..6ff9340e645 100644 --- a/intern/cycles/kernel/kernel_compat_opencl.h +++ b/intern/cycles/kernel/kernel_compat_opencl.h @@ -42,6 +42,25 @@ __device float kernel_tex_interp_(__global float *data, int width, float x) 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 @@ __device float kernel_tex_interp_(__global float *data, int width, float x) #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; diff --git a/intern/cycles/kernel/kernel_globals.h b/intern/cycles/kernel/kernel_globals.h index 720a9f28fa1..f37b27cc9f4 100644 --- a/intern/cycles/kernel/kernel_globals.h +++ b/intern/cycles/kernel/kernel_globals.h @@ -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 @@ CCL_NAMESPACE_BEGIN #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 @@ typedef struct KernelGlobals { #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; diff --git a/intern/cycles/kernel/osl/osl_services.cpp b/intern/cycles/kernel/osl/osl_services.cpp index ded3a68d667..1b52a3e489b 100644 --- a/intern/cycles/kernel/osl/osl_services.cpp +++ b/intern/cycles/kernel/osl/osl_services.cpp @@ -176,6 +176,7 @@ static bool get_mesh_attribute(KernelGlobals *kg, const ShaderData *sd, (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); diff --git a/intern/cycles/render/image.cpp b/intern/cycles/render/image.cpp index 08127cf7409..5dc86837bcf 100644 --- a/intern/cycles/render/image.cpp +++ b/intern/cycles/render/image.cpp @@ -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 @@ ImageManager::~ImageManager() } } +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 @@ int ImageManager::add_image(const string& filename) 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 @@ void ImageManager::remove_image(int slot) 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 @@ bool ImageManager::file_load_image(Image *img, device_vector<uchar4>& tex_img) 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_load_image(Device *device, DeviceScene *dscene, int sl 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 @@ void ImageManager::device_update(Device *device, DeviceScene *dscene, Progress& 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; diff --git a/intern/cycles/render/image.h b/intern/cycles/render/image.h index a0bf29088b7..0d49a1e6b67 100644 --- a/intern/cycles/render/image.h +++ b/intern/cycles/render/image.h @@ -38,11 +38,13 @@ public: ~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 @@ private: }; vector<Image*> images; + void *osl_texture_system; bool file_load_image(Image *img, device_vector<uchar4>& tex_img); diff --git a/intern/cycles/render/nodes.cpp b/intern/cycles/render/nodes.cpp index 0e14deac98f..546d74c5c22 100644 --- a/intern/cycles/render/nodes.cpp +++ b/intern/cycles/render/nodes.cpp @@ -53,8 +53,8 @@ ImageTextureNode::ImageTextureNode() 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() EnvironmentTextureNode::~EnvironmentTextureNode() { - if(image_manager && slot != -1) - image_manager->remove_image(slot); + if(image_manager) + image_manager->remove_image(filename); } ShaderNode *EnvironmentTextureNode::clone() const diff --git a/intern/cycles/render/osl.cpp b/intern/cycles/render/osl.cpp index 068ae883930..446cf72f5d6 100644 --- a/intern/cycles/render/osl.cpp +++ b/intern/cycles/render/osl.cpp @@ -44,9 +44,6 @@ CCL_NAMESPACE_BEGIN 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 @@ void OSLShaderManager::device_update(Device *device, DeviceScene *dscene, Scene 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) diff --git a/intern/cycles/util/util_types.h b/intern/cycles/util/util_types.h index bc7ba056390..02ab59a261f 100644 --- a/intern/cycles/util/util_types.h +++ b/intern/cycles/util/util_types.h @@ -172,6 +172,10 @@ struct float2 { 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 float2 make_float2(float x, float y) __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; } |