2015-08-23 18:22:37 +00:00
|
|
|
#include "RenderProgress.h"
|
|
|
|
|
|
|
|
#include "Mutex.h"
|
2015-12-30 19:20:27 +00:00
|
|
|
#include "Timing.h"
|
2015-09-13 20:38:44 +00:00
|
|
|
#include "Logs.h"
|
2015-08-23 18:22:37 +00:00
|
|
|
|
2015-11-09 21:30:46 +00:00
|
|
|
RenderProgress::RenderProgress(int count) {
|
2015-08-23 18:22:37 +00:00
|
|
|
lock = new Mutex();
|
|
|
|
global = 0.0;
|
2015-12-17 00:13:20 +00:00
|
|
|
step = 1.0 / to_double(count);
|
2015-11-02 22:39:34 +00:00
|
|
|
start_time = 0;
|
2015-09-13 20:38:44 +00:00
|
|
|
end_time = 0;
|
2015-11-02 22:39:34 +00:00
|
|
|
reset();
|
2015-08-23 18:22:37 +00:00
|
|
|
}
|
|
|
|
|
2015-11-09 21:30:46 +00:00
|
|
|
paysages::software::RenderProgress::~RenderProgress() {
|
2015-08-23 18:22:37 +00:00
|
|
|
delete lock;
|
|
|
|
}
|
|
|
|
|
2015-11-09 21:30:46 +00:00
|
|
|
void RenderProgress::reset() {
|
2015-09-09 22:40:47 +00:00
|
|
|
lock->acquire();
|
|
|
|
|
|
|
|
global = 0.0;
|
2015-11-09 21:30:46 +00:00
|
|
|
while (not subs.empty()) {
|
2015-09-09 22:40:47 +00:00
|
|
|
subs.pop();
|
|
|
|
}
|
|
|
|
|
2015-12-30 19:20:27 +00:00
|
|
|
start_time = Timing::getRelativeTimeMs();
|
2015-09-13 20:38:44 +00:00
|
|
|
|
2015-11-02 22:39:34 +00:00
|
|
|
prev_est_spent = 0;
|
|
|
|
prev_est_done = 0.0;
|
|
|
|
prev_est_speed = 0.0;
|
|
|
|
|
2015-09-09 22:40:47 +00:00
|
|
|
lock->release();
|
|
|
|
}
|
|
|
|
|
2015-11-09 21:30:46 +00:00
|
|
|
void RenderProgress::add(int value) {
|
2015-08-23 18:22:37 +00:00
|
|
|
lock->acquire();
|
|
|
|
|
2015-12-17 00:13:20 +00:00
|
|
|
global += step * to_double(value);
|
2015-08-23 18:22:37 +00:00
|
|
|
|
|
|
|
lock->release();
|
|
|
|
}
|
|
|
|
|
2015-11-09 21:30:46 +00:00
|
|
|
void RenderProgress::enterSub(int count) {
|
2015-08-23 18:22:37 +00:00
|
|
|
struct RenderSub sub;
|
|
|
|
sub.start = global;
|
|
|
|
sub.end = global + step;
|
|
|
|
sub.count = count;
|
|
|
|
sub.previous_step = step;
|
|
|
|
|
|
|
|
lock->acquire();
|
|
|
|
|
|
|
|
subs.push(sub);
|
2015-12-17 00:13:20 +00:00
|
|
|
step /= to_double(count);
|
2015-08-23 18:22:37 +00:00
|
|
|
|
|
|
|
lock->release();
|
|
|
|
}
|
|
|
|
|
2015-11-09 21:30:46 +00:00
|
|
|
void RenderProgress::exitSub() {
|
2015-08-23 18:22:37 +00:00
|
|
|
lock->acquire();
|
|
|
|
|
|
|
|
struct RenderSub sub = subs.top();
|
|
|
|
|
|
|
|
global = sub.end;
|
|
|
|
step = sub.previous_step;
|
|
|
|
|
|
|
|
subs.pop();
|
|
|
|
|
|
|
|
lock->release();
|
|
|
|
}
|
2015-09-13 20:38:44 +00:00
|
|
|
|
2015-11-09 21:30:46 +00:00
|
|
|
void RenderProgress::end() {
|
|
|
|
if (subs.size() > 0) {
|
2015-12-13 19:08:38 +00:00
|
|
|
Logs::error("Software") << subs.size() << " progress subs remaining at the end of render" << endl;
|
2015-09-13 20:38:44 +00:00
|
|
|
}
|
|
|
|
|
2015-12-30 19:20:27 +00:00
|
|
|
end_time = Timing::getRelativeTimeMs();
|
2015-09-13 20:38:44 +00:00
|
|
|
}
|
|
|
|
|
2015-11-09 21:30:46 +00:00
|
|
|
unsigned long RenderProgress::getDuration() const {
|
|
|
|
if (end_time) {
|
2015-09-13 20:38:44 +00:00
|
|
|
return end_time - start_time;
|
2015-11-09 21:30:46 +00:00
|
|
|
} else {
|
2015-12-30 19:20:27 +00:00
|
|
|
return Timing::getRelativeTimeMs() - start_time;
|
2015-09-13 20:38:44 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-11-09 21:30:46 +00:00
|
|
|
unsigned long RenderProgress::estimateRemainingTime() {
|
2015-11-02 22:39:34 +00:00
|
|
|
unsigned long spent = getDuration();
|
2015-12-17 00:13:20 +00:00
|
|
|
double speed = (global - prev_est_done) / to_double(spent - prev_est_spent);
|
2015-11-02 22:39:34 +00:00
|
|
|
|
|
|
|
prev_est_speed = prev_est_speed ? (prev_est_speed * 0.8 + speed * 0.2) : speed;
|
2015-11-09 21:30:46 +00:00
|
|
|
if (spent - prev_est_spent > 5000) {
|
2015-11-02 22:39:34 +00:00
|
|
|
prev_est_spent = spent;
|
|
|
|
prev_est_done = global;
|
|
|
|
}
|
|
|
|
|
2015-11-09 21:30:46 +00:00
|
|
|
if (prev_est_speed > 0.0000000001) {
|
2015-11-02 22:39:34 +00:00
|
|
|
return (unsigned long)((1.0 - global) / prev_est_speed);
|
2015-11-09 21:30:46 +00:00
|
|
|
} else {
|
2015-11-02 22:39:34 +00:00
|
|
|
return 0;
|
2015-09-13 20:38:44 +00:00
|
|
|
}
|
|
|
|
}
|