Blender V4.3
write.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
7#include "kernel/util/color.h"
8
9#ifdef __KERNEL_GPU__
10# define __ATOMIC_PASS_WRITE__
11#endif
12
14
15/* Get pointer to pixel in render buffer. */
16
19{
20 const uint32_t render_pixel_index = INTEGRATOR_STATE(state, path, render_pixel_index);
21 const uint64_t render_buffer_offset = (uint64_t)render_pixel_index *
22 kernel_data.film.pass_stride;
23 return render_buffer + render_buffer_offset;
24}
25
30{
31 const uint32_t render_pixel_index = INTEGRATOR_STATE(state, shadow_path, render_pixel_index);
32 const uint64_t render_buffer_offset = (uint64_t)render_pixel_index *
33 kernel_data.film.pass_stride;
34 return render_buffer + render_buffer_offset;
35}
36
37/* Accumulate in passes. */
38
40{
41#ifdef __ATOMIC_PASS_WRITE__
42 atomic_add_and_fetch_float(buffer, value);
43#else
44 *buffer += value;
45#endif
46}
47
49{
50#ifdef __ATOMIC_PASS_WRITE__
51 ccl_global float *buf_x = buffer + 0;
52 ccl_global float *buf_y = buffer + 1;
53 ccl_global float *buf_z = buffer + 2;
54
55 atomic_add_and_fetch_float(buf_x, value.x);
56 atomic_add_and_fetch_float(buf_y, value.y);
57 atomic_add_and_fetch_float(buf_z, value.z);
58#else
59 buffer[0] += value.x;
60 buffer[1] += value.y;
61 buffer[2] += value.z;
62#endif
63}
64
70
72{
73#ifdef __ATOMIC_PASS_WRITE__
74 ccl_global float *buf_x = buffer + 0;
75 ccl_global float *buf_y = buffer + 1;
76 ccl_global float *buf_z = buffer + 2;
77 ccl_global float *buf_w = buffer + 3;
78
79 atomic_add_and_fetch_float(buf_x, value.x);
80 atomic_add_and_fetch_float(buf_y, value.y);
81 atomic_add_and_fetch_float(buf_z, value.z);
82 atomic_add_and_fetch_float(buf_w, value.w);
83#else
84 buffer[0] += value.x;
85 buffer[1] += value.y;
86 buffer[2] += value.z;
87 buffer[3] += value.w;
88#endif
89}
90
91/* Overwrite for passes that only write on sample 0. This assumes only a single thread will write
92 * to this pixel and no atomics are needed. */
93
95 float value)
96{
97 *buffer = value;
98}
99
101 float3 value)
102{
103 buffer[0] = value.x;
104 buffer[1] = value.y;
105 buffer[2] = value.z;
106}
107
108/* Read back from passes. */
109
111{
112 return *buffer;
113}
114
116{
117 return make_float3(buffer[0], buffer[1], buffer[2]);
118}
119
121{
122 return make_float4(buffer[0], buffer[1], buffer[2], buffer[3]);
123}
124
#define atomic_add_and_fetch_float(p, x)
Definition atomic.h:13
#define kernel_data
const KernelGlobalsCPU *ccl_restrict KernelGlobals
#define ccl_restrict
#define ccl_device_forceinline
#define ccl_device_inline
#define ccl_global
#define CCL_NAMESPACE_END
ccl_device_forceinline float4 make_float4(const float x, const float y, const float z, const float w)
ccl_device_forceinline float3 make_float3(const float x, const float y, const float z)
ccl_gpu_kernel_postfix ccl_global KernelWorkTile const int ccl_global float * render_buffer
ccl_device_inline float3 spectrum_to_rgb(Spectrum s)
static ulong state[N]
const IntegratorShadowStateCPU *ccl_restrict ConstIntegratorShadowState
Definition state.h:231
const IntegratorStateCPU *ccl_restrict ConstIntegratorState
Definition state.h:229
#define INTEGRATOR_STATE(state, nested_struct, member)
Definition state.h:235
unsigned int uint32_t
Definition stdint.h:80
unsigned __int64 uint64_t
Definition stdint.h:90
SPECTRUM_DATA_TYPE Spectrum
ccl_device_inline float kernel_read_pass_float(ccl_global float *ccl_restrict buffer)
Definition write.h:110
ccl_device_inline float3 kernel_read_pass_float3(ccl_global float *ccl_restrict buffer)
Definition write.h:115
ccl_device_inline void film_overwrite_pass_float3(ccl_global float *ccl_restrict buffer, float3 value)
Definition write.h:100
ccl_device_inline void film_write_pass_spectrum(ccl_global float *ccl_restrict buffer, Spectrum value)
Definition write.h:65
ccl_device_forceinline ccl_global float * film_pass_pixel_render_buffer_shadow(KernelGlobals kg, ConstIntegratorShadowState state, ccl_global float *ccl_restrict render_buffer)
Definition write.h:26
ccl_device_inline void film_write_pass_float3(ccl_global float *ccl_restrict buffer, float3 value)
Definition write.h:48
CCL_NAMESPACE_BEGIN ccl_device_forceinline ccl_global float * film_pass_pixel_render_buffer(KernelGlobals kg, ConstIntegratorState state, ccl_global float *ccl_restrict render_buffer)
Definition write.h:17
ccl_device_inline float4 kernel_read_pass_float4(ccl_global float *ccl_restrict buffer)
Definition write.h:120
ccl_device_inline void film_write_pass_float4(ccl_global float *ccl_restrict buffer, float4 value)
Definition write.h:71
ccl_device_inline void film_overwrite_pass_float(ccl_global float *ccl_restrict buffer, float value)
Definition write.h:94
ccl_device_inline void film_write_pass_float(ccl_global float *ccl_restrict buffer, float value)
Definition write.h:39