Blender V4.5
mix.h
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2011-2022 Blender Foundation
2 *
3 * SPDX-License-Identifier: Apache-2.0 */
4
5#pragma once
6
8#include "kernel/svm/util.h"
9
11
12/* Node */
13
15 ccl_private ShaderData *sd,
16 ccl_private float *stack,
17 const uint fac_offset,
18 const uint c1_offset,
19 const uint c2_offset,
20 int offset)
21{
22 /* read extra data */
23 const uint4 node1 = read_node(kg, &offset);
24
25 const float fac = stack_load_float(stack, fac_offset);
26 const float3 c1 = stack_load_float3(stack, c1_offset);
27 const float3 c2 = stack_load_float3(stack, c2_offset);
28 const float3 result = svm_mix_clamped_factor((NodeMix)node1.y, fac, c1, c2);
29
30 stack_store_float3(stack, node1.z, result);
31 return offset;
32}
33
35 ccl_private float *stack,
36 const uint options,
37 const uint input_offset,
38 const uint result_offset)
39{
40 uint use_clamp;
41 uint blend_type;
42 uint use_clamp_result;
43 uint fac_in_stack_offset;
44 uint a_in_stack_offset;
45 uint b_in_stack_offset;
46 svm_unpack_node_uchar3(options, &use_clamp, &blend_type, &use_clamp_result);
48 input_offset, &fac_in_stack_offset, &a_in_stack_offset, &b_in_stack_offset);
49
50 float t = stack_load_float(stack, fac_in_stack_offset);
51 if (use_clamp > 0) {
52 t = saturatef(t);
53 }
54 const float3 a = stack_load_float3(stack, a_in_stack_offset);
55 const float3 b = stack_load_float3(stack, b_in_stack_offset);
56 float3 result = svm_mix((NodeMix)blend_type, t, a, b);
57 if (use_clamp_result) {
59 }
60 stack_store_float3(stack, result_offset, result);
61}
62
64 ccl_private float *stack,
65 const uint use_clamp,
66 const uint input_offset,
67 const uint result_offset)
68{
69 uint fac_in_stack_offset;
70 uint a_in_stack_offset;
71 uint b_in_stack_offset;
73 input_offset, &fac_in_stack_offset, &a_in_stack_offset, &b_in_stack_offset);
74
75 float t = stack_load_float(stack, fac_in_stack_offset);
76 if (use_clamp > 0) {
77 t = saturatef(t);
78 }
79 const float a = stack_load_float(stack, a_in_stack_offset);
80 const float b = stack_load_float(stack, b_in_stack_offset);
81 const float result = a * (1 - t) + b * t;
82
83 stack_store_float(stack, result_offset, result);
84}
85
87 ccl_private float *stack,
88 const uint input_offset,
89 const uint result_offset)
90{
91 uint use_clamp;
92 uint fac_in_stack_offset;
93 uint a_in_stack_offset;
94 uint b_in_stack_offset;
96 input_offset, &use_clamp, &fac_in_stack_offset, &a_in_stack_offset, &b_in_stack_offset);
97
98 float t = stack_load_float(stack, fac_in_stack_offset);
99 if (use_clamp > 0) {
100 t = saturatef(t);
101 }
102 const float3 a = stack_load_float3(stack, a_in_stack_offset);
103 const float3 b = stack_load_float3(stack, b_in_stack_offset);
104 const float3 result = a * (one_float3() - t) + b * t;
105 stack_store_float3(stack, result_offset, result);
106}
107
109 ccl_private float *stack,
110 const uint input_offset,
111 const uint result_offset)
112{
113 uint use_clamp;
114 uint fac_in_stack_offset;
115 uint a_in_stack_offset;
116 uint b_in_stack_offset;
118 input_offset, &use_clamp, &fac_in_stack_offset, &a_in_stack_offset, &b_in_stack_offset);
119
120 float3 t = stack_load_float3(stack, fac_in_stack_offset);
121 if (use_clamp > 0) {
122 t = saturate(t);
123 }
124 const float3 a = stack_load_float3(stack, a_in_stack_offset);
125 const float3 b = stack_load_float3(stack, b_in_stack_offset);
126 const float3 result = a * (one_float3() - t) + b * t;
127 stack_store_float3(stack, result_offset, result);
128}
129
unsigned int uint
ccl_device_noinline_cpu float3 svm_mix(NodeMix type, const float t, const float3 c1, const float3 c2)
Definition color_util.h:309
ccl_device_noinline_cpu float3 svm_mix_clamped_factor(NodeMix type, const float t, const float3 c1, const float3 c2)
Definition color_util.h:360
ccl_device_inline float stack_load_float(const ccl_private float *stack, const uint a)
ccl_device_inline void stack_store_float(ccl_private float *stack, const uint a, const float f)
ccl_device_inline uint4 read_node(KernelGlobals kg, ccl_private int *const offset)
ccl_device_inline void stack_store_float3(ccl_private float *stack, const uint a, const float3 f)
ccl_device_forceinline void svm_unpack_node_uchar3(const uint i, ccl_private uint *x, ccl_private uint *y, ccl_private uint *z)
ccl_device_forceinline void svm_unpack_node_uchar4(const uint i, ccl_private uint *x, ccl_private uint *y, ccl_private uint *z, ccl_private uint *w)
CCL_NAMESPACE_BEGIN ccl_device_inline float3 stack_load_float3(const ccl_private float *stack, const uint a)
CCL_NAMESPACE_BEGIN struct Options options
#define ccl_private
const ThreadKernelGlobalsCPU * KernelGlobals
#define ccl_device_noinline
#define CCL_NAMESPACE_END
#define saturatef(x)
ccl_device_inline float3 one_float3()
Definition math_float3.h:24
ccl_device_noinline void svm_node_mix_vector(ccl_private ShaderData *sd, ccl_private float *stack, const uint input_offset, const uint result_offset)
Definition mix.h:86
ccl_device_noinline void svm_node_mix_float(ccl_private ShaderData *sd, ccl_private float *stack, const uint use_clamp, const uint input_offset, const uint result_offset)
Definition mix.h:63
ccl_device_noinline void svm_node_mix_vector_non_uniform(ccl_private ShaderData *sd, ccl_private float *stack, const uint input_offset, const uint result_offset)
Definition mix.h:108
CCL_NAMESPACE_BEGIN ccl_device_noinline int svm_node_mix(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, const uint fac_offset, const uint c1_offset, const uint c2_offset, int offset)
Definition mix.h:14
ccl_device_noinline void svm_node_mix_color(ccl_private ShaderData *sd, ccl_private float *stack, const uint options, const uint input_offset, const uint result_offset)
Definition mix.h:34
#define saturate(a)
Definition smaa.cc:315
uint y
Definition types_uint4.h:13
uint z
Definition types_uint4.h:13