yshui / picom

A lightweight compositor for X11 with animation support
https://picom.app/
Other
4.18k stars 589 forks source link

Picom crashes when monitors go to sleep #487

Closed eyoung closed 3 years ago

eyoung commented 4 years ago

Platform

Arch Linux

GPU, drivers, and screen setup

Nvidia GTX 1080, Nvidia Drivers 450.66-18, 3 monitors 2, 4k, 1 standard side by side.

Environment

i3-gaps

picom version

vgit-e553e

Version: vgit-e553e

Extensions:

Misc:

Drivers (inaccurate):

NVIDIA

Configuration:

#################################
#             Shadows           #
#################################

# Enabled client-side shadows on windows. Note desktop windows 
# (windows with '_NET_WM_WINDOW_TYPE_DESKTOP') never get shadow, 
# unless explicitly requested using the wintypes option.
#
# shadow = false
shadow = true;

# The blur radius for shadows, in pixels. (defaults to 12)
# shadow-radius = 12
shadow-radius = 7;

# The opacity of shadows. (0.0 - 1.0, defaults to 0.75)
# shadow-opacity = .75

# The left offset for shadows, in pixels. (defaults to -15)
# shadow-offset-x = -15
shadow-offset-x = -7;

# The top offset for shadows, in pixels. (defaults to -15)
# shadow-offset-y = -15
shadow-offset-y = -7;

# Avoid drawing shadows on dock/panel windows. This option is deprecated,
# you should use the *wintypes* option in your config file instead.
#
# no-dock-shadow = false

# Don't draw shadows on drag-and-drop windows. This option is deprecated, 
# you should use the *wintypes* option in your config file instead.
#
# no-dnd-shadow = false

# Red color value of shadow (0.0 - 1.0, defaults to 0).
# shadow-red = 0

# Green color value of shadow (0.0 - 1.0, defaults to 0).
# shadow-green = 0

# Blue color value of shadow (0.0 - 1.0, defaults to 0).
# shadow-blue = 0

# Do not paint shadows on shaped windows. Note shaped windows 
# here means windows setting its shape through X Shape extension. 
# Those using ARGB background is beyond our control. 
# Deprecated, use 
#   shadow-exclude = 'bounding_shaped'
# or 
#   shadow-exclude = 'bounding_shaped && !rounded_corners'
# instead.
#
# shadow-ignore-shaped = ''

# Specify a list of conditions of windows that should have no shadow.
#
# examples:
#   shadow-exclude = "n:e:Notification";
#
# shadow-exclude = []
shadow-exclude = [
  "name = 'Notification'",
  "class_g = 'Conky'",
  "class_g ?= 'Notify-osd'",
  "class_g = 'Cairo-clock'",
  "_GTK_FRAME_EXTENTS@:c"
];

# Specify a X geometry that describes the region in which shadow should not
# be painted in, such as a dock window region. Use 
#    shadow-exclude-reg = "x10+0+0"
# for example, if the 10 pixels on the bottom of the screen should not have shadows painted on.
#
# shadow-exclude-reg = "" 

# Crop shadow of a window fully on a particular Xinerama screen to the screen.
# xinerama-shadow-crop = false

#################################
#           Fading              #
#################################

# Fade windows in/out when opening/closing and when opacity changes,
#  unless no-fading-openclose is used.
# fading = false
fading = true

# Opacity change between steps while fading in. (0.01 - 1.0, defaults to 0.028)
# fade-in-step = 0.028
fade-in-step = 0.03;

# Opacity change between steps while fading out. (0.01 - 1.0, defaults to 0.03)
# fade-out-step = 0.03
fade-out-step = 0.03;

# The time between steps in fade step, in milliseconds. (> 0, defaults to 10)
# fade-delta = 10

# Specify a list of conditions of windows that should not be faded.
# fade-exclude = []

# Do not fade on window open/close.
# no-fading-openclose = false

# Do not fade destroyed ARGB windows with WM frame. Workaround of bugs in Openbox, Fluxbox, etc.
# no-fading-destroyed-argb = false

#################################
#   Transparency / Opacity      #
#################################

# Opacity of inactive windows. (0.1 - 1.0, defaults to 1.0)
# inactive-opacity = 1
inactive-opacity = 0.8;

