yshui / picom

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

inconsistent round borders/corners #683

Closed Delected closed 2 years ago

Delected commented 3 years ago

Platform

Void Linux amd64/x64 Intel Pentium CPU

GPU, drivers, and screen setup

xf86-video-intel-2.99.917.20210115_1

my glxinfo -B:

name of display: :0
display: :0  screen: 0
direct rendering: Yes
Extended renderer info (GLX_MESA_query_renderer):
    Vendor: Intel Open Source Technology Center (0x8086)
    Device: Mesa DRI Mobile Intel® GM45 Express Chipset (CTG) (0x2a42)
    Version: 21.2.1
    Accelerated: yes
    Video memory: 1536MB
    Unified memory: yes
    Preferred profile: compat (0x2)
    Max core profile version: 0.0
    Max compat profile version: 2.1
    Max GLES1 profile version: 1.1
    Max GLES[23] profile version: 2.0
OpenGL vendor string: Intel Open Source Technology Center
OpenGL renderer string: Mesa DRI Mobile Intel® GM45 Express Chipset (CTG)
OpenGL version string: 2.1 Mesa 21.2.1
OpenGL shading language version string: 1.20

OpenGL ES profile version string: OpenGL ES 2.0 Mesa 21.2.1
OpenGL ES profile shading language version string: OpenGL ES GLSL ES 1.0.16

Environment

dwm

picom diagnostics

**Version:** vgit-ee7d9

### Extensions:

* Shape: Yes
* XRandR: Yes
* Present: Present

### Misc:

* Use Overlay: No
  (Another compositor is already running)
* Config file used: None

### Drivers (inaccurate):

Intel

### Backend: glx

[ 09/03/2021 14:15:08.042 glx_init ERROR ] Failed to get GLX context.
 Cannot initialize this backend

Configuration

any configuration where i add round borders and corners generates this error for me.

Expected behavior

I expect the glx and xrender backends to generate the same borders and corners as long as I am not using the experimental backends option.

Current Behavior

when running picom from terminal using the glx backend with rounded corners, i am getting an error [ 09/03/2021 14:20:26.007 glx_init_rounded_corners ERROR ] GLX error at line 567: GL_INVALID_ENUM. If i remove the rounded corners from my config, the error goes away. Note that picom still runs fine even with the error (see video below). I tried using a more sane xrender backend, and there were no glx errors (obviously) in console. the round corners also look much smoother using xrender. the biggest inconsistency is that using xrender the corners of my windows are still square, while my borders stay rounded. this is very hard to put in words so please see the video below (you might need to zoom a little to see the difference.)

youtube video, sorry i could not directly add it to github since it's an ogv file

or screenshots below

using xrender, borders are still square while corners are round: xrender corners

using glx, many things glitch for me. borders are sort of rounded, but it glitches back and forth. you might want to see the video.. also for some reason my scrot is really buggy with picom glx (hence the weird lines.) glx backend

the weirdest part is that even using glx, the corners are still inconsistent. A user on Reddit (also @edencreeper on github) is having the same issue, even on the same display. If you take a look at the linked post, some of the window corners are rounded while others are not. this is very odd... I invite anyone else to expand on this by adding their experiences.

lastly, it is worth noting that this issue persists on ibhawgan's fork of picom too. I just wanted to make sure in case his pr was not fully merged here yet

Delected commented 3 years ago

ok wait i just realized how horrible the video recording is.. maybe not such a great idea to video record on an ancient laptop

let me get some screenshots instead

Delected commented 3 years ago

any comments on this? it's been over a month. i've been using kwin compositing for a little, and i totally forgot about this issue.

thanks for any further update :)

lombervid commented 3 years ago

This happens also to me with both, glx and xrender.

But I have noticed that using glx it only affects, most of the times, the active window: image image

image image

While using xrender it affects all of them: image

Platform

Arch Linux 5.14

GPU, drivers, and screen setup

glxinfo -B ``` display: :0 screen: 0 direct rendering: Yes Extended renderer info (GLX_MESA_query_renderer): Vendor: VMware, Inc. (0x15ad) Device: SVGA3D; build: RELEASE; LLVM; (0x405) Version: 21.2.3 Accelerated: no Video memory: 1MB Unified memory: no Preferred profile: core (0x1) Max core profile version: 4.1 Max compat profile version: 4.1 Max GLES1 profile version: 1.1 Max GLES[23] profile version: 2.0 OpenGL vendor string: VMware, Inc. OpenGL renderer string: SVGA3D; build: RELEASE; LLVM; OpenGL core profile version string: 4.1 (Core Profile) Mesa 21.2.3 OpenGL core profile shading language version string: 4.10 OpenGL core profile context flags: (none) OpenGL core profile profile mask: core profile OpenGL version string: 4.1 (Compatibility Profile) Mesa 21.2.3 OpenGL shading language version string: 4.10 OpenGL context flags: (none) OpenGL profile mask: compatibility profile OpenGL ES profile version string: OpenGL ES 2.0 Mesa 21.2.3 OpenGL ES profile shading language version string: OpenGL ES GLSL ES 1.0.16 ```

