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