# Opacity of window titlebars and borders. (0.1 - 1.0, disabled by default)
# frame-opacity = 1.0
frame-opacity = 0.7;

# Default opacity for dropdown menus and popup menus. (0.0 - 1.0, defaults to 1.0)
# menu-opacity = 1.0

# Let inactive opacity set by -i override the '_NET_WM_OPACITY' values of windows.
# inactive-opacity-override = true
inactive-opacity-override = false;

# Default opacity for active windows. (0.0 - 1.0, defaults to 1.0)
# active-opacity = 1.0

# Dim inactive windows. (0.0 - 1.0, defaults to 0.0)
# inactive-dim = 0.0

# Specify a list of conditions of windows that should always be considered focused.
# focus-exclude = []
focus-exclude = [ "class_g = 'Cairo-clock'" ];

# Use fixed inactive dim value, instead of adjusting according to window opacity.
# inactive-dim-fixed = 1.0

# Specify a list of opacity rules, in the format `PERCENT:PATTERN`, 
# like `50:name *= "Firefox"`. picom-trans is recommended over this. 
# Note we don't make any guarantee about possible conflicts with other 
# programs that set '_NET_WM_WINDOW_OPACITY' on frame or client windows.
# example:
#    opacity-rule = [ "80:class_g = 'URxvt'" ];
#
# opacity-rule = []

#################################
#     Background-Blurring       #
#################################

# Parameters for background blurring, see the *BLUR* section for more information.
# blur-method = 
# blur-size = 12
#
# blur-deviation = false

# Blur background of semi-transparent / ARGB windows. 
# Bad in performance, with driver-dependent behavior. 
# The name of the switch may change without prior notifications.
#
# blur-background = false

# Blur background of windows when the window frame is not opaque. 
# Implies:
#    blur-background 
# Bad in performance, with driver-dependent behavior. The name may change.
#
# blur-background-frame = false

# Use fixed blur strength rather than adjusting according to window opacity.
# blur-background-fixed = false

# Specify the blur convolution kernel, with the following format:
# example:
#   blur-kern = "5,5,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1";
#
# blur-kern = ''
blur-kern = "3x3box";

# Exclude conditions for background blur.
# blur-background-exclude = []
blur-background-exclude = [
  "window_type = 'dock'",
  "window_type = 'desktop'",
  "_GTK_FRAME_EXTENTS@:c"
];

#################################
#       General Settings        #
#################################

# Daemonize process. Fork to background after initialization. Causes issues with certain (badly-written) drivers.
# daemon = false

# Specify the backend to use: `xrender`, `glx`, or `xr_glx_hybrid`.
# `xrender` is the default one.
#
# backend = 'glx'
backend = "glx";

# Enable/disable VSync.
# vsync = false
vsync = true

# Enable remote control via D-Bus. See the *D-BUS API* section below for more details.
# dbus = false

# Try to detect WM windows (a non-override-redirect window with no 
# child that has 'WM_STATE') and mark them as active.
#
# mark-wmwin-focused = false
mark-wmwin-focused = true;

# Mark override-redirect windows that doesn't have a child window with 'WM_STATE' focused.
# mark-ovredir-focused = false
mark-ovredir-focused = true;

# Try to detect windows with rounded corners and don't consider them 
# shaped windows. The accuracy is not very high, unfortunately.
#
# detect-rounded-corners = false
detect-rounded-corners = true;

# Detect '_NET_WM_OPACITY' on client windows, useful for window managers
# not passing '_NET_WM_OPACITY' of client windows to frame windows.
#
# detect-client-opacity = false
detect-client-opacity = true;

# Specify refresh rate of the screen. If not specified or 0, picom will 
# try detecting this with X RandR extension.
#
# refresh-rate = 60
refresh-rate = 0

# Limit picom to repaint at most once every 1 / 'refresh_rate' second to 
# boost performance. This should not be used with 
#   vsync drm/opengl/opengl-oml
# as they essentially does sw-opti's job already, 
# unless you wish to specify a lower refresh rate than the actual value.
#
# sw-opti = 

