Cycles: OSL build & image manager fixes.

This commit is contained in:
Brecht Van Lommel
2011-05-31 16:21:30 +00:00
parent fc68daff58
commit 966e004bbe
9 changed files with 90 additions and 20 deletions

View File

@@ -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_CUDA "/usr/local/cuda" CACHE PATH "Path to CUDA installation")
SET(CYCLES_OPENCL "" CACHE PATH "Path to OpenCL installation") SET(CYCLES_OPENCL "" CACHE PATH "Path to OpenCL installation")
SET(CYCLES_PARTIO "" CACHE PATH "Path to Partio 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 # Install, todo: deduplicate install path code

View File

@@ -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]; 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_float2(x, y) ((float2)(x, y))
#define make_float3(x, y, z) ((float3)(x, y, z, 0.0f)) #define make_float3(x, y, z) ((float3)(x, y, z, 0.0f))
#define make_float4(x, y, z, w) ((float4)(x, y, z, w)) #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_int3(x, y, z) ((int3)(x, y, z, 0))
#define make_int4(x, y, z, w) ((int4)(x, y, z, w)) #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 float4 float3;
typedef int4 int3; typedef int4 int3;

View File

@@ -18,6 +18,14 @@
/* Constant Globals */ /* Constant Globals */
#ifdef __KERNEL_CPU__
#ifdef WITH_OSL
#include "osl_globals.h"
#endif
#endif
CCL_NAMESPACE_BEGIN CCL_NAMESPACE_BEGIN
/* On the CPU, we pass along the struct KernelGlobals to nearly everywhere in /* On the CPU, we pass along the struct KernelGlobals to nearly everywhere in
@@ -27,10 +35,6 @@ CCL_NAMESPACE_BEGIN
#ifdef __KERNEL_CPU__ #ifdef __KERNEL_CPU__
#ifdef WITH_OSL
//#include "osl_globals.h"
#endif
typedef struct KernelGlobals { typedef struct KernelGlobals {
#define KERNEL_TEX(type, ttype, name) ttype name; #define KERNEL_TEX(type, ttype, name) ttype name;
@@ -42,7 +46,7 @@ typedef struct KernelGlobals {
#ifdef WITH_OSL #ifdef WITH_OSL
/* On the CPU, we also have the OSL globals here. Most data structures are shared /* 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. */ with SVM, the difference is in the shaders and object/mesh attributes. */
//OSLGlobals osl; OSLGlobals osl;
#endif #endif
} KernelGLobals; } KernelGLobals;

View File

