[Bf-blender-cvs] [9d1417d2102] upstream_cycles_texture_cache: Cycles: Cached textures now support extension and interpolation modes

Stefan Werner noreply at git.blender.org
Wed Jun 27 14:04:44 CEST 2018


Commit: 9d1417d210232d575c14cf8cbb1d62223fbff0b2
Author: Stefan Werner
Date:   Tue May 16 11:44:13 2017 +0200
Branches: upstream_cycles_texture_cache
https://developer.blender.org/rB9d1417d210232d575c14cf8cbb1d62223fbff0b2

Cycles: Cached textures now support extension and interpolation modes

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

M	intern/cycles/device/device_cpu.cpp
M	intern/cycles/kernel/kernel_globals.h
M	intern/cycles/kernel/kernel_oiio_globals.h
M	intern/cycles/kernel/kernels/cpu/filter_avx.cpp
M	intern/cycles/kernel/kernels/cpu/filter_avx2.cpp
M	intern/cycles/kernel/kernels/cpu/kernel_split_avx.cpp
M	intern/cycles/kernel/kernels/cpu/kernel_split_avx2.cpp
M	intern/cycles/kernel/svm/svm_image.h
M	intern/cycles/render/image.cpp

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

diff --git a/intern/cycles/device/device_cpu.cpp b/intern/cycles/device/device_cpu.cpp
index a7145246380..68a6534c6df 100644
--- a/intern/cycles/device/device_cpu.cpp
+++ b/intern/cycles/device/device_cpu.cpp
@@ -910,6 +910,10 @@ protected:
 #ifdef WITH_OSL
 		OSLShader::thread_init(&kg, &kernel_globals, &osl_globals);
 #endif
+		if(kg.oiio && kg.oiio->tex_sys) {
+			kg.oiio_tdata = kg.oiio->tex_sys->get_perthread_info();
+		}
+
 		return kg;
 	}
 