# Use EWMH '_NET_ACTIVE_WINDOW' to determine currently focused window, 
# rather than listening to 'FocusIn'/'FocusOut' event. Might have more accuracy, 
# provided that the WM supports it.
#
# use-ewmh-active-win = false

# Unredirect all windows if a full-screen opaque window is detected, 
# to maximize performance for full-screen windows. Known to cause flickering 
# when redirecting/unredirecting windows.
#
# unredir-if-possible = false

# Delay before unredirecting the window, in milliseconds. Defaults to 0.
# unredir-if-possible-delay = 0

# Conditions of windows that shouldn't be considered full-screen for unredirecting screen.
# unredir-if-possible-exclude = []

# Use 'WM_TRANSIENT_FOR' to group windows, and consider windows 
# in the same group focused at the same time.
#
# detect-transient = false
detect-transient = true

# Use 'WM_CLIENT_LEADER' to group windows, and consider windows in the same 
# group focused at the same time. 'WM_TRANSIENT_FOR' has higher priority if 
# detect-transient is enabled, too.
#
# detect-client-leader = false
detect-client-leader = true

# Resize damaged region by a specific number of pixels. 
# A positive value enlarges it while a negative one shrinks it. 
# If the value is positive, those additional pixels will not be actually painted 
# to screen, only used in blur calculation, and such. (Due to technical limitations, 
# with use-damage, those pixels will still be incorrectly painted to screen.) 
# Primarily used to fix the line corruption issues of blur, 
# in which case you should use the blur radius value here 
# (e.g. with a 3x3 kernel, you should use `--resize-damage 1`, 
# with a 5x5 one you use `--resize-damage 2`, and so on). 
# May or may not work with *--glx-no-stencil*. Shrinking doesn't function correctly.
#
# resize-damage = 1

# Specify a list of conditions of windows that should be painted with inverted color. 
# Resource-hogging, and is not well tested.
#
# invert-color-include = []

# GLX backend: Avoid using stencil buffer, useful if you don't have a stencil buffer. 
# Might cause incorrect opacity when rendering transparent content (but never 
# practically happened) and may not work with blur-background. 
# My tests show a 15% performance boost. Recommended.
#
# glx-no-stencil = false

# GLX backend: Avoid rebinding pixmap on window damage. 
# Probably could improve performance on rapid window content changes, 
# but is known to break things on some drivers (LLVMpipe, xf86-video-intel, etc.).
# Recommended if it works.
#
# glx-no-rebind-pixmap = false

# Disable the use of damage information. 
# This cause the whole screen to be redrawn everytime, instead of the part of the screen
# has actually changed. Potentially degrades the performance, but might fix some artifacts.
# The opposing option is use-damage
#
# no-use-damage = false
use-damage = true

# Use X Sync fence to sync clients' draw calls, to make sure all draw 
# calls are finished before picom starts drawing. Needed on nvidia-drivers 
# with GLX backend for some users.
#
xrender-sync-fence = true

# GLX backend: Use specified GLSL fragment shader for rendering window contents. 
# See `compton-default-fshader-win.glsl` and `compton-fake-transparency-fshader-win.glsl` 
# in the source tree for examples.
#
# glx-fshader-win = ''

# Force all windows to be painted with blending. Useful if you 
# have a glx-fshader-win that could turn opaque pixels transparent.
#
# force-win-blend = false

# Do not use EWMH to detect fullscreen windows. 
# Reverts to checking if a window is fullscreen based only on its size and coordinates.
#
# no-ewmh-fullscreen = false

# Dimming bright windows so their brightness doesn't exceed this set value. 
# Brightness of a window is estimated by averaging all pixels in the window, 
# so this could comes with a performance hit. 
# Setting this to 1.0 disables this behaviour. Requires --use-damage to be disabled. (default: 1.0)
#
# max-brightness = 1.0

# Make transparent windows clip other windows like non-transparent windows do,
# instead of blending on top of them.
#
# transparent-clipping = false

# Set the log level. Possible values are:
#  "trace", "debug", "info", "warn", "error"
# in increasing level of importance. Case doesn't matter. 
# If using the "TRACE" log level, it's better to log into a file 
# using *--log-file*, since it can generate a huge stream of logs.
#
# log-level = "debug"
log-level = "warn";