@@ -176,6 +176,7 @@ static bool get_mesh_attribute(KernelGlobals *kg, const ShaderData *sd,
(derivatives)? &fval[1]: NULL, (derivatives)? &fval[2]: NULL); (derivatives)? &fval[1]: NULL, (derivatives)? &fval[2]: NULL);
} }
else { else {
/* todo: this won't work when float3 has w component */
float3 *fval = (float3*)val; float3 *fval = (float3*)val;
fval[0] = triangle_attribute_float3(kg, sd, attr.elem, attr.offset, fval[0] = triangle_attribute_float3(kg, sd, attr.elem, attr.offset,
(derivatives)? &fval[1]: NULL, (derivatives)? &fval[2]: NULL); (derivatives)? &fval[1]: NULL, (derivatives)? &fval[2]: NULL);

View File

@@ -25,11 +25,16 @@
#include "util_path.h" #include "util_path.h"
#include "util_progress.h" #include "util_progress.h"
#ifdef WITH_OSL
#include <OSL/oslexec.h>
#endif
CCL_NAMESPACE_BEGIN CCL_NAMESPACE_BEGIN
ImageManager::ImageManager() ImageManager::ImageManager()
{ {
need_update = true; need_update = true;
osl_texture_system = NULL;
} }
ImageManager::~ImageManager() 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) int ImageManager::add_image(const string& filename)
{ {
Image *img; Image *img;
@@ -77,8 +87,17 @@ int ImageManager::add_image(const string& filename)
return slot; 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]); assert(images[slot]);
/* decrement user count */ /* 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. */ that use them, but we do not want to reload the image all the time. */
if(images[slot]->users == 0) if(images[slot]->users == 0)
need_update = true; need_update = true;
/* todo: remove OSL image from cache */
} }
bool ImageManager::file_load_image(Image *img, device_vector<uchar4>& tex_img) 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) void ImageManager::device_load_image(Device *device, DeviceScene *dscene, int slot)
{ {
if(osl_texture_system)
return;
Image *img = images[slot]; Image *img = images[slot];
device_vector<uchar4>& tex_img = dscene->tex_image[slot]; device_vector<uchar4>& tex_img = dscene->tex_image[slot];
img->need_load = false;
if(tex_img.device_pointer) if(tex_img.device_pointer)
device->tex_free(tex_img); 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) void ImageManager::device_free_image(Device *device, DeviceScene *dscene, int slot)
{ {
if(images[slot]) { if(images[slot]) {
device->tex_free(dscene->tex_image[slot]); if(osl_texture_system) {
dscene->tex_image[slot].clear(); #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]; delete images[slot];
images[slot] = NULL; images[slot] = NULL;
@@ -206,6 +233,7 @@ void ImageManager::device_update(Device *device, DeviceScene *dscene, Progress&
string name = path_filename(images[slot]->filename); string name = path_filename(images[slot]->filename);
progress.set_status("Updating Images", "Loading " + name); progress.set_status("Updating Images", "Loading " + name);
device_load_image(device, dscene, slot); device_load_image(device, dscene, slot);
images[slot]->need_load = false;
} }
if(progress.get_cancel()) return; if(progress.get_cancel()) return;

View File

@@ -38,11 +38,13 @@ public:
~ImageManager(); ~ImageManager();
int add_image(const string& filename); 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_update(Device *device, DeviceScene *dscene, Progress& progress);
void device_free(Device *device, DeviceScene *dscene); void device_free(Device *device, DeviceScene *dscene);
void set_osl_texture_system(void *texture_system);
bool need_update; bool need_update;
private: private:
@@ -54,6 +56,7 @@ private:
}; };
vector<Image*> images; vector<Image*> images;
void *osl_texture_system;
bool file_load_image(Image *img, device_vector<uchar4>& tex_img); bool file_load_image(Image *img, device_vector<uchar4>& tex_img);

View File

@@ -53,8 +53,8 @@ ImageTextureNode::ImageTextureNode()
ImageTextureNode::~ImageTextureNode() ImageTextureNode::~ImageTextureNode()
{ {
if(image_manager && slot != -1) if(image_manager)
image_manager->remove_image(slot); image_manager->remove_image(filename);
} }
ShaderNode *ImageTextureNode::clone() const ShaderNode *ImageTextureNode::clone() const
@@ -117,8 +117,8 @@ EnvironmentTextureNode::EnvironmentTextureNode()
EnvironmentTextureNode::~EnvironmentTextureNode() EnvironmentTextureNode::~EnvironmentTextureNode()
{ {
if(image_manager && slot != -1) if(image_manager)
image_manager->remove_image(slot); image_manager->remove_image(filename);
} }
ShaderNode *EnvironmentTextureNode::clone() const ShaderNode *EnvironmentTextureNode::clone() const

View File

@@ -44,9 +44,6 @@ CCL_NAMESPACE_BEGIN
OSLShaderManager::OSLShaderManager() OSLShaderManager::OSLShaderManager()
{ {
/* todo: verify if we are leaking shaders
* todo: verify if we are leaking image cache memory */
services = new OSLRenderServices(); services = new OSLRenderServices();
/* if we let OSL create it, it leaks */ /* 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) foreach(Shader *shader, scene->shaders)
shader->need_update = false; shader->need_update = false;
/* set texture system */
scene->image_manager->set_osl_texture_system((void*)ts);
} }
void OSLShaderManager::device_free(Device *device, DeviceScene *dscene) void OSLShaderManager::device_free(Device *device, DeviceScene *dscene)

View File

@@ -172,6 +172,10 @@ struct float2 {
struct float3 { struct float3 {
float x, y, z; float x, y, z;
#ifdef WITH_OPENCL
float w;
#endif
float operator[](int i) const { return *(&x + i); } float operator[](int i) const { return *(&x + i); }
float& operator[](int i) { 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) __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}; float3 a = {x, y, z};
#endif
return a; return a;
} }