Files
blender/intern/cycles/kernel/film/write_passes.h
Andrii Symkin d832d993c5 Cycles: add new Spectrum and PackedSpectrum types
These replace float3 and packed_float3 in various places in the kernel where a
spectral color representation will be used in the future. That representation
will require more than 3 channels and conversion to from/RGB. The kernel code
was refactored to remove the assumption that Spectrum and RGB colors are the
same thing.

There are no functional changes, Spectrum is still a float3 and the conversion
functions are no-ops.

Differential Revision: https://developer.blender.org/D15535
2022-08-09 16:49:34 +02:00

84 lines
2.2 KiB
C

/* SPDX-License-Identifier: Apache-2.0
* Copyright 2011-2022 Blender Foundation */
#pragma once
#include "kernel/util/color.h"
#ifdef __KERNEL_GPU__
# define __ATOMIC_PASS_WRITE__
#endif
CCL_NAMESPACE_BEGIN
ccl_device_inline void kernel_write_pass_float(ccl_global float *ccl_restrict buffer, float value)
{
#ifdef __ATOMIC_PASS_WRITE__
atomic_add_and_fetch_float(buffer, value);
#else
*buffer += value;
#endif
}
ccl_device_inline void kernel_write_pass_float3(ccl_global float *ccl_restrict buffer,
float3 value)
{
#ifdef __ATOMIC_PASS_WRITE__
ccl_global float *buf_x = buffer + 0;
ccl_global float *buf_y = buffer + 1;
ccl_global float *buf_z = buffer + 2;
atomic_add_and_fetch_float(buf_x, value.x);
atomic_add_and_fetch_float(buf_y, value.y);
atomic_add_and_fetch_float(buf_z, value.z);
#else
buffer[0] += value.x;
buffer[1] += value.y;
buffer[2] += value.z;
#endif
}
ccl_device_inline void kernel_write_pass_spectrum(ccl_global float *ccl_restrict buffer,
Spectrum value)
{
kernel_write_pass_float3(buffer, spectrum_to_rgb(value));
}
ccl_device_inline void kernel_write_pass_float4(ccl_global float *ccl_restrict buffer,
float4 value)
{
#ifdef __ATOMIC_PASS_WRITE__
ccl_global float *buf_x = buffer + 0;
ccl_global float *buf_y = buffer + 1;
ccl_global float *buf_z = buffer + 2;
ccl_global float *buf_w = buffer + 3;
atomic_add_and_fetch_float(buf_x, value.x);
atomic_add_and_fetch_float(buf_y, value.y);
atomic_add_and_fetch_float(buf_z, value.z);
atomic_add_and_fetch_float(buf_w, value.w);
#else
buffer[0] += value.x;
buffer[1] += value.y;
buffer[2] += value.z;
buffer[3] += value.w;
#endif
}
ccl_device_inline float kernel_read_pass_float(ccl_global float *ccl_restrict buffer)
{
return *buffer;
}
ccl_device_inline float3 kernel_read_pass_float3(ccl_global float *ccl_restrict buffer)
{
return make_float3(buffer[0], buffer[1], buffer[2]);
}
ccl_device_inline float4 kernel_read_pass_float4(ccl_global float *ccl_restrict buffer)
{
return make_float4(buffer[0], buffer[1], buffer[2], buffer[3]);
}
CCL_NAMESPACE_END