# Set the log file.
# If *--log-file* is never specified, logs will be written to stderr. 
# Otherwise, logs will to written to the given file, though some of the early 
# logs might still be written to the stderr. 
# When setting this option from the config file, it is recommended to use an absolute path.
#
# log-file = '/path/to/your/log/file'

# Show all X errors (for debugging)
# show-all-xerrors = false

# Write process ID to a file.
# write-pid-path = '/path/to/your/log/file'

# Window type settings
# 
# 'WINDOW_TYPE' is one of the 15 window types defined in EWMH standard: 
#     "unknown", "desktop", "dock", "toolbar", "menu", "utility", 
#     "splash", "dialog", "normal", "dropdown_menu", "popup_menu", 
#     "tooltip", "notification", "combo", and "dnd".
# 
# Following per window-type options are available: ::
# 
#   fade, shadow:::
#     Controls window-type-specific shadow and fade settings.
# 
#   opacity:::
#     Controls default opacity of the window type.
# 
#   focus:::
#     Controls whether the window of this type is to be always considered focused. 
#     (By default, all window types except "normal" and "dialog" has this on.)
# 
#   full-shadow:::
#     Controls whether shadow is drawn under the parts of the window that you 
#     normally won't be able to see. Useful when the window has parts of it 
#     transparent, and you want shadows in those areas.
# 
#   redir-ignore:::
#     Controls whether this type of windows should cause screen to become 
#     redirected again after been unredirected. If you have unredir-if-possible
#     set, and doesn't want certain window to cause unnecessary screen redirection, 
#     you can set this to `true`.
#
wintypes:
{
  tooltip = { fade = true; shadow = true; opacity = 0.75; focus = true; full-shadow = false; };
  dock = { shadow = false; }
  dnd = { shadow = false; }
  popup_menu = { opacity = 0.8; }
  dropdown_menu = { opacity = 0.8; }
};

Steps of reproduction

  1. Start environment with i3 and picom
  2. Wait for system to put monitors to sleep.
  3. Picom crashes with segfault

Expected behavior

Picom does not crash

Current Behavior

Picom crashes

Stack trace

[1] 14631 segmentation fault (core dumped) picom --experimental-backends

coredumpctl info 14631
PID: 14631 (picom) UID: 1000 (eyoung) GID: 1000 (eyoung) Signal: 11 (SEGV) Timestamp: Thu 2020-09-10 15:57:41 MDT (41min ago) Command Line: picom --experimental-backends Executable: /usr/bin/picom Control Group: /user.slice/user-1000.slice/session-7.scope Unit: session-7.scope Slice: user-1000.slice Session: 7 Owner UID: 1000 (eyoung) Boot ID: b921acecf75e49ea91406c123dddfb96 Machine ID: 21903ef5f2334ab4b8ff6f1232f783f5 Hostname: archphoenix Storage: /var/lib/systemd/coredump/core.picom.1000.b921acecf75e49ea91406c123dddfb96.14631.1599775061000000.zst Message: Process 14631 (picom) of user 1000 dumped core.

            Stack trace of thread 14631:
            #0  0x000055f6201ca1fb n/a (picom + 0x291fb)
            #1  0x000055f6201d0e9f n/a (picom + 0x2fe9f)
            #2  0x000055f6201d5906 n/a (picom + 0x34906)
            #3  0x000055f6201acec9 n/a (picom + 0xbec9)
            #4  0x00007f91e78e7033 ev_invoke_pending (libev.so.4 + 0x5033)
            #5  0x00007f91e78ea902 ev_run (libev.so.4 + 0x8902)
            #6  0x000055f6201ab3d9 n/a (picom + 0xa3d9)
            #7  0x00007f91e734f152 __libc_start_main (libc.so.6 + 0x28152)
            #8  0x000055f6201ac3fe n/a (picom + 0xb3fe)

➜ ~

Other details

tryone144 commented 4 years ago

It's hard to tell what actually caused this since debug symbols are missing. Can you please build picom with debug symbols and provide that stacktrace?

eyoung commented 4 years ago

I have some better logs for you. Using a debug build based on the same commit arch has packaged.

