Commit Graph

288 Commits

Author SHA1 Message Date
Yuxuan Shui
e4221e0787 backend: don't clip corners when painting shadow
When removing shadow behind a window with rounded corners, keep the
corner part - those parts will be removed using the mask instead.

Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2022-08-25 02:51:03 +01:00
Yuxuan Shui
4bf7669ec3 backend: xrender: handle masks
There are some complications, when sampling pixels outside a
xrender picture, xrender doesn't support a behaviour similar to OpenGL's
clamp to border. So we give the masks an extra 1-pixel outer rim, so
we can control what color the outside pixels would be, by using the
"Pad" repeat mode.

Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2022-08-25 02:50:57 +01:00
Yuxuan Shui
56a733840c backend: glx: handle masks
Use masks in compose.

Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2022-08-24 08:39:26 +01:00
Yuxuan Shui
9b419504e8 backend: add the make_mask interface
This is used to create image masks that can be used to mask out
`compose` regions. For example, this can be used to mask out window body
so shadow won't be painted on them.

This could be more efficient than using rectangular regions for masking,
when there are a large number of rectangles; or more flexible, in the
case of window with rounded corners.

Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2022-08-24 08:39:21 +01:00
Yuxuan Shui
e0758eb5e5 backends: glx: fix apply alpha of non y inverted images
This does not ever happen in practice. But conceptually, the GL backend
holds 2 kinds of images: those in GL coordinate system, and those in X
coordinate system. They are differentiated by the `y_inverted` variable,
and applying alpha to them needs differs in whether y needs to be
inverted. Right now we never invert y, because we only ever call apply
alpha on images in the X coordinate system.

Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2022-08-23 10:06:27 +01:00
Yuxuan Shui
a252cbf028 clang-tidy: disable some noisy warnings
Also fix some of the warnings

Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2022-08-23 05:19:06 +01:00
Yuxuan Shui
748cd665f4 backend: glx: fix glx vendor check
Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2022-08-22 10:41:16 +01:00
Yuxuan Shui
83e1cd9a19 backend: add and implement get_shader_attributes
Used for passing back information about whether a shader needs to be
re-rendered every frame.

Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2022-08-11 04:53:14 +01:00
Yuxuan Shui
a1f4cafda4 backend: gl: improve error reporting when creating shaders
Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2022-08-11 04:41:44 +01:00
Yuxuan Shui
eeabf5807e backend: gl: handle custom shader image property
Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2022-08-11 04:41:20 +01:00
Bernd Busse
c95152e83e backend: gl_common: add time uniform to (custom) window shader 2022-08-11 04:41:17 +01:00
Yuxuan Shui
81768f4a11 backend: gl: implement create_shader/destroy_shader 2022-08-11 04:41:12 +01:00
Yuxuan Shui
947077f329 backend: add custom shader image property
Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2022-08-11 04:40:43 +01:00
Yuxuan Shui
f5b40ba10e backend: add shader related APIs
Current this API can only create shader from a single source file. This
could be changed in the future.

Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2022-08-11 04:29:50 +01:00
Yuxuan Shui
f8914dda23 backend: gl: apply postprocessing to border_color
Previously postprocessing is omitted when estimating the color of the
border (e.g. dimming, opacity, inversion, etc.), causing the border to
be drawn with the wrong color.

Related: #770

Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2022-02-13 13:54:25 +00:00
Yuxuan Shui
e63ec3fd16 backend: gl: fix corner being drawn with wrong color
The outer pixels of the corner are drawn with antialiasing, but it color
used for antialiasing is wrong. The estimated border color is used when
there is actually no border.

Related: #770

Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2022-02-13 13:49:45 +00:00
Yuxuan Shui
ea2ba58efd backend: gl: don't fill window with big border_width
If a window's border_width is bigger than its corner_radius, the inner
radius of the border become less than 0, causing the entire window to be
filled.

Fixes #778

Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2022-02-10 07:47:48 +00:00
Yuxuan Shui
01649b68b9 backend: don't trust device_status after a reset
Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2022-02-08 10:31:41 +00:00
Yuxuan Shui
e17eaefb89 backend: handle device reset
Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2022-02-08 10:31:41 +00:00
Yuxuan Shui
a383dc1cdd backend: add new optional API: device_status
This is meant to be used to detect GPU resets.

Implemented in the glx backend using the GL_ARB_robustness extension.

Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2022-02-08 10:31:41 +00:00
Yuxuan Shui
e50be3173f backend: remove the read_pixel interface.
Sample the border color in the shader instead.

Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2022-01-24 17:34:38 +00:00
Yuxuan Shui
ef73668eb9 backend: gl: fix read_pixel
Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2022-01-24 17:34:37 +00:00
Yuxuan Shui
4aac801a12 backend: gl: draw border for rounded windows
Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2022-01-24 17:34:36 +00:00
Yuxuan Shui
b6c14989e1 backend: gl: trivial refactoring
* unifm -> uniform
* add macro for storing uniform locations

Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2022-01-24 17:34:34 +00:00
Yuxuan Shui
b7df820ff2 backend: add new property: BORDER_WIDTH
Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2022-01-24 17:34:33 +00:00
Yuxuan Shui
ffe1b79881 backend: add new property: BORDER_COLOR
Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2022-01-24 17:34:29 +00:00
ktprograms
4dfb979c52 Fix segfaults on 32bit arch with --log-level=debug
There were a few improper uses of %ld for 64 bit numbers, as well as
some other 32 bit related warnings that I've fixed.

Signed-off-by: ktprograms <ktprograms@gmail.com>
2021-11-25 10:52:31 +00:00
Yuxuan Shui
1c7a4ff5a3 backend: xrender: fix clone_image
We were using default_clone_image, but:

1) it's copying the wrong type, xrender_image has an extra member.
2) it doesn't clone the rounded corner cache properly, that has to be
   separately reference counted.

Reported-in: #728
Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2021-11-20 01:27:24 +00:00
Yuxuan Shui
8eb5bb08f8 backend: explicitly initialize corner_radius
Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2021-11-08 00:23:45 +00:00
Yuxuan Shui
ffb8bc5b29 backend: xrender: fix accidentally deleted refcount decrement
Thanks, @tryone144

Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2021-11-08 00:23:36 +00:00
Yuxuan Shui
1dea294051 backend: xrender: cache rounded rectangle mask
xcb_render_triangle is slow because (at least for Glamor) it's
rasterizing the triangles on CPU.

Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2021-10-25 13:48:45 +01:00
Yuxuan Shui
76db8cca06 backend: xrender: handle corner radius
Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2021-10-25 13:46:45 +01:00
Yuxuan Shui
d397b307dd backend: set corner radius property
Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2021-10-23 12:53:17 +01:00
Yuxuan Shui
1fec938740 backend: gl_common: handle corner radius property
Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2021-10-23 12:22:29 +01:00
Yuxuan Shui
de31cd4096 backend: add new image property: corner radius
Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2021-10-23 12:21:52 +01:00
Istvan Petres
de959f910b Fixed ugly dark shadows in case of smaller window than shadow radius. (#695) 2021-09-21 18:01:18 +02:00
Bernd Busse
1dbffec3ae backend: gl: do not use larger-than-screen textures for blur buffers
Blur-texture sampling has been changed to `CLAMP_TO_EDGE` in commit
4b0ff37b36 and to using the buffer
textures at screen position instead of texture origin in commit
89c18afac6.

When using the above approach, expanding the buffer textures by the same
amount as the damage region is not needed anymore, as we cannot render
more than the screen region anyways. Having larger-than-screen buffer
textures might lead to a slight darkening at the upper and right edges
since we don't necessarily trigger the `CLAMP_TO_EDGE` condition in the
intermediate steps. This becomes apparent when using dual-kawase at large
blur-strengths with light backgrounds.

These changes do not affect the general approach of rendering a
larger-than-window region with the blur to accommodate the necessary
increase in damage region.

Related: 6d646b543f
2021-08-16 17:34:19 +02:00
Bernd Busse
4b5cc050d5 Add clip-shadow-above configuration and wintype option
Added the new `clip-shadow-above` configuration and wintype option.
These allow the user to select windows to clip from the shadow region of
other windows, i.e. don't paint shadows on top of them.

This should provide a more useful and userfriendly alternative to the
deprecated `shadow-exclude-reg` option — especially for docks and bars.
2021-07-14 14:43:28 +02:00
yshui
98fe8998c7 Merge pull request #657 from yshui/backend-improvements
Backend improvements
2021-07-14 10:46:52 +01:00
Yuxuan Shui
73c35c20f3 backend: remove unnecessary clone_image calls
No need to clone image to set_image_property, they are only needed for
image_op.

Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2021-07-13 22:14:30 +01:00
Daniel Kwan
976d0740fd Partially revert commit 0efdb6c; use glFinish only for non-NVIDIA 2021-07-10 18:14:20 -04:00
Daniel Kwan
e8147e0658 Set GL_MaxFramesAllowed=1 instead of GL_YIELD=usleep 2021-07-10 18:14:20 -04:00
Yuxuan Shui
d9836a6751 backend: fix NULL dereference when rendering inverted windows
Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2021-07-09 19:15:16 +01:00
Yuxuan Shui
f44d6cd7c1 backend: remove a redundant if
set_image_property is a cheap operation.

Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2021-07-09 19:01:31 +01:00
yshui
049d347f52 Merge pull request #648 from tryone144/fix-pixmap-texture-nvidia
nvidia driver does not support attaching pixmap texture to fbo
2021-07-06 12:44:20 +01:00
Bernd Busse
0c7e237a75 backend: xrender: Force 32-bit ARGB visual for alpha target pixmaps
Force a 32-bit ARGB visual when cloning pixmaps for
`IMAGE_OP_APPLY_ALPHA`.
Fixes non-transparent frames for 24-bit windows (without alpha-channel)
even when using `frame-opacity != 1`.

fixes: #342
2021-06-24 21:49:38 +02:00
Bernd Busse
bf79653fa2 backend: gl_common: Copy texture by explict rendering to framebuffer
At least on nvidia, binding the textures from a glx pixmap to a
framebuffer results in `GL_FRAMEBUFFER_UNSUPPORTED`. Instead of using
binding the source texture to a framebuffer and using `glCopyTexImage2D()`
to copy into a new texture, explicitly render the source texture to the
new texture attached to a framebuffer.

Fixes black/invisible windows on nvidia with `frame-opacity != 1`.

see: #647

related: 2a60836a9b
2021-06-24 18:59:34 +02:00
Bernd Busse
f11710a885 backend: gl_common: Add descriptive checks for framebuffer-completeness
Added more descriptive checks for framebuffer-completeness after adding
attaching textures (for the first time).
Also check for GL errors after `IMAGE_OP_APPLY_ALPHA`.
2021-06-24 18:59:24 +02:00
Bernd Busse
e09679c7cf backend: glx: Fix texture access in max-brightness calculation
Correctly unpack the inner `gl_texture` from the backend image.

related: 2a60836a9b
2021-06-22 22:00:23 +02:00
Yuxuan Shui
710e5fd7a0 backend: remove image operation BAKE
It's not used.

Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2021-06-20 06:59:55 +01:00