[Bf-blender-cvs] [bc99c2bcebe] cycles_texture_cache: Merge branch 'master' into cycles_texture_cache

Stefan Werner noreply at git.blender.org
Fri Nov 8 14:32:27 CET 2019


Commit: bc99c2bcebef09c30b2afdb4ab8433ee4baaa791
Author: Stefan Werner
Date:   Fri Nov 8 13:00:17 2019 +0100
Branches: cycles_texture_cache
https://developer.blender.org/rBbc99c2bcebef09c30b2afdb4ab8433ee4baaa791

Merge branch 'master' into cycles_texture_cache

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



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

diff --cc intern/cycles/device/device_cpu.cpp
index 39279259d92,c2843a61e6d..7386f3a9fb4
--- a/intern/cycles/device/device_cpu.cpp
+++ b/intern/cycles/device/device_cpu.cpp
@@@ -167,9 -171,8 +172,9 @@@ class CPUDevice : public Device 
    bool need_texture_info;
  
  #ifdef WITH_OSL
-   OSLGlobals *osl_globals;
+   OSLGlobals osl_globals;
  #endif
 +  OIIOGlobals oiio_globals;
  
    bool use_split_kernel;
  
@@@ -285,13 -288,8 +290,11 @@@
      }
  
  #ifdef WITH_OSL
