[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