63 int num_corners = data.y & 0xffff;
65 if (num_corners == 4) {
68 corners[1] = data.z + 1;
69 corners[2] = data.z + 2;
70 corners[3] = data.z + 3;
76 corners[0] = data.z + c;
77 corners[1] = data.z +
mod(c + 1, num_corners);
79 corners[3] = data.z +
mod(c - 1, num_corners);
98 float2 dpdu = uv[1] - uv[0];
99 float2 dpdv = uv[2] - uv[0];
102 float2 p = dpdu * sd->u + dpdv * sd->v + uv[0];
107# ifdef __RAY_DIFFERENTIALS__
115 float dudx = sd->du.dx;
116 float dvdx = sd->dv.dx;
118 float dsdx = dsdu * dudx + dsdv * dvdx;
119 float dtdx = dtdu * dudx + dtdv * dvdx;
121 *dx = dads * dsdx + dadt * dtdx;
124 float dudy = sd->du.dy;
125 float dvdy = sd->dv.dy;
127 float dsdy = dsdu * dudy + dsdv * dvdy;
128 float dtdy = dtdu * dudy + dtdv * dvdy;
130 *dy = dads * dsdy + dadt * dtdy;
160 f1 = (f1 + f0) * 0.5f;
161 f3 = (f3 + f0) * 0.5f;
164 float a =
mix(
mix(f0, f1, uv[0].x),
mix(f3, f2, uv[0].x), uv[0].y);
165 float b =
mix(
mix(f0, f1, uv[1].x),
mix(f3, f2, uv[1].x), uv[1].y);
166 float c =
mix(
mix(f0, f1, uv[2].x),
mix(f3, f2, uv[2].x), uv[2].y);
168#ifdef __RAY_DIFFERENTIALS__
170 *dx = sd->du.dx *
b + sd->dv.dx * c - (sd->du.dx + sd->dv.dx) * a;
172 *dy = sd->du.dy *
b + sd->dv.dy * c - (sd->du.dy + sd->dv.dy) * a;
175 return sd->u *
b + sd->v * c + (1.0f - sd->u - sd->v) * a;
190 f1 = (f1 + f0) * 0.5f;
191 f3 = (f3 + f0) * 0.5f;
194 float a =
mix(
mix(f0, f1, uv[0].x),
mix(f3, f2, uv[0].x), uv[0].y);
195 float b =
mix(
mix(f0, f1, uv[1].x),
mix(f3, f2, uv[1].x), uv[1].y);
196 float c =
mix(
mix(f0, f1, uv[2].x),
mix(f3, f2, uv[2].x), uv[2].y);
198#ifdef __RAY_DIFFERENTIALS__
200 *dx = sd->du.dx *
b + sd->dv.dx * c - (sd->du.dx + sd->dv.dx) * a;
202 *dy = sd->du.dy *
b + sd->dv.dy * c - (sd->du.dy + sd->dv.dy) * a;
205 return sd->u *
b + sd->v * c + (1.0f - sd->u - sd->v) * a;
238 float2 dpdu = uv[1] - uv[0];
239 float2 dpdv = uv[2] - uv[0];
242 float2 p = dpdu * sd->u + dpdv * sd->v + uv[0];
248# ifdef __RAY_DIFFERENTIALS__
256 float dudx = sd->du.dx;
257 float dvdx = sd->dv.dx;
259 float dsdx = dsdu * dudx + dsdv * dvdx;
260 float dtdx = dtdu * dudx + dtdv * dvdx;
262 *dx = dads * dsdx + dadt * dtdx;
265 float dudy = sd->du.dy;
266 float dvdy = sd->dv.dy;
268 float dsdy = dsdu * dudy + dsdv * dvdy;
269 float dtdy = dtdu * dudy + dtdv * dvdy;
271 *dy = dads * dsdy + dadt * dtdy;
301 f1 = (f1 + f0) * 0.5f;
302 f3 = (f3 + f0) * 0.5f;
309#ifdef __RAY_DIFFERENTIALS__
311 *dx = sd->du.dx *
b + sd->dv.dx * c - (sd->du.dx + sd->dv.dx) * a;
313 *dy = sd->du.dy *
b + sd->dv.dy * c - (sd->du.dy + sd->dv.dy) * a;
316 return sd->u *
b + sd->v * c + (1.0f - sd->u - sd->v) * a;
333 f1 = (f1 + f0) * 0.5f;
334 f3 = (f3 + f0) * 0.5f;
341#ifdef __RAY_DIFFERENTIALS__
343 *dx = sd->du.dx *
b + sd->dv.dx * c - (sd->du.dx + sd->dv.dx) * a;
345 *dy = sd->du.dy *
b + sd->dv.dy * c - (sd->du.dy + sd->dv.dy) * a;
348 return sd->u *
b + sd->v * c + (1.0f - sd->u - sd->v) * a;
381 float2 dpdu = uv[1] - uv[0];
382 float2 dpdv = uv[2] - uv[0];
385 float2 p = dpdu * sd->u + dpdv * sd->v + uv[0];
390# ifdef __RAY_DIFFERENTIALS__
398 float dudx = sd->du.dx;
399 float dvdx = sd->dv.dx;
401 float dsdx = dsdu * dudx + dsdv * dvdx;
402 float dtdx = dtdu * dudx + dtdv * dvdx;
404 *dx = dads * dsdx + dadt * dtdx;
407 float dudy = sd->du.dy;
408 float dvdy = sd->dv.dy;
410 float dsdy = dsdu * dudy + dsdv * dvdy;
411 float dtdy = dtdu * dudy + dtdv * dvdy;
413 *dy = dads * dsdy + dadt * dtdy;
443 f1 = (f1 + f0) * 0.5f;
444 f3 = (f3 + f0) * 0.5f;
451#ifdef __RAY_DIFFERENTIALS__
453 *dx = sd->du.dx *
b + sd->dv.dx * c - (sd->du.dx + sd->dv.dx) * a;
455 *dy = sd->du.dy *
b + sd->dv.dy * c - (sd->du.dy + sd->dv.dy) * a;
458 return sd->u *
b + sd->v * c + (1.0f - sd->u - sd->v) * a;
475 f1 = (f1 + f0) * 0.5f;
476 f3 = (f3 + f0) * 0.5f;
483#ifdef __RAY_DIFFERENTIALS__
485 *dx = sd->du.dx *
b + sd->dv.dx * c - (sd->du.dx + sd->dv.dx) * a;
487 *dy = sd->du.dy *
b + sd->dv.dy * c - (sd->du.dy + sd->dv.dy) * a;
490 return sd->u *
b + sd->v * c + (1.0f - sd->u - sd->v) * a;
523 float2 dpdu = uv[1] - uv[0];
524 float2 dpdv = uv[2] - uv[0];
527 float2 p = dpdu * sd->u + dpdv * sd->v + uv[0];
529 float4 a, dads, dadt;
537# ifdef __RAY_DIFFERENTIALS__
545 float dudx = sd->du.dx;
546 float dvdx = sd->dv.dx;
548 float dsdx = dsdu * dudx + dsdv * dvdx;
549 float dtdx = dtdu * dudx + dtdv * dvdx;
551 *dx = dads * dsdx + dadt * dtdx;
554 float dudy = sd->du.dy;
555 float dvdy = sd->dv.dy;
557 float dsdy = dsdu * dudy + dsdv * dvdy;
558 float dtdy = dtdu * dudy + dtdv * dvdy;
560 *dy = dads * dsdy + dadt * dtdy;
590 f1 = (f1 + f0) * 0.5f;
591 f3 = (f3 + f0) * 0.5f;
594 float4 a =
mix(
mix(f0, f1, uv[0].x),
mix(f3, f2, uv[0].x), uv[0].y);
595 float4
b =
mix(
mix(f0, f1, uv[1].x),
mix(f3, f2, uv[1].x), uv[1].y);
596 float4 c =
mix(
mix(f0, f1, uv[2].x),
mix(f3, f2, uv[2].x), uv[2].y);
598#ifdef __RAY_DIFFERENTIALS__
600 *dx = sd->du.dx *
b + sd->dv.dx * c - (sd->du.dx + sd->dv.dx) * a;
602 *dy = sd->du.dy *
b + sd->dv.dy * c - (sd->du.dy + sd->dv.dy) * a;
605 return sd->u *
b + sd->v * c + (1.0f - sd->u - sd->v) * a;
614 float4 f0, f1, f2, f3;
634 f1 = (f1 + f0) * 0.5f;
635 f3 = (f3 + f0) * 0.5f;
638 float4 a =
mix(
mix(f0, f1, uv[0].x),
mix(f3, f2, uv[0].x), uv[0].y);
639 float4
b =
mix(
mix(f0, f1, uv[1].x),
mix(f3, f2, uv[1].x), uv[1].y);
640 float4 c =
mix(
mix(f0, f1, uv[2].x),
mix(f3, f2, uv[2].x), uv[2].y);
642#ifdef __RAY_DIFFERENTIALS__
644 *dx = sd->du.dx *
b + sd->dv.dx * c - (sd->du.dx + sd->dv.dx) * a;
646 *dy = sd->du.dy *
b + sd->dv.dy * c - (sd->du.dy + sd->dv.dy) * a;
649 return sd->u *
b + sd->v * c + (1.0f - sd->u - sd->v) * a;
ATTR_WARN_UNUSED_RESULT const BMVert * v
local_group_size(16, 16) .push_constant(Type b
const KernelGlobalsCPU *ccl_restrict KernelGlobals
#define kernel_data_fetch(name, index)
#define ccl_device_inline
#define ccl_device_noinline
#define CCL_NAMESPACE_END
CCL_NAMESPACE_BEGIN ccl_device_inline uint subd_triangle_patch(KernelGlobals kg, int prim)
ccl_device float patch_eval_float(KernelGlobals kg, ccl_private const ShaderData *sd, int offset, int patch, float u, float v, int channel, ccl_private float *du, ccl_private float *dv)
ccl_device float2 patch_eval_float2(KernelGlobals kg, ccl_private const ShaderData *sd, int offset, int patch, float u, float v, int channel, ccl_private float2 *du, ccl_private float2 *dv)
ccl_device float3 patch_eval_float3(KernelGlobals kg, ccl_private const ShaderData *sd, int offset, int patch, float u, float v, int channel, ccl_private float3 *du, ccl_private float3 *dv)
ccl_device float4 patch_eval_float4(KernelGlobals kg, ccl_private const ShaderData *sd, int offset, int patch, float u, float v, int channel, ccl_private float4 *du, ccl_private float4 *dv)
ccl_device float4 patch_eval_uchar4(KernelGlobals kg, ccl_private const ShaderData *sd, int offset, int patch, float u, float v, int channel, ccl_private float4 *du, ccl_private float4 *dv)
@ ATTR_ELEMENT_CORNER_BYTE
@ ATTR_ELEMENT_VERTEX_MOTION
CCL_NAMESPACE_BEGIN ccl_device_inline float4 zero_float4()
ccl_device_noinline float3 subd_triangle_attribute_float3(KernelGlobals kg, ccl_private const ShaderData *sd, const AttributeDescriptor desc, ccl_private float3 *dx, ccl_private float3 *dy)
ccl_device_noinline float4 subd_triangle_attribute_float4(KernelGlobals kg, ccl_private const ShaderData *sd, const AttributeDescriptor desc, ccl_private float4 *dx, ccl_private float4 *dy)
ccl_device_inline uint subd_triangle_patch_num_corners(KernelGlobals kg, int patch)
ccl_device_inline uint subd_triangle_patch_face(KernelGlobals kg, int patch)
ccl_device_noinline float subd_triangle_attribute_float(KernelGlobals kg, ccl_private const ShaderData *sd, const AttributeDescriptor desc, ccl_private float *dx, ccl_private float *dy)
ccl_device_inline void subd_triangle_patch_corners(KernelGlobals kg, int patch, int corners[4])
ccl_device_inline uint4 subd_triangle_patch_indices(KernelGlobals kg, int patch)
ccl_device_noinline float2 subd_triangle_attribute_float2(KernelGlobals kg, ccl_private const ShaderData *sd, const AttributeDescriptor desc, ccl_private float2 *dx, ccl_private float2 *dy)
CCL_NAMESPACE_BEGIN ccl_device_inline void subd_triangle_patch_uv(KernelGlobals kg, ccl_private const ShaderData *sd, float2 uv[3])
ccl_device_inline float4 color_uchar4_to_float4(uchar4 c)
ccl_device float4 color_srgb_to_linear_v4(float4 c)
ccl_device_inline int mod(int x, int m)