[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