Move paint_all_new to backend.c

Fix build with -Dnew_backends=false. And more build test for this case.

Fixes #83

Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
This commit is contained in:
Yuxuan Shui 2019-01-02 20:34:07 +00:00
parent 34eb14fb0f
commit 82e8b09d56
No known key found for this signature in database
GPG Key ID: 37C999F617EA1A47
5 changed files with 131 additions and 119 deletions

View File

@ -27,7 +27,7 @@ commands:
- ".git" - ".git"
- run: - run:
name: config name: config
command: CC=<< parameters.cc >> meson << parameters.build-config >> -Dnew_backends=true --werror . build command: CC=<< parameters.cc >> meson << parameters.build-config >> --werror . build
- run: - run:
name: build name: build
command: ninja -C build command: ninja -C build
@ -43,46 +43,57 @@ jobs:
<<: *defaults <<: *defaults
steps: steps:
- build: - build:
build-config: -Dbuild_docs=true build-config: -Dbuild_docs=true -Dnew_backends=true
minimal: minimal:
<<: *defaults <<: *defaults
steps: steps:
- build: - build:
build-config: -Dopengl=false -Ddbus=false -Dregex=false -Dconfig_file=false build-config: -Dopengl=false -Ddbus=false -Dregex=false -Dconfig_file=false -Dnew_backends=true
nogl: nogl:
<<: *defaults <<: *defaults
steps: steps:
- build: - build:
build-config: -Dopengl=false build-config: -Dopengl=false -Dnew_backends=true
noregex: noregex:
<<: *defaults <<: *defaults
steps: steps:
- build: - build:
build-config: -Dregex=false build-config: -Dregex=false -Dnew_backends=true
clang_basic: clang_basic:
<<: *defaults <<: *defaults
steps: steps:
- build: - build:
cc: clang-6.0 cc: clang-6.0
build-config: build-config: -Dnew_backends=true
clang_minimal: clang_minimal:
<<: *defaults <<: *defaults
steps: steps:
- build: - build:
cc: clang-6.0 cc: clang-6.0
build-config: -Dopengl=false -Ddbus=false -Dregex=false -Dconfig_file=false build-config: -Dopengl=false -Ddbus=false -Dregex=false -Dconfig_file=false -Dnew_backends=true
clang_nogl: clang_nogl:
<<: *defaults <<: *defaults
steps: steps:
- build: - build:
cc: clang-6.0 cc: clang-6.0
build-config: -Dopengl=false build-config: -Dopengl=false -Dnew_backends=true
clang_noregex: clang_noregex:
<<: *defaults <<: *defaults
steps: steps:
- build: - build:
cc: clang-6.0 cc: clang-6.0
build-config: -Dregex=false build-config: -Dregex=false -Dnew_backends=true
clang_basic_nonew:
<<: *defaults
steps:
- build:
cc: clang-6.0
build-config:
basic_nonew:
<<: *defaults
steps:
- build:
build-config: -Dnew_backends=true
workflows: workflows:
all_builds: all_builds:

View File