Environment

bspwm

picom version

vgit-ad18d

Diagnostics ``` **Version:** vgit-ad18d ### Extensions: * Shape: Yes * XRandR: Yes * Present: Present ### Misc: * Use Overlay: No (Another compositor is already running) * Config file used: /home/lombervid/.config/picom/picom.conf ### Drivers (inaccurate): ### Backend: glx * Driver vendors: * GLX: Mesa Project and SGI * GL: VMware, Inc. * GL renderer: SVGA3D; build: RELEASE; LLVM; * Accelerated: 0 (You are using a software renderer. Unless you are doing this intentionally, this means you don't have a graphics driver properly installed. Performance will suffer. Please fix this before reporting your issue.) ```

Configuration:

Configuration file ``` ################################# # 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; # 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 # Hex string color value of shadow (#000000 - #FFFFFF, defaults to #000000). This option will override options set shadow-(red/green/blue) # shadow-color = "#000000" # 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 list of conditions of windows that should have no shadow painted over, such as a dock window. # clip-shadow-above = [] # 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; # 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 never 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 = [] ################################# # Corners # ################################# # Sets the radius of rounded window corners. When > 0, the compositor will # round the corners of windows. Does not interact well with # `transparent-clipping`. corner-radius = 15 # Exclude conditions for rounded corners. rounded-corners-exclude = [ "window_type = 'dock'", "window_type = 'desktop'", "class_g = 'Polybar'", "class_g = 'firefox'" ]; ################################# # Background-Blurring # ################################# # Parameters for background blurring, see the *BLUR* section for more information. # blur-method = # blur-size = 12 # # blur-deviation = false # # blur-strength = 5 # 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 = true # 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 = "xrender"; 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; # 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. This usually means windows from the same application # will be considered focused or unfocused at the same time. # 'WM_TRANSIENT_FOR' has higher priority if detect-transient is enabled, too. # # detect-client-leader = false # 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 = false # 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. # # clip-shadow-above::: # Controls wether shadows that would have been drawn above the window should # be clipped. Useful for dock windows that should have no shadow painted on top. # # 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; clip-shadow-above = true; } dnd = { shadow = false; } popup_menu = { opacity = 0.8; } dropdown_menu = { opacity = 0.8; } }; ```
Delected commented 3 years ago

yeah, i wonder if any attention will be brought to this

MaybeAnonymous commented 2 years ago

i have the exact same problem

JohnBish commented 2 years ago

Same here

yshui commented 2 years ago

The xrender backend doesn't have the ability to draw rounded borders, sorry.

For the inconsistencies in the glx backend, looks like the border width isn't detected correctly. Can you:

  1. try the experimental backend
  2. run xwininfo on a window that's not rendered correctly. e.g. in your case, an focused window.
MaybeAnonymous commented 2 years ago

i have switched to bspwm and no longer have the problem

gnaqvi commented 2 years ago

Using bspwm 0.9.10-1 and having the same issue. When window loses focus then inner corners are rounded correctly.

gnaqvi commented 2 years ago

Setting use-damage to false fixes the flickering and artifacts for me.

Danila-hub commented 2 years ago

Setting use-damage to false fixes the flickering and artifacts for me.

This method really be useful, thanks!!!

alexcoder04 commented 2 years ago

I am also experiencing the same problem on basically every window on i3wm, use-damage doesn't help

welcoMattic commented 2 years ago

I have the same bug using Manjaro i3 + picom.

Vishvamitra commented 2 years ago

Hello everyone! I'm noticing that nobody has written a post for almost one month but, since I tried picom for the first time today, I'd wish to report the same issue which @Delected pointed out in his first post. I've been experiencing this inconsistency between border and window radius since when I first enabled corner-radius in picom conf today.

Here are a couple of informations on my sistem:

2022-07-17-204958_83x47_scrot

yshui commented 2 years ago

This should've been fixed in experimental glx backend already. The xrender backend does not draw the rounded border, and I don't plan to implement it, as xrender is meant to be a fallback backend anyway.

However if someone want to open a PR they are more than welcome to do so.

Vishvamitra commented 2 years ago

@yshui Unfortunately, the issue still persists even though both glx and --experimental-backends options are enabled.

2022-07-18-111331_63x47_scrot

