[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