Commit Graph

2065 Commits

Author SHA1 Message Date
Yuxuan Shui
8e1f3c92f5 core: factor out code for estimating the rendering time budget
Add a render_statistics type to encapsulate all the statistics done on
rendering times. And use that to estimate the time budget for rendering
and frame pacing.

Tweak the rolling window utilities a bit so we can reuse one rolling
window for multiple statistics.

Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2023-06-10 14:33:24 +01:00
Yuxuan Shui
336cb0917a core: check we have both frame time and render time before pacing
We only checked render time. If we don't have frame time estimates, we
would divide by zero and end up with wild scheduling delays.

Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2023-06-08 20:35:33 +01:00
Yuxuan Shui
fcb9dc8cfd core: make sure unredirection happens when screen is off
So when the screen is off, we calls queue_redraw, hoping draw_callback
will be called and unredirects the screen. However, queue_redraw doesn't
queue another redraw when one is already queued. Redraws can be queued
in two ways: one is timer based, which is fine, because it will be
triggered no matter what; the other is frame based, which is triggered
by Present events.

When the screen is off, X server, depends on the driver, could send
abnormal Present events, which we ignore. But that also means queued
frame based redraw will stop being triggered.

Those two factors combined means sometimes unredirection does not happen
when the screen is off. Which means we aren't going to free the GL
context, which are still receiving Present events, but can't handle
them, because we are not rendering anything with GL. In the end all
these causes memory usage to balloon, until the screen is turned on and
we start rendering again.

And all these is not caught by leak checkers because this technically is
not a leak, as everything is eventually freed.

Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2023-06-08 20:35:31 +01:00
Yuxuan Shui
edeb17ad46 core: don't fully trust msc from present complete notify
Sometimes X sends bogus complete notifies with invalid msc number.
Instead use a saved msc number to get the next complete notify.

Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2023-06-08 20:35:30 +01:00
Yuxuan Shui
1899ef0d49 core: only check present timer alignment in the first frame
Timer can sometimes drift randomly, like when the system is suspended.
we don't want to disable frame pacing for that

Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2023-06-08 20:35:29 +01:00
Yuxuan Shui
480fd24da6 core: stop sending NotifyMsc if frame pacing is disabled
Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2023-06-08 20:35:28 +01:00
Yuxuan Shui
a4fae2b60a core: better frame pacing function
Details explained in the comments on schedule_render().

Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2023-06-08 20:35:26 +01:00
Yuxuan Shui
47ffaf0a38 core: workaround X present event quirk
When the screen turns off, X sometimes sends present complete notify for
the same frame multiple times, or even events with invalid msc/ust
number.

This will cause us to ignore it and not send a subsequent NotifyMsc
request, causing the complete notify to stop.

Now we send NotifyMsc regardless to keep the events going.

Also detect when the complete notifies skip frames, divide the interval
by frame count to estimate frame time in that case.

Upstream bug report:
https://gitlab.freedesktop.org/xorg/xserver/-/issues/1418

Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2023-06-08 20:35:25 +01:00
Yuxuan Shui
86d3739374 core: frame pacing
Use frame timing and render time statistic to pace frames.

Right now the criteria are simple:

* Don't render multiple frames in one vblank cycle. Otherwise the
  rendered frame will be delay multiple cycles, which isn't ideal.
* Start rendering as late as possible while still hitting vblank.

Refresh rate is estimated from a rolling average of frame timing. Render
time is predicted from the rolling maximum of past 128 frames. The
window size still needs to be investigated.

Remove glFinish calls and GL_MaxFramesAllowed=1, frame pacing superseeds
them.

