ClangFormat: apply to source, most of intern
[blender.git] / intern / cycles / render / denoising.h
1 /*
2  * Copyright 2011-2018 Blender Foundation
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 #ifndef __DENOISING_H__
18 #define __DENOISING_H__
19
20 #include "device/device.h"
21 #include "device/device_denoising.h"
22
23 #include "render/buffers.h"
24
25 #include "util/util_string.h"
26 #include "util/util_vector.h"
27 #include "util/util_unique_ptr.h"
28
29 #include <OpenImageIO/imageio.h>
30
31 OIIO_NAMESPACE_USING
32
33 CCL_NAMESPACE_BEGIN
34
35 /* Denoiser */
36
37 class Denoiser {
38  public:
39   Denoiser(DeviceInfo &device_info);
40   ~Denoiser();
41
42   bool run();
43
44   /* Error message after running, in case of failure. */
45   string error;
46
47   /* Sequential list of frame filepaths to denoise. */
48   vector<string> input;
49   /* Sequential list of frame filepaths to write result to. Empty entries
50    * are skipped, so only a subset of the sequence can be denoised while
51    * taking into account all input frames. */
52   vector<string> output;
53
54   /* Sample number override, takes precedence over values from input frames. */
55   int samples_override;
56   /* Tile size for processing on device. */
57   int2 tile_size;
58
59   /* Equivalent to the settings in the regular denoiser. */
60   DenoiseParams params;
61
62  protected:
63   friend class DenoiseTask;
64
65   Stats stats;
66   Profiler profiler;
67   Device *device;
68
69   int num_frames;
70 };
71
72 /* Denoise Image Layer */
73
74 struct DenoiseImageLayer {
75   string name;
76   /* All channels belonging to this DenoiseImageLayer. */
77   vector<string> channels;
78   /* Layer to image channel mapping. */
79   vector<int> layer_to_image_channel;
80
81   /* Sample amount that was used for rendering this layer. */
82   int samples;
83
84   /* Device input channel will be copied from image channel input_to_image_channel[i]. */
85   vector<int> input_to_image_channel;
86
87   /* input_to_image_channel of the secondary frames, if any are used. */
88   vector<vector<int>> neighbor_input_to_image_channel;
89
90   /* Write i-th channel of the processing output to output_to_image_channel[i]-th channel of the file. */
91   vector<int> output_to_image_channel;
92
93   /* Detect whether this layer contains a full set of channels and set up the offsets accordingly. */
94   bool detect_denoising_channels();
95
96   /* Map the channels of a secondary frame to the channels that are required for processing,
97    * fill neighbor_input_to_image_channel if all are present or return false if a channel are missing. */
98   bool match_channels(int neighbor,
99                       const std::vector<string> &channelnames,
100                       const std::vector<string> &neighbor_channelnames);
101 };
102
103 /* Denoise Image Data */
104
105 class DenoiseImage {
106  public:
107   DenoiseImage();
108   ~DenoiseImage();
109
110   /* Dimensions */
111   int width, height, num_channels;
112
113   /* Samples */
114   int samples;
115
116   /* Pixel buffer with interleaved channels. */
117   array<float> pixels;
118
119   /* Image file handles */
120   ImageSpec in_spec;
121   vector<unique_ptr<ImageInput>> in_neighbors;
122
123   /* Render layers */
124   vector<DenoiseImageLayer> layers;
125
126   void free();
127
128   /* Open the input image, parse its channels, open the output image and allocate the output buffer. */
129   bool load(const string &in_filepath, string &error);
130
131   /* Load neighboring frames. */
132   bool load_neighbors(const vector<string> &filepaths, const vector<int> &frames, string &error);
133
134   /* Load subset of pixels from file buffer into input buffer, as needed for denoising
135    * on the device. Channels are reshuffled following the provided mapping. */
136   void read_pixels(const DenoiseImageLayer &layer, float *input_pixels);
137   bool read_neighbor_pixels(int neighbor, const DenoiseImageLayer &layer, float *input_pixels);
138
139   bool save_output(const string &out_filepath, string &error);
140
141  protected:
142   /* Parse input file channels, separate them into DenoiseImageLayers, detect DenoiseImageLayers with full channel sets,
143    * fill layers and set up the output channels and passthrough map. */
144   bool parse_channels(const ImageSpec &in_spec, string &error);
145
146   void close_input();
147 };
148
149 /* Denoise Task */
150
151 class DenoiseTask {
152  public:
153   DenoiseTask(Device *device, Denoiser *denoiser, int frame, const vector<int> &neighbor_frames);
154   ~DenoiseTask();
155
156   /* Task stages */
157   bool load();
158   bool exec();
159   bool save();
160   void free();
161
162   string error;
163
164  protected:
165   /* Denoiser parameters and device */
166   Denoiser *denoiser;
167   Device *device;
168
169   /* Frame number to be denoised */
170   int frame;
171   vector<int> neighbor_frames;
172
173   /* Image file data */
174   DenoiseImage image;
175   int current_layer;
176
177   /* Device input buffer */
178   device_vector<float> input_pixels;
179
180   /* Tiles */
181   thread_mutex tiles_mutex;
182   list<RenderTile> tiles;
183   int num_tiles;
184
185   thread_mutex output_mutex;
186   map<int, device_vector<float> *> output_pixels;
187
188   /* Task handling */
189   bool load_input_pixels(int layer);
190   void create_task(DeviceTask &task);
191
192   /* Device task callbacks */
193   bool acquire_tile(Device *device, Device *tile_device, RenderTile &tile);
194   void map_neighboring_tiles(RenderTile *tiles, Device *tile_device);
195   void unmap_neighboring_tiles(RenderTile *tiles);
196   void release_tile();
197   bool get_cancel();
198 };
199
200 CCL_NAMESPACE_END
201
202 #endif /* __DENOISING_H__ */