picom: ../src/backend/backend.c:270: void paint_all_new(session_t *, struct managed_win *, _Bool): Assertion `!(w->flags & WIN_FLAGS_SHADOW_NONE)' failed.
#0  0x00007f535e6b3615 in raise () from /usr/lib/libc.so.6
#1  0x00007f535e69c862 in abort () from /usr/lib/libc.so.6
#2  0x00007f535e69c747 in __assert_fail_base.cold () from /usr/lib/libc.so.6
#3  0x00007f535e6abbf6 in __assert_fail () from /usr/lib/libc.so.6
#4  0x000055a16be5733c in paint_all_new (ps=0x55a16ddcdad0, t=0x55a16f4eff80, ignore_damage=false) at ../src/backend/backend.c:270
#5  0x000055a16be1ac76 in _draw_callback (loop=0x7f535ec42720, ps=0x55a16ddcdad0, revents=8192) at ../src/picom.c:1442
#6  0x000055a16be1a131 in draw_callback (loop=0x7f535ec42720, w=0x55a16ddcdb90, revents=8192) at ../src/picom.c:1466
#7  0x00007f535ec36033 in ev_invoke_pending () from /usr/lib/libev.so.4
#8  0x00007f535ec39902 in ev_run () from /usr/lib/libev.so.4
#9  0x000055a16be18487 in session_run (ps=0x55a16ddcdad0) at ../src/picom.c:2325
#10 0x000055a16be15c32 in main (argc=2, argv=0x7ffe0d1f9e18) at ../src/picom.c:2426
tryone144 commented 4 years ago

Thanks. There are multiple issues already with this assertion. However, this assertion hasn't been triggered yet just by blanking the screen. Usually some window is destroyed like in https://github.com/yshui/picom/issues/394.

Can you try if this PR https://github.com/yshui/picom/pull/479 fixes the assertion failure for you? If not, please capture a debug or trace log.

eyoung commented 4 years ago

With that branch I am seeing

picom: ../src/backend/backend.c:268: void paint_all_new(session_t *, struct managed_win *, _Bool): Assertion `!(w->flags & WIN_FLAGS_SHADOW_NONE)' failed.

which seems to be the same assertion error

