core: force redraw if animated shader is in-use

I also noticed there is an opportunity to unify fades, animated shaders,
and the benchmark mode. We should be able to get rid of the fade timer.
A TODO for the future.

Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
This commit is contained in:
Yuxuan Shui
2022-08-12 13:44:14 +01:00
parent 83e1cd9a19
commit 32478df27c

View File

@@ -527,6 +527,8 @@ static bool initialize_backend(session_t *ps) {
} else {
shader->attributes = 0;
}
log_debug("Shader %s has attributes %ld", shader->key,
shader->attributes);
}
}
@@ -648,11 +650,13 @@ static void handle_root_flags(session_t *ps) {
}
}
static struct managed_win *paint_preprocess(session_t *ps, bool *fade_running) {
static struct managed_win *
paint_preprocess(session_t *ps, bool *fade_running, bool *animation) {
// XXX need better, more general name for `fade_running`. It really
// means if fade is still ongoing after the current frame is rendered
struct managed_win *bottom = NULL;
*fade_running = false;
*animation = false;
// Fading step calculation
long long steps = 0L;
@@ -667,7 +671,9 @@ static struct managed_win *paint_preprocess(session_t *ps, bool *fade_running) {
}
ps->fade_time += steps * ps->o.fade_delta;
// First, let's process fading
// First, let's process fading, and animated shaders
// TODO(yshui) check if a window is fully obscured, and if we don't need to
// process fading or animation for it.
win_stack_foreach_managed_safe(w, &ps->window_stack) {
const winmode_t mode_old = w->mode;
const bool was_painted = w->to_paint;
@@ -678,6 +684,11 @@ static struct managed_win *paint_preprocess(session_t *ps, bool *fade_running) {
add_damage_from_win(ps, w);
}
if (w->fg_shader && (w->fg_shader->attributes & SHADER_ATTRIBUTE_ANIMATED)) {
add_damage_from_win(ps, w);
*animation = true;
}
// Run fading
if (run_fade(ps, &w, steps)) {
*fade_running = true;
@@ -1462,8 +1473,9 @@ static void draw_callback_impl(EV_P_ session_t *ps, int revents attr_unused) {
* screen is not redirected. its sole purpose should be to decide whether the
* screen should be redirected. */
bool fade_running = false;
bool animation = false;
bool was_redirected = ps->redirected;
auto bottom = paint_preprocess(ps, &fade_running);
auto bottom = paint_preprocess(ps, &fade_running, &animation);
ps->tmout_unredir_hit = false;
if (!was_redirected && ps->redirected) {
@@ -1512,7 +1524,7 @@ static void draw_callback_impl(EV_P_ session_t *ps, int revents attr_unused) {
// TODO(yshui) Investigate how big the X critical section needs to be. There are
// suggestions that rendering should be in the critical section as well.
ps->redraw_needed = false;
ps->redraw_needed = animation;
}
static void draw_callback(EV_P_ ev_idle *w, int revents) {
@@ -1520,8 +1532,9 @@ static void draw_callback(EV_P_ ev_idle *w, int revents) {
draw_callback_impl(EV_A_ ps, revents);
// Don't do painting non-stop unless we are in benchmark mode
if (!ps->o.benchmark) {
// Don't do painting non-stop unless we are in benchmark mode, or if
// draw_callback_impl thinks we should continue painting.
if (!ps->o.benchmark && !ps->redraw_needed) {
ev_idle_stop(EV_A_ & ps->draw_idle);
}
}