@ -10,3 +10,113 @@ bool default_is_win_transparent(void *backend_data, win *w, void *win_data) {
bool default_is_frame_transparent(void *backend_data, win *w, void *win_data) { bool default_is_frame_transparent(void *backend_data, win *w, void *win_data) {
return w->frame_opacity != 1; return w->frame_opacity != 1;
} }
/// paint all windows
void paint_all_new(session_t *ps, region_t *region, win *const t) {
auto bi = backend_list[ps->o.backend];
assert(bi);
#ifdef DEBUG_REPAINT
static struct timespec last_paint = {0};
#endif
// Ignore out-of-screen damages
pixman_region32_intersect(region, region, &ps->screen_reg);
region_t reg_tmp, *reg_paint;
pixman_region32_init(&reg_tmp);
if (t) {
// Calculate the region upon which the root window (wallpaper) is to be
// painted based on the ignore region of the lowest window, if available
pixman_region32_subtract(&reg_tmp, region, t->reg_ignore);
reg_paint = &reg_tmp;
} else {
reg_paint = region;
}
if (bi->prepare)
bi->prepare(ps->backend_data, ps, reg_paint);
// Windows are sorted from bottom to top
// Each window has a reg_ignore, which is the region obscured by all the windows
// on top of that window. This is used to reduce the number of pixels painted.
//
// Whether this is beneficial is to be determined XXX
for (win *w = t; w; w = w->prev_trans) {
// Calculate the region based on the reg_ignore of the next (higher)
// window and the bounding region
// XXX XXX
pixman_region32_subtract(&reg_tmp, region, w->reg_ignore);
if (pixman_region32_not_empty(&reg_tmp)) {
// Render window content
// XXX do this in preprocess?
bi->render_win(ps->backend_data, ps, w, w->win_data, &reg_tmp);
// Blur window background
bool win_transparent =
bi->is_win_transparent(ps->backend_data, w, w->win_data);
bool frame_transparent =
bi->is_frame_transparent(ps->backend_data, w, w->win_data);
if (w->blur_background &&
(win_transparent ||
(ps->o.blur_background_frame && frame_transparent))) {
// Minimize the region we try to blur, if the window
// itself is not opaque, only the frame is.
region_t reg_blur = win_get_bounding_shape_global_by_val(w);
if (win_is_solid(ps, w)) {
region_t reg_noframe;
pixman_region32_init(&reg_noframe);
win_get_region_noframe_local(w, &reg_noframe);
pixman_region32_translate(&reg_noframe, w->g.x,
w->g.y);
pixman_region32_subtract(&reg_blur, &reg_blur,
&reg_noframe);
pixman_region32_fini(&reg_noframe);
}
bi->blur(ps->backend_data, ps,
(double)w->opacity / OPAQUE, &reg_blur);
pixman_region32_fini(&reg_blur);
}
// Draw window on target
bi->compose(ps->backend_data, ps, w, w->win_data, w->g.x, w->g.y,
&reg_tmp);
if (bi->finish_render_win)
bi->finish_render_win(ps->backend_data, ps, w, w->win_data);
}
}
// Free up all temporary regions
pixman_region32_fini(&reg_tmp);
if (bi->present) {
// Present the rendered scene
// Vsync is done here
bi->present(ps->backend_data, ps);
}
#ifdef DEBUG_REPAINT
print_timestamp(ps);
struct timespec now = get_time_timespec();
struct timespec diff = {0};
timespec_subtract(&diff, &now, &last_paint);
printf("[ %5ld:%09ld ] ", diff.tv_sec, diff.tv_nsec);
last_paint = now;
printf("paint:");
for (win *w = t; w; w = w->prev_trans)
printf(" %#010lx", w->id);
putchar('\n');
fflush(stdout);
#endif
// Check if fading is finished on all painted windows
win *pprev = NULL;
for (win *w = t; w; w = pprev) {
pprev = w->prev_trans;
win_check_fade_finished(ps, &w);
}
}
// vim: set noet sw=8 ts=8 :

View File

@ -144,3 +144,4 @@ extern backend_info_t *backend_list[];
bool default_is_win_transparent(void *, win *, void *); bool default_is_win_transparent(void *, win *, void *);
bool default_is_frame_transparent(void *, win *, void *); bool default_is_frame_transparent(void *, win *, void *);
void paint_all_new(session_t *ps, region_t *region, win *const t);

View File

@ -240,112 +240,4 @@ shadow_picture_err:
return false; return false;
} }
/// paint all windows
void paint_all_new(session_t *ps, region_t *region, win *const t) {
auto bi = backend_list[ps->o.backend];
assert(bi);
#ifdef DEBUG_REPAINT
static struct timespec last_paint = {0};
#endif
// Ignore out-of-screen damages
pixman_region32_intersect(region, region, &ps->screen_reg);
region_t reg_tmp, *reg_paint;
pixman_region32_init(&reg_tmp);
if (t) {
// Calculate the region upon which the root window (wallpaper) is to be
// painted based on the ignore region of the lowest window, if available
pixman_region32_subtract(&reg_tmp, region, t->reg_ignore);
reg_paint = &reg_tmp;
} else {
reg_paint = region;
}
if (bi->prepare)
bi->prepare(ps->backend_data, ps, reg_paint);
// Windows are sorted from bottom to top
// Each window has a reg_ignore, which is the region obscured by all the windows
// on top of that window. This is used to reduce the number of pixels painted.
//
// Whether this is beneficial is to be determined XXX
for (win *w = t; w; w = w->prev_trans) {
// Calculate the region based on the reg_ignore of the next (higher)
// window and the bounding region
// XXX XXX
pixman_region32_subtract(&reg_tmp, region, w->reg_ignore);
if (pixman_region32_not_empty(&reg_tmp)) {
// Render window content
// XXX do this in preprocess?
bi->render_win(ps->backend_data, ps, w, w->win_data, &reg_tmp);
// Blur window background
bool win_transparent =
bi->is_win_transparent(ps->backend_data, w, w->win_data);
bool frame_transparent =
bi->is_frame_transparent(ps->backend_data, w, w->win_data);
if (w->blur_background &&
(win_transparent ||
(ps->o.blur_background_frame && frame_transparent))) {
// Minimize the region we try to blur, if the window
// itself is not opaque, only the frame is.
region_t reg_blur = win_get_bounding_shape_global_by_val(w);
if (win_is_solid(ps, w)) {
region_t reg_noframe;
pixman_region32_init(&reg_noframe);
win_get_region_noframe_local(w, &reg_noframe);
pixman_region32_translate(&reg_noframe, w->g.x,
w->g.y);
pixman_region32_subtract(&reg_blur, &reg_blur,
&reg_noframe);
pixman_region32_fini(&reg_noframe);
}
bi->blur(ps->backend_data, ps,
(double)w->opacity / OPAQUE, &reg_blur);
pixman_region32_fini(&reg_blur);
}
// Draw window on target
bi->compose(ps->backend_data, ps, w, w->win_data, w->g.x, w->g.y,
&reg_tmp);
if (bi->finish_render_win)
bi->finish_render_win(ps->backend_data, ps, w, w->win_data);
}
}
// Free up all temporary regions
pixman_region32_fini(&reg_tmp);
if (bi->present) {
// Present the rendered scene
// Vsync is done here
bi->present(ps->backend_data, ps);
}
#ifdef DEBUG_REPAINT
print_timestamp(ps);
struct timespec now = get_time_timespec();
struct timespec diff = {0};
timespec_subtract(&diff, &now, &last_paint);
printf("[ %5ld:%09ld ] ", diff.tv_sec, diff.tv_nsec);
last_paint = now;
printf("paint:");
for (win *w = t; w; w = w->prev_trans)
printf(" %#010lx", w->id);
putchar('\n');
fflush(stdout);
#endif
// Check if fading is finished on all painted windows
win *pprev = NULL;
for (win *w = t; w; w = pprev) {
pprev = w->prev_trans;
win_check_fade_finished(ps, &w);
}
}
// vim: set noet sw=8 ts=8 : // vim: set noet sw=8 ts=8 :

View File

@ -17,7 +17,5 @@ bool build_shadow(session_t *ps, double opacity, const int width, const int heig
xcb_render_picture_t xcb_render_picture_t
solid_picture(session_t *ps, bool argb, double a, double r, double g, double b); solid_picture(session_t *ps, bool argb, double a, double r, double g, double b);
void paint_all_new(session_t *ps, region_t *region, win *const t);
xcb_image_t * xcb_image_t *
make_shadow(xcb_connection_t *c, const conv *kernel, double opacity, int width, int height); make_shadow(xcb_connection_t *c, const conv *kernel, double opacity, int width, int height);