[Bf-blender-cvs] [87040ce007f] cycles_texture_cache: Refactor of texture cache, now texture handles are being stored in device tex memory.
Stefan Werner
noreply at git.blender.org
Mon May 3 20:57:20 CEST 2021
Commit: 87040ce007fee41cacfafd607ff17c89c9a5105f
Author: Stefan Werner
Date: Fri Apr 30 20:59:39 2021 +0200
Branches: cycles_texture_cache
https://developer.blender.org/rB87040ce007fee41cacfafd607ff17c89c9a5105f
Refactor of texture cache, now texture handles are being stored in device tex memory.
===================================================================
M intern/cycles/device/device_memory.cpp
M intern/cycles/kernel/kernel_oiio_globals.h
M intern/cycles/kernel/kernels/cpu/kernel_cpu_image.h
M intern/cycles/kernel/kernels/cuda/kernel_cuda_image.h
M intern/cycles/kernel/kernels/opencl/kernel_opencl_image.h
M intern/cycles/kernel/osl/osl_services.cpp
M intern/cycles/kernel/svm/svm_image.h
M intern/cycles/kernel/svm/svm_sky.h
M intern/cycles/render/geometry.cpp
M intern/cycles/render/image.cpp
M intern/cycles/render/image.h
M intern/cycles/render/image_oiio.cpp
M intern/cycles/render/nodes.cpp
M intern/cycles/render/shader.cpp
M intern/cycles/util/util_texture.h
===================================================================
diff --git a/intern/cycles/device/device_memory.cpp b/intern/cycles/device/device_memory.cpp
index 9eee86b0814..299f2a2c347 100644
--- a/intern/cycles/device/device_memory.cpp
+++ b/intern/cycles/device/device_memory.cpp
@@ -168,6 +168,7 @@ device_texture::device_texture(Device *device,
case IMAGE_DATA_TYPE_BYTE:
case IMAGE_DATA_TYPE_NANOVDB_FLOAT:
case IMAGE_DATA_TYPE_NANOVDB_FLOAT3:
+ case IMAGE_DATA_TYPE_OIIO:
data_type = TYPE_UCHAR;
data_elements = 1;
break;
diff --git a/intern/cycles/kernel/kernel_oiio_globals.h b/intern/cycles/kernel/kernel_oiio_globals.h
index 4fbfd9651f1..62a347fea7a 100644
--- a/intern/cycles/kernel/kernel_oiio_globals.h
+++ b/intern/cycles/kernel/kernel_oiio_globals.h
@@ -32,8 +32,6 @@ struct OIIOTexture {
struct OIIOGlobals {
OIIO::TextureSystem *tex_sys;
- thread_mutex tex_paths_mutex;
- vector<OIIOTexture> textures;
float diffuse_blur;
float glossy_blur;
};
diff --git a/intern/cycles/kernel/kernels/cpu/kernel_cpu_image.h b/intern/cycles/kernel/kernels/cpu/kernel_cpu_image.h
index 59b96c86c50..c37198db93a 100644
--- a/intern/cycles/kernel/kernels/cpu/kernel_cpu_image.h
+++ b/intern/cycles/kernel/kernels/cpu/kernel_cpu_image.h
@@ -23,6 +23,14 @@
# include <nanovdb/util/SampleFromVoxels.h>
#endif
+#ifdef __OIIO__
+# include "kernel/kernel_oiio_globals.h"
+# define NEAREST_LOOKUP_PATHS \
+ (PATH_RAY_DIFFUSE | PATH_RAY_SHADOW | PATH_RAY_DIFFUSE_ANCESTOR | PATH_RAY_VOLUME_SCATTER | \
+ PATH_RAY_GLOSSY | PATH_RAY_EMISSION)
+# define DIFFUSE_BLUR_PATHS (PATH_RAY_DIFFUSE | PATH_RAY_DIFFUSE_ANCESTOR)
+#endif
+
CCL_NAMESPACE_BEGIN
/* Make template functions private so symbols don't conflict between kernels with different
@@ -584,32 +592,122 @@ template<typename T> struct NanoVDBInterpolator {
#undef SET_CUBIC_SPLINE_WEIGHTS
-ccl_device float4 kernel_tex_image_interp(KernelGlobals *kg, int id, float x, float y)
+ccl_device float4 kernel_tex_image_interp(KernelGlobals *kg, int id, float x, float y, differential ds, differential dt)
{
const TextureInfo &info = kernel_tex_fetch(__texture_info, id);
+ float4 r = make_float4(TEX_IMAGE_MISSING_R, TEX_IMAGE_MISSING_G, TEX_IMAGE_MISSING_B, TEX_IMAGE_MISSING_A);
switch (info.data_type) {
case IMAGE_DATA_TYPE_HALF:
- return TextureInterpolator<half>::interp(info, x, y);
+ r = TextureInterpolator<half>::interp(info, x, y);
+ break;
case IMAGE_DATA_TYPE_BYTE:
- return TextureInterpolator<uchar>::interp(info, x, y);
+ r = TextureInterpolator<uchar>::interp(info, x, y);
+ break;
case IMAGE_DATA_TYPE_USHORT:
- return TextureInterpolator<uint16_t>::interp(info, x, y);
+ r = TextureInterpolator<uint16_t>::interp(info, x, y);
+ break;
case IMAGE_DATA_TYPE_FLOAT:
- return TextureInterpolator<float>::interp(info, x, y);
+ r = TextureInterpolator<float>::interp(info, x, y);
+ break;
case IMAGE_DATA_TYPE_HALF4:
- return TextureInterpolator<half4>::interp(info, x, y);
+ r = TextureInterpolator<half4>::interp(info, x, y);
+ break;
case IMAGE_DATA_TYPE_BYTE4:
- return TextureInterpolator<uchar4>::interp(info, x, y);
+ r = TextureInterpolator<uchar4>::interp(info, x, y);
+ break;
case IMAGE_DATA_TYPE_USHORT4:
- return TextureInterpolator<ushort4>::interp(info, x, y);
+ r = TextureInterpolator<ushort4>::interp(info, x, y);
+ break;
case IMAGE_DATA_TYPE_FLOAT4:
- return TextureInterpolator<float4>::interp(info, x, y);
+ r = TextureInterpolator<float4>::interp(info, x, y);
+ break;
+ case IMAGE_DATA_TYPE_OIIO:
+ {
+#ifdef __OIIO__
+ kernel_assert(kg->oiio);
+ kernel_assert(kg->oiio->tex_sys);
+ kernel_assert(info.data);
+ if (!kg->oiio || !kg->oiio->tex_sys || !info.data) {
+ return r;
+ }
+ OIIO::TextureOpt options;
+ options.anisotropic = 8;
+ float missingcolor[4] = {
+ TEX_IMAGE_MISSING_R, TEX_IMAGE_MISSING_G, TEX_IMAGE_MISSING_B, TEX_IMAGE_MISSING_A};
+ options.missingcolor = missingcolor;
+ options.mipmode = OIIO::TextureOpt::MipModeAniso;
+ options.sblur = options.tblur = 0.0f;
+ switch (info.interpolation) {
+ case INTERPOLATION_SMART:
+ options.interpmode = OIIO::TextureOpt::InterpSmartBicubic;
+ break;
+ case INTERPOLATION_CUBIC:
+ options.interpmode = OIIO::TextureOpt::InterpBicubic;
+ break;
+ case INTERPOLATION_LINEAR:
+ options.interpmode = OIIO::TextureOpt::InterpBilinear;
+ break;
+ //case INTERPOLATION_NONE:
+ case INTERPOLATION_CLOSEST:
+ default:
+ options.interpmode = OIIO::TextureOpt::InterpClosest;
+ break;
+ }
+ switch (info.extension) {
+ case EXTENSION_CLIP:
+ options.swrap = options.twrap = OIIO::TextureOpt::WrapBlack;
+ break;
+ case EXTENSION_EXTEND:
+ options.swrap = options.twrap = OIIO::TextureOpt::WrapClamp;
+ break;
+ case EXTENSION_REPEAT:
+ default:
+ options.swrap = options.twrap = OIIO::TextureOpt::WrapPeriodic;
+ break;
+ }
+#if 0
+ if (path_flag & NEAREST_LOOKUP_PATHS && !(path_flag & PATH_RAY_SINGULAR)) {
+ options.interpmode = OIIO::TextureOpt::InterpClosest;
+ options.mipmode = OIIO::TextureOpt::MipModeOneLevel;
+ }
+ else {
+ options.interpmode = kg->oiio->textures[id].interpolation;
+ options.mipmode = OIIO::TextureOpt::MipModeAniso;
+ }
+ if (path_flag & DIFFUSE_BLUR_PATHS) {
+ options.sblur = options.tblur = kg->oiio->diffuse_blur;
+ }
+ else if (path_flag & PATH_RAY_GLOSSY) {
+ options.sblur = options.tblur = kg->oiio->glossy_blur;
+ }
+ else {
+ options.sblur = options.tblur = 0.0f;
+ }
+#endif
+ OIIO::TextureSystem::TextureHandle *handle = *((OIIO::TextureSystem::TextureHandle**)info.data);
+ kernel_assert(handle && kg->oiio->tex_sys->good(handle));
+ if(handle && !kg->oiio->tex_sys->good(handle)) {
+ return r;
+ }
+ kg->oiio->tex_sys->texture(handle,
+ (OIIO::TextureSystem::Perthread *)kg->oiio_tdata,
+ options,
+ x,
+ y,
+ ds.dx,
+ ds.dy,
+ dt.dx,
+ dt.dy,
+ 4,
+ (float *)&r);
+#endif
+ break;
+ }
default:
assert(0);
- return make_float4(
- TEX_IMAGE_MISSING_R, TEX_IMAGE_MISSING_G, TEX_IMAGE_MISSING_B, TEX_IMAGE_MISSING_A);
}
+ return info.compress_as_srgb ? color_srgb_to_linear_v4(r) : r;
}
ccl_device float4 kernel_tex_image_interp_3d(KernelGlobals *kg,
@@ -646,6 +744,8 @@ ccl_device float4 kernel_tex_image_interp_3d(KernelGlobals *kg,
case IMAGE_DATA_TYPE_NANOVDB_FLOAT3:
return NanoVDBInterpolator<nanovdb::Vec3f>::interp_3d(info, P.x, P.y, P.z, interp);
#endif
+ case IMAGE_DATA_TYPE_OIIO:
+ return make_float4(TEX_IMAGE_MISSING_R, TEX_IMAGE_MISSING_G, TEX_IMAGE_MISSING_B, TEX_IMAGE_MISSING_A);
default:
assert(0);
return make_float4(
diff --git a/intern/cycles/kernel/kernels/cuda/kernel_cuda_image.h b/intern/cycles/kernel/kernels/cuda/kernel_cuda_image.h
index 132653fa7ca..8acc2bedbcb 100644
--- a/intern/cycles/kernel/kernels/cuda/kernel_cuda_image.h
+++ b/intern/cycles/kernel/kernels/cuda/kernel_cuda_image.h
@@ -178,7 +178,7 @@ ccl_device_inline T kernel_tex_image_interp_nanovdb(
}
#endif
-ccl_device float4 kernel_tex_image_interp(KernelGlobals *kg, int id, float x, float y)
+ccl_device float4 kernel_tex_image_interp(KernelGlobals *kg, int id, float x, float y, differential, differential)
{
const TextureInfo &info = kernel_tex_fetch(__texture_info, id);
diff --git a/intern/cycles/kernel/kernels/opencl/kernel_opencl_image.h b/intern/cycles/kernel/kernels/opencl/kernel_opencl_image.h
index bb6b8a40e8e..5eaa14f52cd 100644
--- a/intern/cycles/kernel/kernels/opencl/kernel_opencl_image.h
+++ b/intern/cycles/kernel/kernels/opencl/kernel_opencl_image.h
@@ -123,6 +123,10 @@ ccl_device_inline float4 svm_image_texture_read(
return make_float4(r.x, r.y, r.z, r.w);
}
#endif
+ /* Unsupported. */
+ else if (texture_type == IMAGE_DATA_TYPE_OIIO) {
+ return make_float4(TEX_IMAGE_MISSING_R, TEX_IMAGE_MISSING_G, TEX_IMAGE_MISSING_B, TEX_IMAGE_MISSING_A);
+ }
/* Byte */
else {
uchar r = tex_fetch(uchar, info, data_offset);
@@ -199,7 +203,7 @@ ccl_device_inline float svm_image_texture_frac(float x, int *ix)
} \
(void)0
-ccl_device float4 kernel_tex_image_interp(KernelGlobals *kg, int id, float x, float y)
+ccl_device float4 kernel_tex_image_interp(KernelGlobals *kg, int id, float x, float y, differential, differential)
{
const ccl_global TextureInfo *info = kernel_tex_info(kg, id);
diff --git a/intern/cycles/kernel/osl/osl_services.cpp b/intern/cycles/kernel/osl/osl_services.cpp
index eb58a50504b..1b37f691e2b 100644
--- a/intern/cycles/kernel/osl/osl_services.cpp
+++ b/intern/cycles/kernel/osl/osl_services.cpp
@@ -1249,7 +1249,12 @@ bool OSLRenderServices::texture(ustring filename,
}
case OSLTextureHandle::SVM: {
/* Packed texture. */
- float4 rgba = kernel_tex_image_interp(kernel_globals, handle->svm_slot, s, 1.0f - t);
+ differential ds, dt;
+ ds.dx = dsdx;
+ ds.dy = dsdy;
+ dt.dx = dtdx;
+ dt.dy = dtdy;
+ float4 rgba = kernel_tex_image_interp(kernel_globals, handle->svm_slot, s, 1.0f - t, ds, dt);
result[0] = rgba[0];
if (nchannels > 1)
diff --git a/intern/cycles/kernel/svm/svm_image.h b/intern/cycles/kernel/svm/svm_image.h
index eb122f96c00..0bf42c0146a 100644
--- a/intern/cycles/kernel/svm/svm_image.h
+++ b/intern/cycles/kernel/svm/svm_image.h
@@ -15,6 +15,7 @@
*/
#ifdef __OIIO__
+# include <OpenImageIO/texture.h>
# include "kernel/kernel_oiio_globals.h"
# define NEAREST_LOOKUP_PATHS \
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list