Commit Graph

309 Commits

Author SHA1 Message Date
Yuxuan Shui
706acb78b7 backend: gl: handle blur context creation failure
Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2022-11-17 22:16:52 +00:00
Yuxuan Shui
e61b3ea7a3 backend: gl: fix crash when shadow radius is 0
Fixes #927

Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2022-11-17 22:13:22 +00:00
Yuxuan Shui
7d0d693ca7 backend: gl: fix shadow from mask
The intermediate texture used for shadow from mask calculation did not
properly set the min/mag filter to linear, which is required by the blur
methods. Because they use texture interpolation to accelerate
the convolution calculation.

Fixes #916

Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2022-11-11 15:56:39 +00:00
Yuxuan Shui
c1dc11f59c backend: egl: fix resource leak
Destroy context and surface as well in egl_deinit.

Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2022-09-29 19:09:59 +01:00
Yuxuan Shui
5a72b5755d backends: add egl backend
This needs the EGL_KHR_image_pixmap and the GL_EXT_EGL_image_storage
extensions, which unfortunately aren't available on NVIDIA cards.

Don't add documentation for these, for now.

Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2022-09-29 08:03:12 +01:00
Yuxuan Shui
5ac8b7fc56 backend: gl: use gaussian blur for shadow
dual kawase is fast but its blur size is coarse grained, which sometimes
makes the shadow ugly.

Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2022-09-18 05:00:52 +01:00
Yuxuan Shui
483aa4347c backend: allocate mask only when necessary
Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2022-08-31 07:00:59 +01:00
Yuxuan Shui
5d2f8d7456 backend: gl: fix visible seam in shadow at edge of windows
Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2022-08-31 07:00:58 +01:00
Yuxuan Shui
8c14d5354c backend: gl: fix mask being inverted
Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2022-08-31 07:00:55 +01:00
Yuxuan Shui
a29caeaf3d ackend: gl: implement shadow_from_mask
Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2022-08-31 07:00:41 +01:00
Yuxuan Shui
9ac046c2ba backend, win: create shadows with shadow_from_mask
Do this for shaped, and rounded windows.

Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2022-08-26 05:43:19 +01:00
Yuxuan Shui
a9ec614286 backend: add shadow_from_mask based implementation of render_shadow
If the backend implements shadow_from_mask then it doesn't need to
implement render_shadow.

Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2022-08-26 05:43:17 +01:00
Yuxuan Shui
de209fd52c backend: gl: fix x_rect_to_coords when y_inverted is false
Since image_dst is in X coordinates, after flipping Y, we need to
subtract the height of the drawing area, to make it the bottom right
corner for OpenGL.

However, this breaks blur. Because we assumed the drawing area is the
same size as the texture, which is not the case for blur. So add the
height of the drawing area as another parameter.

Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2022-08-26 05:43:12 +01:00
Yuxuan Shui
84407099a9 backend: give backends more flexibility regarding shadow creation
Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2022-08-26 05:42:51 +01:00
Yuxuan Shui
e942f253f7 backend: gl: make blur take a source texture and a target fbo
Instead of always using the back texture/fbo. Also use the size of the
source texture, instead of hard coded back buffer size.

Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2022-08-25 18:07:57 +01:00
Yuxuan Shui
e2d990dc3d backend: gl: split code into multiple files
gl_common.c is getting too big.

Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2022-08-25 13:31:54 +01:00
Yuxuan Shui
137a47261c backend: xrender: handle blur mask
Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2022-08-25 03:47:22 +01:00
Yuxuan Shui
6b7a5dd6cf backend: gl: handle blur mask
Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2022-08-25 03:47:15 +01:00
Yuxuan Shui
e680e8b30d backend: gl: clear up textures
Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2022-08-25 02:59:06 +01:00
Yuxuan Shui
b9d4b8a851 backend: gl: factor out shader code for masking
Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2022-08-25 02:59:05 +01:00
Yuxuan Shui
9e8373e3e0 backend: add mask parameter to blur
Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2022-08-25 02:59:01 +01:00
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