Professionals might laugh at how rudimentary this is, but hopefully this
is better than what we had before. Which is absolutely nothing at all.

Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2023-06-08 20:35:24 +01:00
Yuxuan Shui
2a4e32babf backend: add last_render_time interface.
Used for querying how long render takes to complete, used for frame
pacing.

Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2023-06-08 20:35:23 +01:00
Yuxuan Shui
64a97b57b5 core: collect frame timing information.
Needed to estimate refresh rate, and for us to stay in phase with
vblank.

Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2023-06-08 20:35:21 +01:00
Yuxuan Shui
62fcfe5d1a backend: remove unused parameter 'ignore_damage'
Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2023-06-08 20:35:16 +01:00
Yuxuan Shui
3aed5599c3 glx: calculate residual in both directions
We only considered residual in the positive direction, i.e. we would set
dithering to zero if the color is (whole number + 0.0001). But we should
also set dithering to zero if color is (whole number - 0.0001).

Fixes #1064
2023-05-08 15:01:50 +01:00
Arda Atci
dc9d1fe248 Merge branch 'yshui:next' into next 2023-04-01 23:12:29 +03:00
Yuxuan Shui
05ef18d78f Merge pull request #1044 from yshui/alanpq 2023-04-01 11:32:30 +01:00
Yuxuan Shui
379f67f5c2 tests: add corner-radius-rules to the parsing test
Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2023-04-01 11:27:05 +01:00
oofsauce
6d459badbc Add corner-radius-rules configuration option
This option accepts a list of patterns and overrides the corner radii of
matching windows

Authored-by: oofsauce <alanpanayotov@gmail.com>
Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2023-04-01 11:26:10 +01:00
Yuxuan Shui
838f1f097c Merge pull request #1023 from absolutelynothelix/xrescheck-xcb-render-pictures-test 2023-03-30 09:06:37 +01:00
Arda Atci
1c7466c07c pos fix 2023-02-15 17:29:55 +03:00
Arda Atci
44cfa0b0ef randr_mon position fix 2023-02-14 23:24:51 +03:00
Maxim Solovyov
ce7758a07b backend: fix leak in default_backend_render_shadow 2023-02-13 03:36:00 +03:00
Arda Atci
bb2b4801f7 randr anim fix 2023-02-06 23:12:45 +03:00
Arda Atci
36e6b73cde randr extension 2023-02-04 23:10:18 +03:00
Arda Atci
90f57e9b1a shadow fix 2023-02-04 15:40:21 +03:00
Arda Atci
157ecd2077 shadow fix 2023-02-04 07:11:23 +03:00
Arda Atci
3a791ab559 Merge branch 'next' into nextt
Some checks failed
coding-style / check (push) Has been cancelled
2023-02-04 07:10:45 +03:00
Arda Atci
f5e8351507 shadow fix 2023-02-04 07:09:20 +03:00
Arda Atci
9f14c43989 Merge pull request #18 from yshui/next
merge yshui/next
2023-02-04 05:49:58 +03:00
Yuxuan Shui
cee1287562 github: update git-clang-format-lint action
Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2023-01-29 16:23:26 +00:00
Yuxuan Shui
317275abf6 Merge pull request #995 from absolutelynothelix/begone-xinerama 2023-01-29 15:36:04 +00:00
Maxim Solovyov
986b3c1cb3 core: drop xinerama
there are two x extensions for working with monitors (especially
multiple): xinerama and randr. xinerama is old, feature-poor and in
general isn't used anymore compared to the randr: new, feature-rich and
widely-used. for some reason we were using both of them, so let's drop
xinerama to keep things simple, clean and small. and to be modern.

the drop was done in three steps:
* first step was to replace all the xinerama-based code with the
  randr-based one and to replace or remove all the xinerama mentions;
* second step was to replace the xinerama's terminology with the
  randr's one. xinerama was referring only to the word "screen", while
  randr refers to multiple words and i think the word "monitor" is the
  most suitable for us and, hopefully, clear both to a contributor and
  to an end user;
* third step was to refactor the new randr-based code if needed and to
  address related todo's (mostly about moving related functions
  elsewhere).

all the steps were done well except addressing a leftover todo about
moving the win_update_monitor function to the x.c which wasn't done.