I was able to get rid of the screen tearing through the glx and the vysnc = true options though, so I'm pretty happy with my setup. I guess I'll disable rounded corners and keep an eye on further developments. Thank you for replying!

eeeXun commented 2 years ago

I solved this by

backend = "glx";

use-damage = false;
yshui commented 2 years ago

@Vishvamitra Are you using the latest git build?

Vishvamitra commented 2 years ago

@eeeXun Unfortunately your suggestion here https://github.com/yshui/picom/issues/683#issuecomment-1186971820 hasn't solved the issue for me.

@yshui I didn't build picom from git: I'm using the default package from Debian Testing repository which corresponds to picom version 9.1-1

yshui commented 2 years ago

@Vishvamitra If you have time can you use apitrace to record a trace of picom?

Vishvamitra commented 2 years ago

@yshui Yes, sure! It's the first time I'm using apitrace though: what command am I supposed to type?

yshui commented 2 years ago

@Vishvamitra There is some instructions here: https://github.com/yshui/picom/wiki/Reporting-issues#capture-a-trace Ask me anything if you need help!

Vishvamitra commented 2 years ago

@yshui I have followed your instructions and I've generated three picom.trace files: I'm uploading the third one, since I ran this tracing on a completely blank workspace and it's the smallest file. I'll upload a .zip file.

picom.trace.zip

yshui commented 2 years ago

@Vishvamitra you didn't enable round corner in your trace?

Vishvamitra commented 2 years ago

@yshui Yeah, I disabled rounded corners. Should I run one more test with rounded-corner radius enabled? I'm sorry, it's my first time using this program.

yshui commented 2 years ago

@Vishvamitra Don't worry about it! I need to enable rounded corner while capturing the trace, so the trace can help me understand what is happening when the corner is rendered.

Vishvamitra commented 2 years ago

Sure! I'll run another test quickly and post the zip here.

Edit: here's the new zip.

picom.trace.zip

yshui commented 2 years ago

@Vishvamitra you weren't using --experimental-backends

Vishvamitra commented 2 years ago

Sorry, I didn't know I was supposed to, since that flag doesn't give me a different result. If I want to run a new test, should I run the following command apitrace trace picom --experimental-backends --log-level=trace?

yshui commented 2 years ago

@Vishvamitra Yes, please remember to enable both --experimental-backends and rounded corners

Vishvamitra commented 2 years ago

@yshui Ok, I've got the zip with the latest test: hopefully this one is fine! Please excuse me for making you waste your time.

picom.trace.zip

yshui commented 2 years ago

@Vishvamitra No worries! Thank you for taking your time to repeat this so many times.

May I ask what WM are you using? What is the xprop and xwininfo output for your terminal window?

Vishvamitra commented 2 years ago

@yshui I should be the one thanking you for the support! I'm using standard i3 as my only window manager and I'm currently using lxterminal. Here's a screenshot with the info of both xprop and xwininfo of my terminal window. 2022-07-18_15:36

While I was waiting for your answer, I was running a couple of tests and I've realized that this problem doesn't occur while using mpv: if you look carefully at this screenshot you will notice that both the inner and the outer window corners are perfectly rounded! 2022-07-18_15:34

What's interesting is that I've enabled the hwdec=auto in mpv config, so I'm wondering if forcing vaapi (which is what mpv is using) on every other program on my desktop will fix this issue.

yshui commented 2 years ago

This is a bug of i3: https://github.com/i3/i3/issues/4292

Vishvamitra commented 2 years ago

This is a bug of i3: i3/i3#4292

Ok, thank you for the clarification. It's strange that the rounded corners are displayed properly in mpv, though.

yshui commented 2 years ago

maybe i3 treated mpv differently, i don't know.

If you want this fixed you should prod the i3 devs.

Vishvamitra commented 2 years ago

If you want this fixed you should prod the i3 devs.

@yshui I'll check their github page and see if any issue about this problem has been opened yet. Even though my knowledge about this topic is quite limited, I can't keep wondering if hardware acceleration should be considered, because mpv is using hardware acceleration and it renders the corners properly.

yshui commented 2 years ago

@Vishvamitra

if any issue about this problem has been opened yet.

I linked the issue in my comment above.

Vishvamitra commented 2 years ago

Yes, I've just noticed. Thank you!

ZyxerZyxani commented 9 months ago

I solved this by

backend = "glx";

use-damage = false;

This solved it for me. Thanks so much! The issue for me was somewhat different than described here tho'. Firefox had rounded corners as well as dwm status bar. However, kitty had no rounded corners and neither did st. I found the solution before I had time to do more testing, but it seems no terminal would get the rounded corners.

I am on dwm, linux void.

ciceropaulino commented 4 months ago

I solved this by

backend = "glx";

use-damage = false;

This works for me in Debian 12