[ 09/11/2020 10:26:42.687 add_win DEBUG ] Adding window 0x006000f2
[ 09/11/2020 10:26:42.687 ev_handle DEBUG ] event    Event 0 serial 0x0000697e window 0000000000 ""
[ 09/11/2020 10:26:42.687 x_print_error DEBUG ] X error 3 WINDOW request 2 minor 0 serial 26964
[ 09/11/2020 10:26:42.687 ev_handle DEBUG ] event CreateNoti serial 0x00006980 window 0x006000f8 "(Failed to get title)"
[ 09/11/2020 10:26:42.687 add_win DEBUG ] Adding window 0x006000f8
[ 09/11/2020 10:26:42.687 ev_handle DEBUG ] event ConfigureN serial 0x00006980 window 0x0020018d "i3bar for output HDMI-1"
[ 09/11/2020 10:26:42.687 ev_configure_notify DEBUG ] { send_event: 484, id: 0x0020018d, above: 0x0020007c, override_redirect: 1 }
[ 09/11/2020 10:26:42.687 restack_above DEBUG ] Restack 0x0020018d (i3bar for output HDMI-1), old_below: 0x00200082, new_below: 0x0020007c
[ 09/11/2020 10:26:42.687 ev_handle DEBUG ] event ConfigureN serial 0x00006980 window 0x00200199 "i3bar for output DP-2"
[ 09/11/2020 10:26:42.687 ev_configure_notify DEBUG ] { send_event: 484, id: 0x00200199, above: 0x00200072, override_redirect: 1 }
[ 09/11/2020 10:26:42.687 restack_above DEBUG ] Restack 0x00200199 (i3bar for output DP-2), old_below: 0x01200060, new_below: 0x00200072
[ 09/11/2020 10:26:42.687 ev_handle DEBUG ] event PropertyNo serial 0x00006980 window 0x000001e4 "(Root window)"
[ 09/11/2020 10:26:42.687 ev_handle DEBUG ] event PropertyNo serial 0x00006980 window 0x000001e4 "(Root window)"
[ 09/11/2020 10:26:42.687 ev_handle DEBUG ] event    Event 0 serial 0x00006981 window 0000000000 ""
[ 09/11/2020 10:26:42.687 x_print_error DEBUG ] X error 3 WINDOW request 2 minor 0 serial 26964
[ 09/11/2020 10:26:42.687 handle_pending_updates DEBUG ] Delayed handling of events, entering critical section
[ 09/11/2020 10:26:42.688 ev_handle DEBUG ] event ConfigureN serial 0x00006983 window 0x002000dd "src : picom — Konsole"
[ 09/11/2020 10:26:42.688 ev_configure_notify DEBUG ] { send_event: 484, id: 0x002000dd, above: 0x00200088, override_redirect: 1 }
[ 09/11/2020 10:26:42.688 restack_above DEBUG ] Restack 0x002000dd (src : picom — Konsole), old_below: 0x00200088, new_below: 0x00200088
[ 09/11/2020 10:26:42.688 win_set_flags DEBUG ] Set flags 9 to window 0x002000dd (src : picom — Konsole)
[ 09/11/2020 10:26:42.688 win_set_flags DEBUG ] Set flags 9 to window 0x002000dd (src : picom — Konsole)
[ 09/11/2020 10:26:42.688 win_on_factor_change DEBUG ] Window 0x002000dd (src : picom — Konsole) factor change
[ 09/11/2020 10:26:42.688 win_determine_shadow DEBUG ] Determining shadow of window 0x002000dd (src : picom — Konsole)
[ 09/11/2020 10:26:42.688 win_on_factor_change DEBUG ] Window mode changed to 0
[ 09/11/2020 10:26:42.688 win_on_factor_change DEBUG ] Window 0x002000dd (src : picom — Konsole) factor change
[ 09/11/2020 10:26:42.688 win_determine_shadow DEBUG ] Determining shadow of window 0x002000dd (src : picom — Konsole)
[ 09/11/2020 10:26:42.688 win_on_factor_change DEBUG ] Window mode changed to 0
[ 09/11/2020 10:26:42.688 ev_handle DEBUG ] event ConfigureN serial 0x00006983 window 0x03c00007 "src : picom — Konsole"
[ 09/11/2020 10:26:42.688 ev_configure_notify DEBUG ] { send_event: 2097373, id: 0x03c00007, above: 0000000000, override_redirect: 0 }
[ 09/11/2020 10:26:42.689 ev_handle DEBUG ] event UnmapNotif serial 0x00006983 window 0x0020018d "i3bar for output HDMI-1"
[ 09/11/2020 10:26:42.689 unmap_win_start DEBUG ] Unmapping 0x0020018d "i3bar for output HDMI-1"
[ 09/11/2020 10:26:42.689 win_clear_flags DEBUG ] Clear flags 1 from window 0x0020018d (i3bar for output HDMI-1)
[ 09/11/2020 10:26:42.689 ev_handle DEBUG ] event DestroyNot serial 0x00006983 window 0x0020018d "i3bar for output HDMI-1"
[ 09/11/2020 10:26:42.689 destroy_win_start DEBUG ] Destroying 0x0020018d "i3bar for output HDMI-1", managed = 1
[ 09/11/2020 10:26:42.689 win_clear_flags DEBUG ] Clear flags 9 from window 0x0020018d (i3bar for output HDMI-1)
[ 09/11/2020 10:26:42.689 ev_handle DEBUG ] event    Event 0 serial 0x00006984 window 0000000000 ""
[ 09/11/2020 10:26:42.689 x_print_error DEBUG ] X error 3 WINDOW request 2 minor 0 serial 26964
[ 09/11/2020 10:26:42.689 fill_win DEBUG ] Managing window 0x006000f8
[ 09/11/2020 10:26:42.689 fill_win DEBUG ] Managing window 0x006000f2
[ 09/11/2020 10:26:42.689 fill_win DEBUG ] Managing window 0x00a010a6
[ 09/11/2020 10:26:42.689 fill_win DEBUG ] Managing window 0x006000ec
[ 09/11/2020 10:26:42.689 fill_win DEBUG ] Managing window 0x00c00161
[ 09/11/2020 10:26:42.689 win_recheck_client DEBUG ] (0x00200199): client self (override-redirected)
[ 09/11/2020 10:26:42.689 win_on_factor_change DEBUG ] Window 0x00200199 (i3bar for output DP-2) factor change
[ 09/11/2020 10:26:42.689 win_determine_shadow DEBUG ] Determining shadow of window 0x00200199 (i3bar for output DP-2)
[ 09/11/2020 10:26:42.689 win_set_shadow DEBUG ] Updating shadow property of window 0x00200199 (i3bar for output DP-2) to 1
[ 09/11/2020 10:26:42.689 win_set_flags DEBUG ] Set flags 8 to window 0x00200199 (i3bar for output DP-2)
[ 09/11/2020 10:26:42.689 win_on_factor_change DEBUG ] Window mode changed to 2
[ 09/11/2020 10:26:42.690 win_on_factor_change DEBUG ] Window 0x00200199 ([i3 con] container around 0x555857767440) factor change
[ 09/11/2020 10:26:42.690 win_determine_shadow DEBUG ] Determining shadow of window 0x00200199 ([i3 con] container around 0x555857767440)
[ 09/11/2020 10:26:42.690 win_on_factor_change DEBUG ] Window mode changed to 2
[ 09/11/2020 10:26:42.690 win_clear_flags DEBUG ] Clear flags 32 from window 0x00200199 ([i3 con] container around 0x555857767440)
[ 09/11/2020 10:26:42.690 win_recheck_client DEBUG ] (0x00200193): client self (override-redirected)
[ 09/11/2020 10:26:42.690 win_on_factor_change DEBUG ] Window 0x00200193 (i3bar for output DP-0) factor change
[ 09/11/2020 10:26:42.690 win_determine_shadow DEBUG ] Determining shadow of window 0x00200193 (i3bar for output DP-0)
[ 09/11/2020 10:26:42.690 win_set_shadow DEBUG ] Updating shadow property of window 0x00200193 (i3bar for output DP-0) to 1
[ 09/11/2020 10:26:42.690 win_set_flags DEBUG ] Set flags 8 to window 0x00200193 (i3bar for output DP-0)
[ 09/11/2020 10:26:42.690 win_on_factor_change DEBUG ] Window mode changed to 2
[ 09/11/2020 10:26:42.690 win_on_factor_change DEBUG ] Window 0x00200193 ([i3 con] container around 0x55585775bb10) factor change
[ 09/11/2020 10:26:42.690 win_determine_shadow DEBUG ] Determining shadow of window 0x00200193 ([i3 con] container around 0x55585775bb10)
[ 09/11/2020 10:26:42.690 win_on_factor_change DEBUG ] Window mode changed to 2
[ 09/11/2020 10:26:42.690 win_clear_flags DEBUG ] Clear flags 32 from window 0x00200193 ([i3 con] container around 0x55585775bb10)
[ 09/11/2020 10:26:42.690 win_release_pixmap DEBUG ] Releasing pixmap of window 0x002000dd (src : picom — Konsole)
[ 09/11/2020 10:26:42.691 win_bind_pixmap DEBUG ] New named pixmap for 0x002000dd (src : picom — Konsole) : 0x0080012f
[ 09/11/2020 10:26:42.692 glx_find_fbconfig DEBUG ] Looking for FBConfig for RGBA8888, depth 32
[ 09/11/2020 10:26:42.692 glx_bind_pixmap DEBUG ] depth 32, rgba 1
[ 09/11/2020 10:26:42.693 win_clear_flags DEBUG ] Clear flags 2 from window 0x002000dd (src : picom — Konsole)
[ 09/11/2020 10:26:42.693 win_release_shadow DEBUG ] Releasing shadow of window 0x002000dd (src : picom — Konsole)
[ 09/11/2020 10:26:42.696 glx_find_fbconfig DEBUG ] Looking for FBConfig for RGBA8888, depth 32
[ 09/11/2020 10:26:42.697 glx_bind_pixmap DEBUG ] depth 32, rgba 1
[ 09/11/2020 10:26:42.698 win_bind_shadow DEBUG ] New shadow for 0x002000dd (src : picom — Konsole)
[ 09/11/2020 10:26:42.698 win_clear_flags DEBUG ] Clear flags 16 from window 0x002000dd (src : picom — Konsole)
[ 09/11/2020 10:26:42.698 win_clear_flags DEBUG ] Clear flags 9 from window 0x002000dd (src : picom — Konsole)
[ 09/11/2020 10:26:42.698 win_recheck_client DEBUG ] (0x0020018d): client self (override-redirected)
[ 09/11/2020 10:26:42.698 win_clear_flags DEBUG ] Clear flags 32 from window 0x0020018d (i3bar for output HDMI-1)
[ 09/11/2020 10:26:42.698 win_clear_flags WARN ] Flags cleared on a destroyed window 0x0020018d (i3bar for output HDMI-1)
[ 09/11/2020 10:26:42.698 handle_pending_updates DEBUG ] Exited critical section
tryone144 commented 4 years ago

