[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