Blender  V3.3
progress.h
Go to the documentation of this file.
1 /* SPDX-License-Identifier: Apache-2.0
2  * Copyright 2011-2022 Blender Foundation */
3 
4 #ifndef __UTIL_PROGRESS_H__
5 #define __UTIL_PROGRESS_H__
6 
7 /* Progress
8  *
9  * Simple class to communicate progress status messages, timing information,
10  * update notifications from a job running in another thread. All methods
11  * except for the constructor/destructor are thread safe. */
12 
13 #include "util/function.h"
14 #include "util/string.h"
15 #include "util/thread.h"
16 #include "util/time.h"
17 
19 
20 class Progress {
21  public:
23  {
24  pixel_samples = 0;
27  rendered_tiles = 0;
28  denoised_tiles = 0;
29  start_time = time_dt();
31  end_time = 0.0;
32  status = "Initializing";
33  substatus = "";
34  sync_status = "";
35  sync_substatus = "";
37  cancel = false;
38  cancel_message = "";
39  error = false;
40  error_message = "";
42  }
43 
44  Progress(Progress &progress)
45  {
46  *this = progress;
47  }
48 
50  {
52 
53  progress.get_status(status, substatus);
54 
55  pixel_samples = progress.pixel_samples;
58 
59  return *this;
60  }
61 
62  void reset()
63  {
64  pixel_samples = 0;
67  rendered_tiles = 0;
68  denoised_tiles = 0;
69  start_time = time_dt();
71  end_time = 0.0;
72  status = "Initializing";
73  substatus = "";
74  sync_status = "";
75  sync_substatus = "";
76  cancel = false;
77  cancel_message = "";
78  error = false;
79  error_message = "";
80  }
81 
82  /* cancel */
83  void set_cancel(const string &cancel_message_)
84  {
86  cancel_message = cancel_message_;
87  cancel = true;
88  }
89 
90  bool get_cancel() const
91  {
92  if (!cancel && cancel_cb)
93  cancel_cb();
94 
95  return cancel;
96  }
97 
98  string get_cancel_message() const
99  {
101  return cancel_message;
102  }
103 
104  void set_cancel_callback(function<void()> function)
105  {
106  cancel_cb = function;
107  }
108 
109  /* error */
110  void set_error(const string &error_message_)
111  {
113  error_message = error_message_;
114  error = true;
115  /* If error happens we also stop rendering. */
116  cancel_message = error_message_;
117  cancel = true;
118  }
119 
120  bool get_error() const
121  {
122  return error;
123  }
124 
125  string get_error_message() const
126  {
128  return error_message;
129  }
130 
131  /* tile and timing information */
132 
134  {
136 
137  start_time = time_dt();
138  end_time = 0.0;
139  }
140 
142  {
144 
146  }
147 
148  void add_skip_time(const scoped_timer &start_timer, bool only_render)
149  {
150  double skip_time = time_dt() - start_timer.get_start();
151 
152  render_start_time += skip_time;
153  if (!only_render) {
154  start_time += skip_time;
155  }
156  }
157 
158  void get_time(double &total_time_, double &render_time_) const
159  {
161 
162  double time = (end_time > 0) ? end_time : time_dt();
163 
164  total_time_ = time - start_time;
165  render_time_ = time - render_start_time;
166  }
167 
169  {
170  end_time = time_dt();
171  }
172 
174  {
176 
177  pixel_samples = 0;
179  rendered_tiles = 0;
180  denoised_tiles = 0;
181  }
182 
183  void set_total_pixel_samples(uint64_t total_pixel_samples_)
184  {
186 
187  total_pixel_samples = total_pixel_samples_;
188  }
189 
190  double get_progress() const
191  {
193 
194  if (total_pixel_samples > 0) {
195  return ((double)pixel_samples) / (double)total_pixel_samples;
196  }
197  return 0.0;
198  }
199 
200  void add_samples(uint64_t pixel_samples_, int tile_sample)
201  {
203 
204  pixel_samples += pixel_samples_;
205  current_tile_sample = tile_sample;
206  }
207 
208  void add_samples_update(uint64_t pixel_samples_, int tile_sample)
209  {
210  add_samples(pixel_samples_, tile_sample);
211  set_update();
212  }
213 
214  void add_finished_tile(bool denoised)
215  {
217 
218  if (denoised) {
219  denoised_tiles++;
220  }
221  else {
222  rendered_tiles++;
223  }
224  }
225 
226  int get_current_sample() const
227  {
229  /* Note that the value here always belongs to the last tile that updated,
230  * so it's only useful if there is only one active tile. */
231  return current_tile_sample;
232  }
233 
234  int get_rendered_tiles() const
235  {
237  return rendered_tiles;
238  }
239 
240  int get_denoised_tiles() const
241  {
243  return denoised_tiles;
244  }
245 
246  /* status messages */
247 
248  void set_status(const string &status_, const string &substatus_ = "")
249  {
250  {
252  status = status_;
253  substatus = substatus_;
254  }
255 
256  set_update();
257  }
258 
259  void set_substatus(const string &substatus_)
260  {
261  {
263  substatus = substatus_;
264  }
265 
266  set_update();
267  }
268 
269  void set_sync_status(const string &status_, const string &substatus_ = "")
270  {
271  {
273  sync_status = status_;
274  sync_substatus = substatus_;
275  }
276 
277  set_update();
278  }
279 
280  void set_sync_substatus(const string &substatus_)
281  {
282  {
284  sync_substatus = substatus_;
285  }
286 
287  set_update();
288  }
289 
290  void get_status(string &status_, string &substatus_) const
291  {
293 
294  if (sync_status != "") {
295  status_ = sync_status;
296  substatus_ = sync_substatus;
297  }
298  else {
299  status_ = status;
300  substatus_ = substatus;
301  }
302  }
303 
304  /* callback */
305 
306  void set_update()
307  {
308  if (update_cb) {
310  update_cb();
311  }
312  }
313 
314  void set_update_callback(function<void()> function)
315  {
316  update_cb = function;
317  }
318 
319  protected:
322  function<void()> update_cb;
323  function<void()> cancel_cb;
324 
325  /* pixel_samples counts how many samples have been rendered over all pixel, not just per pixel.
326  * This makes the progress estimate more accurate when tiles with different sizes are used.
327  *
328  * total_pixel_samples is the total amount of pixel samples that will be rendered. */
330  /* Stores the current sample count of the last tile that called the update function.
331  * It's used to display the sample count if only one tile is active. */
333  /* Stores the number of tiles that's already finished.
334  * Used to determine whether all but the last tile are finished rendering,
335  * in which case the current_tile_sample is displayed. */
337 
339  /* End time written when render is done, so it doesn't keep increasing on redraws. */
340  double end_time;
341 
342  string status;
343  string substatus;
344 
345  string sync_status;
347 
348  volatile bool cancel;
350 
351  volatile bool error;
353 };
354 
356 
357 #endif /* __UTIL_PROGRESS_H__ */
typedef double(DMatrix)[4][4]
volatile int lock
Progress()
Definition: progress.h:22
Progress & operator=(Progress &progress)
Definition: progress.h:49
function< void()> update_cb
Definition: progress.h:322
void set_cancel_callback(function< void()> function)
Definition: progress.h:104
int denoised_tiles
Definition: progress.h:336
string sync_substatus
Definition: progress.h:346
void get_status(string &status_, string &substatus_) const
Definition: progress.h:290
int get_current_sample() const
Definition: progress.h:226
Progress(Progress &progress)
Definition: progress.h:44
void set_total_pixel_samples(uint64_t total_pixel_samples_)
Definition: progress.h:183
void set_cancel(const string &cancel_message_)
Definition: progress.h:83
string status
Definition: progress.h:342
volatile bool error
Definition: progress.h:351
int rendered_tiles
Definition: progress.h:336
void set_end_time()
Definition: progress.h:168
int current_tile_sample
Definition: progress.h:332
string get_cancel_message() const
Definition: progress.h:98
void set_substatus(const string &substatus_)
Definition: progress.h:259
void get_time(double &total_time_, double &render_time_) const
Definition: progress.h:158
void set_sync_substatus(const string &substatus_)
Definition: progress.h:280
bool get_cancel() const
Definition: progress.h:90
double start_time
Definition: progress.h:338
string error_message
Definition: progress.h:352
thread_mutex update_mutex
Definition: progress.h:321
void reset_sample()
Definition: progress.h:173
void set_status(const string &status_, const string &substatus_="")
Definition: progress.h:248
double render_start_time
Definition: progress.h:338
string substatus
Definition: progress.h:343
void set_update()
Definition: progress.h:306
int get_denoised_tiles() const
Definition: progress.h:240
string cancel_message
Definition: progress.h:349
void set_sync_status(const string &status_, const string &substatus_="")
Definition: progress.h:269
volatile bool cancel
Definition: progress.h:348
void reset()
Definition: progress.h:62
void add_samples(uint64_t pixel_samples_, int tile_sample)
Definition: progress.h:200
uint64_t total_pixel_samples
Definition: progress.h:329
void set_error(const string &error_message_)
Definition: progress.h:110
double get_progress() const
Definition: progress.h:190
thread_mutex progress_mutex
Definition: progress.h:320
bool get_error() const
Definition: progress.h:120
double end_time
Definition: progress.h:340
void add_samples_update(uint64_t pixel_samples_, int tile_sample)
Definition: progress.h:208
void set_render_start_time()
Definition: progress.h:141
void add_finished_tile(bool denoised)
Definition: progress.h:214
uint64_t pixel_samples
Definition: progress.h:329
string get_error_message() const
Definition: progress.h:125
string sync_status
Definition: progress.h:345
void add_skip_time(const scoped_timer &start_timer, bool only_render)
Definition: progress.h:148
int get_rendered_tiles() const
Definition: progress.h:234
void set_start_time()
Definition: progress.h:133
function< void()> cancel_cb
Definition: progress.h:323
void set_update_callback(function< void()> function)
Definition: progress.h:314
double get_start() const
Definition: time.h:36
#define CCL_NAMESPACE_END
Definition: cuda/compat.h:9
double time
SyclQueue void void size_t num_bytes void
#define function_null
Definition: function.h:12
unsigned __int64 uint64_t
Definition: stdint.h:90
std::unique_lock< std::mutex > thread_scoped_lock
Definition: thread.h:28
CCL_NAMESPACE_BEGIN typedef std::mutex thread_mutex
Definition: thread.h:27
CCL_NAMESPACE_BEGIN double time_dt()
Definition: time.cpp:35