Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--intern/cycles/CMakeLists.txt2
-rw-r--r--intern/cycles/kernel/kernel_compat_opencl.h26
-rw-r--r--intern/cycles/kernel/kernel_globals.h14
-rw-r--r--intern/cycles/kernel/osl/osl_services.cpp1
-rw-r--r--intern/cycles/render/image.cpp40
-rw-r--r--intern/cycles/render/image.h5
-rw-r--r--intern/cycles/render/nodes.cpp8
-rw-r--r--intern/cycles/render/osl.cpp6
-rw-r--r--intern/cycles/util/util_types.h8
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;
}