/* SPDX-License-Identifier: Apache-2.0
 * Copyright 2011-2022 Blender Foundation */

#pragma once

CCL_NAMESPACE_BEGIN

ccl_device_noinline void svm_node_combine_color(KernelGlobals kg,
                                                ccl_private ShaderData *sd,
                                                ccl_private float *stack,
                                                uint color_type,
                                                uint inputs_stack_offsets,
                                                uint result_stack_offset)
{
  uint red_stack_offset, green_stack_offset, blue_stack_offset;
  svm_unpack_node_uchar3(
      inputs_stack_offsets, &red_stack_offset, &green_stack_offset, &blue_stack_offset);

  float r = stack_load_float(stack, red_stack_offset);
  float g = stack_load_float(stack, green_stack_offset);
  float b = stack_load_float(stack, blue_stack_offset);

  /* Combine, and convert back to RGB */
  float3 color = svm_combine_color((NodeCombSepColorType)color_type, make_float3(r, g, b));

  if (stack_valid(result_stack_offset))
    stack_store_float3(stack, result_stack_offset, color);
}

ccl_device_noinline void svm_node_separate_color(KernelGlobals kg,
                                                 ccl_private ShaderData *sd,
                                                 ccl_private float *stack,
                                                 uint color_type,
                                                 uint input_stack_offset,
                                                 uint results_stack_offsets)
{
  float3 color = stack_load_float3(stack, input_stack_offset);

  /* Convert color space */
  color = svm_separate_color((NodeCombSepColorType)color_type, color);

  uint red_stack_offset, green_stack_offset, blue_stack_offset;
  svm_unpack_node_uchar3(
      results_stack_offsets, &red_stack_offset, &green_stack_offset, &blue_stack_offset);

  if (stack_valid(red_stack_offset))
    stack_store_float(stack, red_stack_offset, color.x);
  if (stack_valid(green_stack_offset))
    stack_store_float(stack, green_stack_offset, color.y);
  if (stack_valid(blue_stack_offset))
    stack_store_float(stack, blue_stack_offset, color.z);
}

CCL_NAMESPACE_END