Hmm, same assertion but seems to be a different cause than in the linked issue. It looks as if i3 is destroying the i3bar windows when the screens go to sleep (at least the one on HDMI-1 is destroyed). The ones on DP-0 and DP-2 seem to loose their wintype=dock and therefore gain a shadow which doesn't get created in time.

mtwb47 commented 4 years ago

I'm having the same issue, though I have almost nothing in common outside of using i3 and Arch. I've not tried any debugging or anything since I just installed this fork yesterday. It also doesn't happen every time the monitors go to sleep for me, so it hasn't been a huge issue. Just annoying.

Platform- Arch Linux GPU, drivers, and screen setup RX 580, 2 monitors 1080p, amdgpu Not using i3bar or i3status, but polybar.

Environment

i3-gaps

picom version

vgit-aef1b

Extensions:

Shape: No
XRandR: Yes

Drivers (inaccurate): amdgpu

I can post my config if that is something that is needed, but it's just the default one that comes with this fork with dual-kawase enabled. That's the only change I made.

tryone144 commented 4 years ago

Just for the record: It seems as if win_recheck_client() is called at the end of win_process_image_flags() which is responsible for (re-)creating the shadow images. win_recheck_client() however calls win_mark_client() which in turn calls win_update_wintype(). The wm-containers for the i3bar windows seem to have lost their i3bar child-windows, so their wintype likely changes from dock to normal. Due to the configuration they now should have a shadow and the appropriate flags are set. Later on win_mark_client() calls win_on_factor_change() directly but nothing has changed since the last call. Since this update to the shadow flags happens AFTER we handled (re-)creation of the shadow based on the now outdated flags for this rendering pass, the backend tries to render a shadow that hasn't been created yet.