the xinerama-shadow-crop option was renamed to crop-shadow-to-monitor,
but it's previous name is still accepted, has effect and the
deprecation message is printed to preserve backwards-compatibility.
2023-01-29 10:51:12 +03:00
Yuxuan Shui
102a0bc5e0 backend: mask can be null in blur()
Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2023-01-29 06:35:28 +00:00
Arda Atci
97d9c960e0 animations added, picom upstreamed yshui/next 2023-01-23 07:36:50 +03:00
Arda Atci
d41a291fd6 fix lerping on shadows, closes #4 2023-01-23 07:34:35 +03:00
Arda Atci
c3a7cf29ab AUR pkg, closes #15, thanks fxzzi 2023-01-23 07:34:35 +03:00
Arda Atci
3b1930d2c6 fixed open window type anim, closes #12 2023-01-23 07:34:35 +03:00
Yuxuan Shui
92a32808ae doc: list cases that trigger unredirect
unredir-if-possible doesn't just happen for fullscreen windows, be more
accurate.

Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2023-01-23 07:34:35 +03:00
Maxim Solovyov
d3c467f4c0 opengl: fix segfault in ensure_glx_context 2023-01-23 07:34:35 +03:00
Maxim Solovyov
4be96a92c7 backend: egl: fix creating eglpixmap
according to the specification of the EGL_KHR_image_pixmap extension,
if target is EGL_NATIVE_PIXMAP_KHR then ctx must be EGL_NO_CONTEXT,
otherwise, the EGL_BAD_PARAMETER error is generated. source:
https://registry.khronos.org/EGL/extensions/KHR/EGL_KHR_image_pixmap.txt

fixes #981
2023-01-23 07:34:35 +03:00
Maxim Solovyov
ab766b6386 picom: fix xcb_request_check memory leaks 2023-01-23 07:34:35 +03:00
Maxim Solovyov
7e975cdc5d picom: free root image properly
fixes #982
2023-01-23 07:34:35 +03:00
Maxim Solovyov
349f2f37db backend: egl: simplify getting a framebuffer configuration
we're using the first available framebuffer configuration that
meets our needs so there is no need to ask for more than one
2023-01-23 07:34:35 +03:00
Maxim Solovyov
7846b17c54 use _checked functions with xcb_request_check 2023-01-23 07:34:35 +03:00
Maxim Solovyov
a667886959 xrender: make corner-radius respect inactive-dim
for the new xrender backend it's enough to clip with a rounded rectangle after dimming, not before

partially fixes #867
2023-01-23 07:34:35 +03:00
Maxim Solovyov
6c08650f3c xrender: fix leak in release_rounded_corner_cache
calling wrong free function did nothing and produced ton of x errors

fixes at least #892
2023-01-23 07:34:35 +03:00
Maxim Solovyov
7f533c0b23 xrender: fix leak in deinit
and check should we actually free something

fixes at least #960
2023-01-23 07:34:35 +03:00
Maxim Solovyov
efa3d9c227 xrender: fix leak in bind_pixmap 2023-01-23 07:34:35 +03:00
Maxim Solovyov
0b965b2e5a x: fix leak in x_create_picture_with_pictfmt_and_pixmap 2023-01-23 07:34:35 +03:00
Yuxuan Shui
ba2e24af3e core: detect screen off
Use the DPMS extension to detect if screen is turned off, and unredirect
if it is. This also helps working around the problem where OpenGL
buffers lose data when screen is turned off, causing screen to flicker
later when it turns back on if use-damage is enabled.

Unfortunately the DPMS extension doesn't define an event, so we have to
periodically poll the screen state.

Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2023-01-23 07:34:35 +03:00
Yuxuan Shui
0278a1fb0b backend: xrender: fix using of invalid picture when vsync is disabled
Fixes #974

Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2023-01-23 07:34:35 +03:00