[Bf-blender-cvs] [7b7e7ac] master: Code cleanup: simplify SVM stack assignment.
Brecht Van Lommel
noreply at git.blender.org
Thu May 5 21:44:29 CEST 2016
Commit: 7b7e7ac4c1a0ba0ca31a26bf3901ec184ae8930a
Author: Brecht Van Lommel
Date: Mon May 2 20:12:42 2016 +0200
Branches: master
https://developer.blender.org/rB7b7e7ac4c1a0ba0ca31a26bf3901ec184ae8930a
Code cleanup: simplify SVM stack assignment.
===================================================================
M intern/cycles/kernel/svm/svm.h
M intern/cycles/kernel/svm/svm_hsv.h
M intern/cycles/render/nodes.cpp
M intern/cycles/render/nodes.h
M intern/cycles/render/svm.cpp
M intern/cycles/render/svm.h
===================================================================
diff --git a/intern/cycles/kernel/svm/svm.h b/intern/cycles/kernel/svm/svm.h
index 9865da2..543e31b 100644
--- a/intern/cycles/kernel/svm/svm.h
+++ b/intern/cycles/kernel/svm/svm.h
@@ -295,7 +295,7 @@ ccl_device_noinline void svm_eval_nodes(KernelGlobals *kg, ShaderData *sd, ccl_a
break;
# endif /* NODES_FEATURE(NODE_FEATURE_BUMP) */
case NODE_HSV:
- svm_node_hsv(kg, sd, stack, node.y, node.z, node.w, &offset);
+ svm_node_hsv(kg, sd, stack, node, &offset);
break;
# endif /* __EXTRA_NODES__ */
#endif /* NODES_GROUP(NODE_GROUP_LEVEL_0) */
diff --git a/intern/cycles/kernel/svm/svm_hsv.h b/intern/cycles/kernel/svm/svm_hsv.h
index 1f2cad6..3a1840c 100644
--- a/intern/cycles/kernel/svm/svm_hsv.h
+++ b/intern/cycles/kernel/svm/svm_hsv.h
@@ -19,18 +19,20 @@
CCL_NAMESPACE_BEGIN
-ccl_device void svm_node_hsv(KernelGlobals *kg, ShaderData *sd, float *stack, uint in_color_offset, uint fac_offset, uint out_color_offset, int *offset)
+ccl_device void svm_node_hsv(KernelGlobals *kg, ShaderData *sd, float *stack, uint4 node, int *offset)
{
- /* read extra data */
- uint4 node1 = read_node(kg, offset);
+ uint in_color_offset, fac_offset, out_color_offset;
+ uint hue_offset, sat_offset, val_offset;
+ decode_node_uchar4(node.y, &in_color_offset, &fac_offset, &out_color_offset, NULL);
+ decode_node_uchar4(node.z, &hue_offset, &sat_offset, &val_offset, NULL);
float fac = stack_load_float(stack, fac_offset);
float3 in_color = stack_load_float3(stack, in_color_offset);
float3 color = in_color;
- float hue = stack_load_float(stack, node1.y);
- float sat = stack_load_float(stack, node1.z);
- float val = stack_load_float(stack, node1.w);
+ float hue = stack_load_float(stack, hue_offset);
+ float sat = stack_load_float(stack, sat_offset);
+ float val = stack_load_float(stack, val_offset);
color = rgb_to_hsv(color);
diff --git a/intern/cycles/render/nodes.cpp b/intern/cycles/render/nodes.cpp
index 8e8b99e..488673a 100644
--- a/intern/cycles/render/nodes.cpp
+++ b/intern/cycles/render/nodes.cpp
@@ -127,9 +127,6 @@ bool TextureMapping::skip()
void TextureMapping::compile(SVMCompiler& compiler, int offset_in, int offset_out)
{
- if(offset_in == SVM_STACK_INVALID || offset_out == SVM_STACK_INVALID)
- return;
-
compiler.add_node(NODE_MAPPING, offset_in, offset_out);
Transform tfm = compute_transform();
@@ -150,6 +147,29 @@ void TextureMapping::compile(SVMCompiler& compiler, int offset_in, int offset_ou
}
}
+/* Convenience function for texture nodes, allocating stack space to output
+ * a modified vector and returning its offset */
+int TextureMapping::compile_begin(SVMCompiler& compiler, ShaderInput *vector_in)
+{
+ if(!skip()) {
+ int offset_in = compiler.stack_assign(vector_in);
+ int offset_out = compiler.stack_find_offset(SHADER_SOCKET_VECTOR);
+
+ compile(compiler, offset_in, offset_out);
+
+ return offset_out;
+ }
+
+ return compiler.stack_assign(vector_in);
+}
+
+void TextureMapping::compile_end(SVMCompiler& compiler, ShaderInput *vector_in, int vector_offset)
+{
+ if(!skip()) {
+ compiler.stack_clear_offset(vector_in->type, vector_offset);
+ }
+}
+
void TextureMapping::compile(OSLCompiler &compiler)
{
if(!skip()) {
@@ -280,29 +300,17 @@ void ImageTextureNode::compile(SVMCompiler& compiler)
is_float = (int)is_float_bool;
}
- if(!color_out->links.empty())
- compiler.stack_assign(color_out);
- if(!alpha_out->links.empty())
- compiler.stack_assign(alpha_out);
-
if(slot != -1) {
- compiler.stack_assign(vector_in);
-
int srgb = (is_linear || color_space != "Color")? 0: 1;
- int vector_offset = vector_in->stack_offset;
-
- if(!tex_mapping.skip()) {
- vector_offset = compiler.stack_find_offset(SHADER_SOCKET_VECTOR);
- tex_mapping.compile(compiler, vector_in->stack_offset, vector_offset);
- }
+ int vector_offset = tex_mapping.compile_begin(compiler, vector_in);
if(projection != "Box") {
compiler.add_node(NODE_TEX_IMAGE,
slot,
compiler.encode_uchar4(
vector_offset,
- color_out->stack_offset,
- alpha_out->stack_offset,
+ compiler.stack_assign_if_linked(color_out),
+ compiler.stack_assign_if_linked(alpha_out),
srgb),
projection_enum[projection]);
}
@@ -311,25 +319,24 @@ void ImageTextureNode::compile(SVMCompiler& compiler)
slot,
compiler.encode_uchar4(
vector_offset,
- color_out->stack_offset,
- alpha_out->stack_offset,
+ compiler.stack_assign_if_linked(color_out),
+ compiler.stack_assign_if_linked(alpha_out),
srgb),
__float_as_int(projection_blend));
}
- if(vector_offset != vector_in->stack_offset)
- compiler.stack_clear_offset(vector_in->type, vector_offset);
+ tex_mapping.compile_end(compiler, vector_in, vector_offset);
}
else {
/* image not found */
if(!color_out->links.empty()) {
- compiler.add_node(NODE_VALUE_V, color_out->stack_offset);
+ compiler.add_node(NODE_VALUE_V, compiler.stack_assign(color_out));
compiler.add_node(NODE_VALUE_V, make_float3(TEX_IMAGE_MISSING_R,
TEX_IMAGE_MISSING_G,
TEX_IMAGE_MISSING_B));
}
if(!alpha_out->links.empty())
- compiler.add_node(NODE_VALUE_F, __float_as_int(TEX_IMAGE_MISSING_A), alpha_out->stack_offset);
+ compiler.add_node(NODE_VALUE_F, __float_as_int(TEX_IMAGE_MISSING_A), compiler.stack_assign(alpha_out));
}
}
@@ -486,44 +493,31 @@ void EnvironmentTextureNode::compile(SVMCompiler& compiler)
is_float = (int)is_float_bool;
}
- if(!color_out->links.empty())
- compiler.stack_assign(color_out);
- if(!alpha_out->links.empty())
- compiler.stack_assign(alpha_out);
-
if(slot != -1) {
- compiler.stack_assign(vector_in);
-
int srgb = (is_linear || color_space != "Color")? 0: 1;
- int vector_offset = vector_in->stack_offset;
-
- if(!tex_mapping.skip()) {
- vector_offset = compiler.stack_find_offset(SHADER_SOCKET_VECTOR);
- tex_mapping.compile(compiler, vector_in->stack_offset, vector_offset);
- }
+ int vector_offset = tex_mapping.compile_begin(compiler, vector_in);
compiler.add_node(NODE_TEX_ENVIRONMENT,
slot,
compiler.encode_uchar4(
vector_offset,
- color_out->stack_offset,
- alpha_out->stack_offset,
+ compiler.stack_assign_if_linked(color_out),
+ compiler.stack_assign_if_linked(alpha_out),
srgb),
projection_enum[projection]);
- if(vector_offset != vector_in->stack_offset)
- compiler.stack_clear_offset(vector_in->type, vector_offset);
+ tex_mapping.compile_end(compiler, vector_in, vector_offset);
}
else {
/* image not found */
if(!color_out->links.empty()) {
- compiler.add_node(NODE_VALUE_V, color_out->stack_offset);
+ compiler.add_node(NODE_VALUE_V, compiler.stack_assign(color_out));
compiler.add_node(NODE_VALUE_V, make_float3(TEX_IMAGE_MISSING_R,
TEX_IMAGE_MISSING_G,
TEX_IMAGE_MISSING_B));
}
if(!alpha_out->links.empty())
- compiler.add_node(NODE_VALUE_F, __float_as_int(TEX_IMAGE_MISSING_A), alpha_out->stack_offset);
+ compiler.add_node(NODE_VALUE_F, __float_as_int(TEX_IMAGE_MISSING_A), compiler.stack_assign(alpha_out));
}
}
@@ -736,19 +730,11 @@ void SkyTextureNode::compile(SVMCompiler& compiler)
else
assert(false);
- if(vector_in->link)
- compiler.stack_assign(vector_in);
-
- int vector_offset = vector_in->stack_offset;
+ int vector_offset = tex_mapping.compile_begin(compiler, vector_in);
int sky_model = type_enum[type];
- if(!tex_mapping.skip()) {
- vector_offset = compiler.stack_find_offset(SHADER_SOCKET_VECTOR);
- tex_mapping.compile(compiler, vector_in->stack_offset, vector_offset);
- }
-
compiler.stack_assign(color_out);
- compiler.add_node(NODE_TEX_SKY, vector_offset, color_out->stack_offset, sky_model);
+ compiler.add_node(NODE_TEX_SKY, vector_offset, compiler.stack_assign(color_out), sky_model);
compiler.add_node(__float_as_uint(sunsky.phi), __float_as_uint(sunsky.theta), __float_as_uint(sunsky.radiance_x), __float_as_uint(sunsky.radiance_y));
compiler.add_node(__float_as_uint(sunsky.radiance_z), __float_as_uint(sunsky.config_x[0]), __float_as_uint(sunsky.config_x[1]), __float_as_uint(sunsky.config_x[2]));
compiler.add_node(__float_as_uint(sunsky.config_x[3]), __float_as_uint(sunsky.config_x[4]), __float_as_uint(sunsky.config_x[5]), __float_as_uint(sunsky.config_x[6]));
@@ -758,8 +744,7 @@ void SkyTextureNode::compile(SVMCompiler& compiler)
compiler.add_node(__float_as_uint(sunsky.config_z[1]), __float_as_uint(sunsky.config_z[2]), __float_as_uint(sunsky.config_z[3]), __float_as_uint(sunsky.config_z[4]));
compiler.add_node(__float_as_uint(sunsky.config_z[5]), __float_as_uint(sunsky.config_z[6]), __float_as_uint(sunsky.config_z[7]), __float_as_uint(sunsky.config_z[8]));
- if(vector_offset != vector_in->stack_offset)
- compiler.stack_clear_offset(vector_in->type, vector_offset);
+ tex_mapping.compile_end(compiler, vector_in, vector_offset);
}
void SkyTextureNode::compile(OSLCompiler& compiler)
@@ -820,25 +805,16 @@ void GradientTextureNode::compile(SVMCompiler& compiler)
ShaderOutput *color_out = output("Color");
ShaderOutput *fac_out = output("Fac");
- if(vector_in->link) compiler.stack_assign(vector_in);
-
- int vector_offset = vector_in->stack_offset;
-
- if(!tex_mapping.skip()) {
- vector_offset = compiler.stack_find_offset(SHADER_SOCKET_VECTOR);
- tex_mapping.compile(compiler, vector_in->stack_offset, vector_offset);
- }
-
- if(!fac_out->links.empty())
- compiler.stack_assign(fac_out);
- if(!color_out->links.empty())
- compiler.stack_assign(color_out);
+ int vector_offset = tex_mapping.compile_begin(compiler, vector_in);
compiler.add_node(NODE_TEX_GRADIENT,
- compiler.encode_uchar4(type_enum[type], vector_offset, fac_out->stack_offset, color_out->stack_offset));
+ compiler.encode_uchar4(
+ type_enum[type],
+ vector_offset,
+ compiler.stack_assign_if_linked(fac_out),
+ compiler.stack_assign_if_linked(color_out)));
- if(vector_offset != vector_in->stack_offset)
- compiler.stack_clear_offset(vector_in->type, vector_offset);
+ tex_mapping.compile_end(compil
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list