diff --git a/intern/cycles/kernel/kernel_globals.h b/intern/cycles/kernel/kernel_globals.h
index 9b6917a956f..5bd74a3ba3c 100644
--- a/intern/cycles/kernel/kernel_globals.h
+++ b/intern/cycles/kernel/kernel_globals.h
@@ -64,8 +64,9 @@ typedef struct KernelGlobals {
 
 #  ifdef __OIIO__
 	OIIOGlobals *oiio;
+	void* oiio_tdata;
 #  endif
-	
+
 	/* **** Run-time data ****  */
 
 	/* Heap-allocated storage for transparent shadows intersections. */
diff --git a/intern/cycles/kernel/kernel_oiio_globals.h b/intern/cycles/kernel/kernel_oiio_globals.h
index f40b91b8c1e..d8e81d98659 100644
--- a/intern/cycles/kernel/kernel_oiio_globals.h
+++ b/intern/cycles/kernel/kernel_oiio_globals.h
@@ -23,12 +23,18 @@
 
 CCL_NAMESPACE_BEGIN
 
+struct OIIOTexture
+{
+	OIIO::TextureSystem::TextureHandle* handle;
+	OIIO::TextureOpt::InterpMode interpolation;
+	OIIO::TextureOpt::Wrap extension;
+};
+
 struct OIIOGlobals
 {
-public:
 	OIIO::TextureSystem *tex_sys;
 	thread_mutex tex_paths_mutex;
-	vector<OIIO::TextureSystem::TextureHandle*> tex_paths;
+	vector<OIIOTexture> textures;
 };
 
 CCL_NAMESPACE_END
diff --git a/intern/cycles/kernel/kernels/cpu/filter_avx.cpp b/intern/cycles/kernel/kernels/cpu/filter_avx.cpp
index 4a9e6047ecf..1067f78573e 100644
--- a/intern/cycles/kernel/kernels/cpu/filter_avx.cpp
+++ b/intern/cycles/kernel/kernels/cpu/filter_avx.cpp
@@ -34,6 +34,8 @@
 #  endif
 #endif  /* WITH_CYCLES_OPTIMIZED_KERNEL_AVX */
 
+#define OIIO_NO_AVX 1
+
 #include "kernel/filter/filter.h"
 #define KERNEL_ARCH cpu_avx
 #include "kernel/kernels/cpu/filter_cpu_impl.h"
diff --git a/intern/cycles/kernel/kernels/cpu/filter_avx2.cpp b/intern/cycles/kernel/kernels/cpu/filter_avx2.cpp
index c22ec576254..e1af8828fd1 100644
--- a/intern/cycles/kernel/kernels/cpu/filter_avx2.cpp
+++ b/intern/cycles/kernel/kernels/cpu/filter_avx2.cpp
@@ -35,6 +35,8 @@
 #  endif
 #endif  /* WITH_CYCLES_OPTIMIZED_KERNEL_AVX2 */
 
+#define OIIO_NO_AVX 1
+
 #include "kernel/filter/filter.h"
 #define KERNEL_ARCH cpu_avx2
 #include "kernel/kernels/cpu/filter_cpu_impl.h"
diff --git a/intern/cycles/kernel/kernels/cpu/kernel_split_avx.cpp b/intern/cycles/kernel/kernels/cpu/kernel_split_avx.cpp
index 6ba3425a343..09d861dbc4d 100644
--- a/intern/cycles/kernel/kernels/cpu/kernel_split_avx.cpp
+++ b/intern/cycles/kernel/kernels/cpu/kernel_split_avx.cpp
@@ -36,6 +36,8 @@
 #  endif
 #endif  /* WITH_CYCLES_OPTIMIZED_KERNEL_AVX */
 
+#define OIIO_NO_AVX 1
+
 #include "kernel/kernel.h"
 #define KERNEL_ARCH cpu_avx
 #include "kernel/kernels/cpu/kernel_cpu_impl.h"
diff --git a/intern/cycles/kernel/kernels/cpu/kernel_split_avx2.cpp b/intern/cycles/kernel/kernels/cpu/kernel_split_avx2.cpp
index 76b2d77ebb8..58d87ba7fe5 100644
--- a/intern/cycles/kernel/kernels/cpu/kernel_split_avx2.cpp
+++ b/intern/cycles/kernel/kernels/cpu/kernel_split_avx2.cpp
@@ -37,6 +37,8 @@
 #  endif
 #endif  /* WITH_CYCLES_OPTIMIZED_KERNEL_AVX2 */
 
+#define OIIO_NO_AVX 1
+
 #include "kernel/kernel.h"
 #define KERNEL_ARCH cpu_avx2
 #include "kernel/kernels/cpu/kernel_cpu_impl.h"
diff --git a/intern/cycles/kernel/svm/svm_image.h b/intern/cycles/kernel/svm/svm_image.h
index e451f14f264..2d11401c406 100644
--- a/intern/cycles/kernel/svm/svm_image.h
+++ b/intern/cycles/kernel/svm/svm_image.h
@@ -24,19 +24,19 @@ ccl_device float4 svm_image_texture(KernelGlobals *kg, int id, float x, float y,
 {
 	float4 r;
 #  ifdef __OIIO__
-	if(kg->oiio && kg->oiio->tex_paths.size() > id && kg->oiio->tex_paths[id]) {
+	if(kg->oiio && kg->oiio->textures.size() > id && kg->oiio->textures[id].handle) {
 		OIIO::TextureOpt options;
-		options.swrap = options.twrap = OIIO::TextureOpt::WrapPeriodic;
+		options.swrap = options.twrap = kg->oiio->textures[id].extension;
 
 		if(fast_lookup) {
 			options.interpmode = OIIO::TextureOpt::InterpClosest;
 			options.mipmode = OIIO::TextureOpt::MipModeOneLevel;
 		}
 		else {
-			options.interpmode = OIIO::TextureOpt::InterpBilinear;
+			options.interpmode = kg->oiio->textures[id].interpolation;
 			options.mipmode = OIIO::TextureOpt::MipModeAniso;
 		}
-		bool success = kg->oiio->tex_sys->texture(kg->oiio->tex_paths[id], kg->oiio->tex_sys->get_perthread_info(), options, x, 1.0f - y, ds.dx, ds.dy, dt.dx, dt.dy, 3, (float*)&r);
+		bool success = kg->oiio->tex_sys->texture(kg->oiio->textures[id].handle, (OIIO::TextureSystem::Perthread*)kg->oiio_tdata, options, x, 1.0f - y, ds.dx, ds.dy, dt.dx, dt.dy, 3, (float*)&r);
 		if(!success) {
 			(void) kg->oiio->tex_sys->geterror();
 		}
@@ -95,7 +95,7 @@ ccl_device void svm_node_tex_image(KernelGlobals *kg, ShaderData *sd, int path_f
 		tex_co = make_float2(co.x, co.y);
 	}
 
-	bool fast_lookup = path_flag & (PATH_RAY_DIFFUSE | PATH_RAY_SHADOW | PATH_RAY_DIFFUSE_ANCESTOR | PATH_RAY_VOLUME_SCATTER);
+	bool fast_lookup = path_flag & (PATH_RAY_DIFFUSE | PATH_RAY_SHADOW | PATH_RAY_DIFFUSE_ANCESTOR | PATH_RAY_VOLUME_SCATTER | PATH_RAY_GLOSSY);
 
 	differential ds, dt;
 #ifdef __KERNEL_CPU__
diff --git a/intern/cycles/render/image.cpp b/intern/cycles/render/image.cpp
index ed4f090cd8a..884ff2ab288 100644
--- a/intern/cycles/render/image.cpp
+++ b/intern/cycles/render/image.cpp
@@ -745,15 +745,43 @@ void ImageManager::device_load_image(Device *device,
 		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);
+			if (oiio->textures.size() <= flat_slot) {
+				oiio->textures.resize(flat_slot+1);
 			}
 			OIIO::TextureSystem *tex_sys = (OIIO::TextureSystem*)oiio_texture_system;
 			OIIO::TextureSystem::TextureHandle *handle = tex_sys->get_texture_handle(OIIO::ustring(img->filename.c_str()));
 			if(tex_sys->good(handle)) {
-				oiio->tex_paths[flat_slot] = handle;
+				oiio->textures[flat_slot].handle = handle;
+				switch(img->interpolation) {
+					case INTERPOLATION_SMART:
+						oiio->textures[flat_slot].interpolation = OIIO::TextureOpt::InterpSmartBicubic;
+						break;
+					case INTERPOLATION_CUBIC:
+						oiio->textures[flat_slot].interpolation = OIIO::TextureOpt::InterpBicubic;
+						break;
+					case INTERPOLATION_LINEAR:
+						oiio->textures[flat_slot].interpolation = OIIO::TextureOpt::InterpBilinear;
+						break;
+					case INTERPOLATION_NONE:
+					case INTERPOLATION_CLOSEST:
+					default:
+						oiio->textures[flat_slot].interpolation = OIIO::TextureOpt::InterpClosest;
+						break;
+				}
+				switch(img->extension) {
+					case EXTENSION_CLIP:
+						oiio->textures[flat_slot].extension = OIIO::TextureOpt::WrapBlack;
+						break;
+					case EXTENSION_EXTEND:
+						oiio->textures[flat_slot].extension = OIIO::TextureOpt::WrapClamp;
+						break;
+					case EXTENSION_REPEAT:
+					default:
+						oiio->textures[flat_slot].extension = OIIO::TextureOpt::WrapPeriodic;
+						break;
+				}
 			} else {
-				oiio->tex_paths[flat_slot] = NULL;
+				oiio->textures[flat_slot].handle = NULL;
 			}
 		}
 		img->need_load = false;
@@ -932,7 +960,7 @@ void ImageManager::device_free_image(Device *, ImageDataType type, int slot)
 	if(img) {
 		if(oiio_texture_system && !img->builtin_data) {
 			ustring filename(images[type][slot]->filename);
-			((OIIO::TextureSystem*)oiio_texture_system)->invalidate(filename);
+		//	((OIIO::TextureSystem*)oiio_texture_system)->invalidate(filename);
 		}
 
 		if(img->mem) {



More information about the Bf-blender-cvs mailing list