[Bf-blender-cvs] [0f61e961613] cycles_texture_cache: Cycles: made OSL shading use .tx files where available, added a mutex to the kernel texture name array

Stefan Werner noreply at git.blender.org
Mon Nov 27 20:40:09 CET 2017


Commit: 0f61e9616135443253ba3b9266c79612f7eb15cd
Author: Stefan Werner
Date:   Thu May 4 23:36:44 2017 +0200
Branches: cycles_texture_cache
https://developer.blender.org/rB0f61e9616135443253ba3b9266c79612f7eb15cd

Cycles: made OSL shading use .tx files where available, added a mutex to the kernel texture name array

===================================================================

M	intern/cycles/kernel/kernel_oiio_globals.h
M	intern/cycles/kernel/svm/svm_image.h
M	intern/cycles/render/image.cpp
M	intern/cycles/render/image.h
M	intern/cycles/render/nodes.cpp

===================================================================

diff --git a/intern/cycles/kernel/kernel_oiio_globals.h b/intern/cycles/kernel/kernel_oiio_globals.h
index 713752d3a3d..f40b91b8c1e 100644
--- a/intern/cycles/kernel/kernel_oiio_globals.h
+++ b/intern/cycles/kernel/kernel_oiio_globals.h
@@ -19,6 +19,7 @@
 
 #include <OpenImageIO/texture.h>
 #include "util/util_vector.h"
+#include "util/util_thread.h"
 
 CCL_NAMESPACE_BEGIN
 
@@ -26,6 +27,7 @@ struct OIIOGlobals
 {
 public:
 	OIIO::TextureSystem *tex_sys;
+	thread_mutex tex_paths_mutex;
 	vector<OIIO::TextureSystem::TextureHandle*> tex_paths;
 };
 
diff --git a/intern/cycles/kernel/svm/svm_image.h b/intern/cycles/kernel/svm/svm_image.h
index 934347c5964..8d36d7383bb 100644
--- a/intern/cycles/kernel/svm/svm_image.h
+++ b/intern/cycles/kernel/svm/svm_image.h
@@ -28,7 +28,7 @@ ccl_device float4 svm_image_texture(KernelGlobals *kg, int id, float x, float y,
 		OIIO::TextureOpt options;
 		options.swrap = options.twrap = OIIO::TextureOpt::WrapPeriodic;
 		options.interpmode = OIIO::TextureOpt::InterpBilinear;
-		options.mipmode = OIIO::TextureOpt::MipModeNoMIP;
+		options.mipmode = OIIO::TextureOpt::MipModeOneLevel;
 		if(kg->oiio->tex_paths[id]) {
 			bool success = kg->oiio->tex_sys->texture(kg->oiio->tex_paths[id], kg->oiio->tex_sys->get_perthread_info(), options, x, 1.0f - y, 0.0f, 0.0f, 0.0f, 0.0f, 3, (float*)&r);
 			if(!success) {
diff --git a/intern/cycles/render/image.cpp b/intern/cycles/render/image.cpp
index a52e58d42d7..4eef11e7237 100644
--- a/intern/cycles/render/image.cpp
+++ b/intern/cycles/render/image.cpp
@@ -189,6 +189,27 @@ ImageDataType ImageManager::get_image_metadata(const string& filename,
 	}
 }
 
+const string ImageManager::get_mip_map_path(const string& filename)
+{
+	if(!path_exists(filename)) {
+		return "";
+	}
+	
+	string::size_type idx = filename.rfind('.');
+	if(idx != string::npos) {
+		std::string extension = filename.substr(idx+1);
+		if(extension == "tx") {
+			return filename;
+		}
+	}
+	
+	string tx_name = filename + ".tx";
+	if(path_exists(tx_name)) {
+		return tx_name;
+	}
+	return "";
+}
+
 int ImageManager::max_flattened_slot(ImageDataType type)
 {
 	if(tex_num_images[type] == 0) {
@@ -711,6 +732,7 @@ void ImageManager::device_load_image(Device *device,
 		}
 		OIIOGlobals *oiio = (OIIOGlobals*)device->oiio_memory();
 		if(oiio) {
+			thread_scoped_lock lock(oiio->tex_paths_mutex);
 			int flat_slot = type_index_to_flattened_slot(slot, type);
 			if (oiio->tex_paths.size() <= flat_slot) {
 				oiio->tex_paths.resize(flat_slot+1);
diff --git a/intern/cycles/render/image.h b/intern/cycles/render/image.h
index 2bbc75a3326..3972baf433c 100644
--- a/intern/cycles/render/image.h
+++ b/intern/cycles/render/image.h
@@ -72,6 +72,7 @@ public:
 	void device_free_builtin(Device *device);
 
 	void set_oiio_texture_system(void *texture_system);
+	const string get_mip_map_path(const string& filename);
 	void set_pack_images(bool pack_images_);
 	bool set_animation_frame_update(int frame);
 
diff --git a/intern/cycles/render/nodes.cpp b/intern/cycles/render/nodes.cpp
index 4452fadaf02..24096907c74 100644
--- a/intern/cycles/render/nodes.cpp
+++ b/intern/cycles/render/nodes.cpp
@@ -386,6 +386,7 @@ void ImageTextureNode::compile(OSLCompiler& compiler)
 	}
 
 	if(slot == -1) {
+		filename = image_manager->get_mip_map_path(filename.string());
 		compiler.parameter(this, "filename");
 	}
 	else {



More information about the Bf-blender-cvs mailing list