-     /* Must use aligned malloc due to concurrent hash map. */
-     osl_globals = util_aligned_new<OSLGlobals>();
-     kernel_globals.osl = osl_globals;
+     kernel_globals.osl = &osl_globals;
  #endif
 +    oiio_globals.tex_sys = NULL;
 +    kernel_globals.oiio = &oiio_globals;
 +
      use_split_kernel = DebugFlags().cpu.split_kernel;
      if (use_split_kernel) {
        VLOG(1) << "Will be using split kernel.";
@@@ -325,17 -323,8 +328,14 @@@
  
    ~CPUDevice()
    {
- #ifdef WITH_OSL
-     util_aligned_delete(osl_globals);
- #endif
      task_pool.stop();
      texture_info.free();
 +    if (oiio_globals.tex_sys) {
 +      VLOG(1) << oiio_globals.tex_sys->getstats();
 +      oiio_globals.tex_sys->reset_stats();
 +      TextureSystem::destroy(oiio_globals.tex_sys);
 +    }
 +    kernel_globals.oiio = NULL;
    }
  
    virtual bool show_samples() const
@@@ -1082,12 -1057,8 +1073,12 @@@
      kg.decoupled_volume_steps_index = 0;
      kg.coverage_asset = kg.coverage_object = kg.coverage_material = NULL;
  #ifdef WITH_OSL
-     OSLShader::thread_init(&kg, &kernel_globals, osl_globals);
+     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 --cc intern/cycles/kernel/osl/osl_services.cpp
index 5e8389bcf66,1b161fbc8ee..975e65a963d
--- a/intern/cycles/kernel/osl/osl_services.cpp
+++ b/intern/cycles/kernel/osl/osl_services.cpp
@@@ -54,13 -54,8 +54,9 @@@
  
  #include "kernel/kernel_projection.h"
  #include "kernel/kernel_accumulate.h"
 +#include "kernel/kernel_light.h"
  #include "kernel/kernel_shader.h"
  
- #ifdef WITH_PTEX
- #  include <Ptexture.h>
- #endif
- 
  CCL_NAMESPACE_BEGIN
  
  /* RenderServices implementation */
diff --cc intern/cycles/kernel/shaders/node_image_texture.osl
index 9d0fe43f707,f78ca7ec0e8..eab2928262d
--- a/intern/cycles/kernel/shaders/node_image_texture.osl
+++ b/intern/cycles/kernel/shaders/node_image_texture.osl
@@@ -66,16 -67,19 +67,19 @@@ color image_texture_lookup(string filen
                             string extension)
  {
    color rgb = (color)texture(
 -      filename, u, 1.0 - v, "wrap", extension, "interp", interpolation, "alpha", Alpha);
 +      filename, u, v, "wrap", extension, "interp", interpolation, "alpha", Alpha);
  
-   if (use_alpha) {
+   if (ignore_alpha) {
+     Alpha = 1.0;
+   }
+   else if (unassociate_alpha) {
      rgb = color_unpremultiply(rgb, Alpha);
  
      if (!is_float)
        rgb = min(rgb, 1.0);
    }
  
-   if (color_space == "sRGB" && !endswith(filename, ".tx")) {
 -  if (compress_as_srgb) {
++  if (compress_as_srgb && !endswith(filename, ".tx")) {
      rgb = color_srgb_to_scene_linear(rgb);
    }
  
diff --cc intern/cycles/kernel/svm/svm.h
index a3b73f7d0bf,4fc5e633e3b..aeff69e1148
--- a/intern/cycles/kernel/svm/svm.h
+++ b/intern/cycles/kernel/svm/svm.h
@@@ -295,13 -312,13 +312,13 @@@ ccl_device_noinline void svm_eval_nodes
  #  endif /* NODES_FEATURE(NODE_FEATURE_BUMP) */
  #  ifdef __TEXTURES__
        case NODE_TEX_IMAGE:
 -        svm_node_tex_image(kg, sd, stack, node);
 +        svm_node_tex_image(kg, sd, path_flag, stack, node);
          break;
        case NODE_TEX_IMAGE_BOX:
--        svm_node_tex_image_box(kg, sd, stack, node);
++        svm_node_tex_image_box(kg, sd, path_flag, stack, node);
          break;
        case NODE_TEX_NOISE:
-         svm_node_tex_noise(kg, sd, stack, node, &offset);
+         svm_node_tex_noise(kg, sd, stack, node.y, node.z, node.w, &offset);
          break;
  #  endif /* __TEXTURES__ */
  #  ifdef __EXTRA_NODES__
diff --cc intern/cycles/kernel/svm/svm_image.h
index cc48029f812,64abdd2d8b3..06e511a5bcf
--- a/intern/cycles/kernel/svm/svm_image.h
+++ b/intern/cycles/kernel/svm/svm_image.h
@@@ -14,80 -14,16 +14,82 @@@
   * limitations under the License.
   */
  
 +#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
  
+ #ifdef __TEXTURES__
 -
 -ccl_device float4 svm_image_texture(KernelGlobals *kg, int id, float x, float y, uint flags)
 +ccl_device float4 svm_image_texture(KernelGlobals *kg,
 +                                    int id,
 +                                    float x,
 +                                    float y,
 +                                    differential ds,
 +                                    differential dt,
-                                     uint srgb,
-                                     uint use_alpha,
++                                    uint flags,
 +                                    int path_flag)
  {
 -  float4 r = kernel_tex_image_interp(kg, id, x, y);
 +  float4 r;
 +#ifdef __OIIO__
 +  if (kg->oiio && kg->oiio->textures.size() > id && kg->oiio->textures[id].handle) {
 +    OIIO::TextureOpt options;
 +    options.swrap = options.twrap = kg->oiio->textures[id].extension;
 +    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;
 +
 +    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;
 +    }
 +
 +    bool success = kg->oiio->tex_sys->texture(kg->oiio->textures[id].handle,
 +                                              (OIIO::TextureSystem::Perthread *)kg->oiio_tdata,
 +                                              options,
 +                                              x,
 +                                              y,
 +                                              ds.dx,
 +                                              ds.dy,
 +                                              dt.dx,
 +                                              dt.dy,
 +                                              4,
 +                                              (float *)&r);
 +    if (!success) {
 +      (void)kg->oiio->tex_sys->geterror();
 +    }
 +    else {
 +      /* Mip maps are always linear. */
-       srgb = !kg->oiio->textures[id].is_linear;
++      if (kg->oiio->textures[id].is_linear) {
++        flags &= ~NODE_IMAGE_COMPRESS_AS_SRGB;
++      }
 +    }
 +  }
 +  else
 +#endif
 +    r = kernel_tex_image_interp(kg, id, x, y);
    const float alpha = r.w;
  
-   if (use_alpha && alpha != 1.0f && alpha != 0.0f) {
+   if ((flags & NODE_IMAGE_ALPHA_UNASSOCIATE) && alpha != 1.0f && alpha != 0.0f) {
      r /= alpha;
      const int texture_type = kernel_tex_type(id);
      if (texture_type == IMAGE_DATA_TYPE_BYTE4 || texture_type == IMAGE_DATA_TYPE_BYTE) {
@@@ -110,20 -45,16 +111,20 @@@ ccl_device_inline float3 texco_remap_sq
    return (co - make_float3(0.5f, 0.5f, 0.5f)) * 2.0f;
  }
  
 -ccl_device void svm_node_tex_image(KernelGlobals *kg, ShaderData *sd, float *stack, uint4 node)
 +ccl_device void svm_node_tex_image(
 +    KernelGlobals *kg, ShaderData *sd, int path_flag, float *stack, uint4 node)
  {
    uint id = node.y;
-   uint co_offset, out_offset, alpha_offset, srgb;
-   uint projection, dx_offset, dy_offset;
 +
-   decode_node_uchar4(node.z, &co_offset, &out_offset, &alpha_offset, &srgb);
-   decode_node_uchar4(node.w, &projection, &dx_offset, &dy_offset, NULL);
+   uint co_offset, out_offset, alpha_offset, flags;
++  uint projection, dx_offset, dy_offset, unused;
+ 
+   svm_unpack_node_uchar4(node.z, &co_offset, &out_offset, &alpha_offset, &flags);
++  svm_unpack_node_uchar4(node.w, &projection, &dx_offset, &dy_offset, &unused);
  
    float3 co = stack_load_float3(stack, co_offset);
    float2 tex_co;
-   uint use_alpha = stack_valid(alpha_offset);
 -  if (node.w == NODE_IMAGE_PROJ_SPHERE) {
 +  if (projection == NODE_IMAGE_PROJ_SPHERE) {
      co = texco_remap_square(co);
      tex_co = map_to_sphere(co);
    }
@@@ -134,41 -65,7 +135,41 @@@
    else {
      tex_co = make_float2(co.x, co.y);
    }
 -  float4 f = svm_image_texture(kg, id, tex_co.x, tex_co.y, flags);
 +
 +  differential ds, dt;
 +#ifdef __KERNEL_CPU__
 +  if (stack_valid(dx_offset) && stack_valid(dy_offset)) {
 +    float3 dx = stack_load_float3(stack, dx_offset);
 +    float3 dy = stack_load_float3(stack, dy_offset);
 +    float2 tex_co_dx, tex_co_dy;
 +    if (projection == NODE_IMAGE_PROJ_SPHERE) {
 +      dx = texco_remap_square(dx);
 +      tex_co_dx = map_to_sphere(dx);
 +      dy = texco_remap_square(dy);
 +      tex_co_dy = map_to_sphere(dy);
 +    }
 +    else if (projection == NODE_IMAGE_PROJ_TUBE) {
 +      dx = texco_remap_square(dx);
 +      tex_co_dx = map_to_tube(dx);
 +      dy = texco_remap_square(dy);
 +      tex_co_dy = map_to_tube(dy);
 +    }
 +    else {
 +      tex_co_dx = make_float2(dx.x, dx.y);
 +      tex_co_dy = make_float2(dy.x, dy.y);
 +    }
 +    ds.dx = tex_co_dx.x - tex_co.x;
 +    ds.dy = tex_co_dy.x - tex_co.x;
 +    dt.dx = tex_co_dx.y - tex_co.y;
 +    dt.dy = tex_co_dy.y - tex_co.y;
 +  }
 +  else
 +#endif
 +  {
 +    ds = differential_zero(

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list