TL;DR: Currently the shadow-state is re-evaluated after we checked if we have to create the shadow image in win_process_image_flags().

frebib commented 4 years ago

Turns out I can reproduce the assertion crash (#487) pretty easily with TRACE logs turned on, if this helps https://gist.github.com/frebib/aa8d4e6c6d4ea995d89011e5e624f49d/raw with config https://github.com/frebib/dotfiles/blob/master/picom/picom.conf

This happens pretty reliably when I call my dpi script for changing display/application scale on the fly. It changes some X11 things then reloads i3 (i3-msg restart) and polybar (polybar-msg cmd restart -p $MAINPID) https://github.com/frebib/dotfiles/blob/master/scripts/dpi#L28

edit: this is with #479 applied to next HEAD (currently 9bb21fc)

tryone144 commented 4 years ago

Thanks for the TRACE log @frebib. This indeed looks to be the same issue and not directly to be related to https://github.com/yshui/picom/pull/479 (apart from triggering the same assertion).

You can see the polybar window 0x01800002 receiving the unmap event and getting detached from its i3-frame parent 0x01200077. The i3-frame is then flagged as STALE and gets updated by win_recheck_client() as described above. It seems the original polybar window is unmapped, reparented two times and then mapped again, probably due to i3 restarting. Let me see if I can build an automated test case for that.

tryone144 commented 4 years ago

Although I haven't yet been able to create a (not) working automated test case, I could trigger it in a testing environment with i3.

I've updated https://github.com/yshui/picom/pull/479 to check client windows prior to updating the images which should in theory fix this issue without breaking something else. I'd be glad if you could confirm this fixes the crashes you are encountering.

frebib commented 4 years ago

It seems that 24463c3 fixes the crash I was able to reproduce when polybar is unmapped & i3 is restarted, nice work!