Commit graph

755 commits

Author SHA1 Message Date
Simon Ser
60885c639b render/vulkan: don't use UNDEFINED layout for imported DMA-BUFs
UNDEFINED when used as source layout means that the contents of
the underlying memory becomes undefined. This isn't what we want
here: we don't want to mutate the imported pixel data.

The Vulkan spec isn't really clear what the proper value should be
here, but after discussing with driver developers [1] it seems like
UNDEFINED isn't the right one. The recommendation is to use GENERAL
instead.

[1]: https://github.com/ValveSoftware/gamescope/issues/356

(cherry picked from commit 2c4d3ad12d)
2024-06-11 13:21:05 +00:00
Kirill Primak
e8cf5b1c2a render/vulkan: free render format setups on destroy
(cherry picked from commit 073c3e8837)
2024-06-11 13:21:05 +00:00
Kirill Primak
cdc63d9983 render/vulkan: free pipeline layouts on destroy
(cherry picked from commit e20ae113f8)
2024-06-11 13:21:05 +00:00
Kirill Primak
a198549ef5 render/vulkan: fix texture clip region leak
(cherry picked from commit 00bc75439f)
2024-06-11 13:21:05 +00:00
David Turner
e722e0a14d render/pixman: Fix non-uniform scale with rotation
e08d52bb introduced a bug when rotating by 90 or 270 degrees and doing
non-uniform scaling (different scale factor on X and Y axes).  The scale
factor was calculated as the ratio between the src box and the rotated
dst box.  But scaling is applied after rotation, so the scale factor
should instead be the ratio between rotated src box and dst box.

(cherry picked from commit 34201b0e7f)
2024-06-11 13:13:09 +00:00
David Turner
21cc647816 render/pixman: Improve transform performance
The old code to render transformed textures with pixman would run
composite over the whole output regardless of the texture size.  When
rendering something small this caused a huge performance hit.

Rewrite the transform branch of render_pass_add_texture to:
- Only composite over the rectangle we're drawing to
- Generally try to make things a lot clearer and some comments

Fixes: https://gitlab.freedesktop.org/wlroots/wlroots/-/issues/3832

(cherry picked from commit e08d52bbc6)
2024-06-11 13:13:09 +00:00
David Turner
18b290de21 render/pixman: Fix source crop
Fix source crop in the pixman render backend.  It was being applied by
using a source offset as arguments to pixman_image_composite32().  But
this is wrong because the source crop should get applied before all the
other transforms, not after them (or at least this is how it works in
the other wlroots render backends).  Instead, apply the source crop as
yet another matrix transform when we're doing transforms (Or keep it the
same as previously if there's no other transforming going on).

Closes: https://gitlab.freedesktop.org/wlroots/wlroots/-/issues/3830
(cherry picked from commit ee0007c0f2)
2024-04-26 13:19:22 -04:00
David Turner
e3e84ab87a render/pixman: fix flipped transforms
The translations for flipped offsets were set the same as non-flipped
ones which was totally wrong and meant that any textures with
flipped-transforms rendered entirely outside the viewport and were
basically invisible.

(cherry picked from commit 061b996768)
2024-04-26 13:19:08 -04:00
Biswapriyo Nath
e2cbbf0b4a render/vulkan: Fix clang compiler error in 32 bit ARM Android
This adds proper calling convention attribute for callbacks used in vulkan
and fixes the following compiler error.

../src/render/vulkan/vulkan.c:175:22: error: incompatible function pointer types
initializing 'PFN_vkDebugUtilsMessengerCallbackEXT' (aka 'unsigned int (*)
(enum VkDebugUtilsMessageSeverityFlagBitsEXT, unsigned int, const struct
VkDebugUtilsMessengerCallbackDataEXT *, void *) __attribute__((pcs("aapcs-vfp")))')
with an expression of type 'VkBool32 (*)(VkDebugUtilsMessageSeverityFlagBitsEXT,
VkDebugUtilsMessageTypeFlagsEXT, const VkDebugUtilsMessengerCallbackDataEXT *, void *)'
(aka 'unsigned int (*)(enum VkDebugUtilsMessageSeverityFlagBitsEXT, unsigned int,
const struct VkDebugUtilsMessengerCallbackDataEXT *, void *)')
[-Wincompatible-function-pointer-types]
    .pfnUserCallback = &debug_callback,
                       ^~~~~~~~~~~~~~~

(cherry picked from commit dd2061b073)
2024-04-12 09:34:55 -04:00
Kenny Levinsen
d5117961b4 render/vulkan: Avoid double-free on calloc error
In query_modifier_support, the calloc for either or both of render_mods
and texture_mods may fail, in which case both are freed for convenience.
However, if one is non-NULL, vulkan_format_props_finish will try to free
it again.

NULL them to avoid double-free.

(cherry picked from commit 4d68d3759b)
2024-04-12 09:34:55 -04:00
Guido Günther
d334507dc2 gles2: Avoid crash when glGetInteger64vEXT is missing
The spec for GL_EXT_disjoint_timer_query says

> The GetInteger64vEXT command is required only if OpenGL ES 3.0 or later
> is not supported.

Some GLES 3.2 implementations like the proprietary mali driver on the
rk3566 based OrangePi advertise GL_EXT_disjoint_timer_query but lack
glGetInteger64vEXT. Use glGetInteger64v instead.

(cherry picked from commit 341b3c8bd2)
2024-04-12 09:34:55 -04:00
John Lindgren
d98a3eb492 vulkan: perform sRGB-to-linear conversion correctly for premultiplied values
Pre-multipled sRGB values need to be un-multiplied before conversion
to linear and then re-multiplied after. Compare shaders/texture.frag.

This fixes an issue in labwc where titlebar corners (rendered as
ARGB textures) did not match the rest of the titlebar (rendered as
a solid wlr_scene_rect).
2024-04-07 02:06:04 -04:00
Félix Poisot
e3760fb1b7 render/vulkan: correct sRBG gamma expansion in shader
(cherry picked from commit 5ae8ce807a)
2024-01-26 08:54:16 -05:00
Simon Ser
bb8bcb354e render: disable linux-dmabuf without DRM FD
linux-dmabuf used to not need a DRM FD, however since v4 a DRM FD
is required for the main_device event.

(cherry picked from commit 4ed8df9ab2)
2023-12-04 10:53:32 -05:00
Simon Ser
fcf62ba709 render/egl: fallback to GBM FD if EGLDevice is not available
It's possible that we don't have an EGLDevice if we created the
EGL context from a GBM device. Let's ensure all GPU-accelerated
renderers always have a DRM FD to return by falling back to GBM's
FD.

(cherry picked from commit 395a08f5d1)
2023-12-01 09:55:55 -05:00
Manuel Stoeckl
dbe7fb7027 render/vulkan: undo alpha premult for 8-bpc ARGB/ABGR
When a texel from the Vulkan format VK_FORMAT_B8G8R8A8_SRGB is read,
the sRGB to linear conversion is applied independently to the R, G,
and B channels; the A channel has no influence on this. However,
DRM_FORMAT_ARGB8888 buffers are, per Wayland protocol, not encoded
in this fashion; one must first unpremultiply the color channels
before doing sRGB to linear conversion. This commit switches to
handling ARGB8888 and ABGR8888 formats using the general fragment
shader conversion from electrical to optical values.
2023-11-21 11:08:55 +00:00
JiDe Zhang
8ebfeffdc8 Remove unnecessary code
Not needs set GL_DEPTH_TEST, Because when rendering to a framebuffer
that has no depth buffer, depth testing always behaves as though
the test is disabled, The initial value for each capability with
the exception of GL_DITHER is GL_FALSE.
2023-10-31 15:59:38 +00:00
eri
3232697252 render/vulkan: use VK_KHR_global_priority
References: #3386
2023-10-26 16:17:57 +00:00
Simon Zeni
1c2f608331 render/vulkan: remove unused queue_props in renderer 2023-10-26 15:12:58 +00:00
Brett Ernst
47bf87ade2 renderer/vulkan: don't add two alphas together in blend func 2023-10-21 17:25:46 +00:00
Simon Ser
5adf325333 render/vulkan: undo alpha premult before sRGB encoding/decoding
sRGB encoding/decoding needs to happen with straight alpha, not
pre-multiplied alpha.
2023-10-17 17:28:56 +02:00
Simon Ser
0b15b4a6ae render/allocator: log message when GBM is disabled
When the backend and renderer would need GBM but it's disabled at
compile-time, log a message to make this situation easier to debug.
2023-10-06 09:10:31 +00:00
Simon Ser
db7751f39e render: log error when requested renderer is compile-time disabled
It can be a bit confusing to debug when the user requests an
explicit renderer but it's disabled at build-time. Log an error
when that happens.
2023-10-06 09:10:31 +00:00
Manuel Stoeckl
e0adaaffb6 render/vulkan: constrain blend to output subpass to redrawn region
This commit only applies to the render pass API.
2023-10-05 11:45:32 +00:00
Alexander Orzechowski
d817ebb80f renderer: Don't crash when trying to fallback to pixman
Pixman won't be chosen by default if the system has a valid render node
but gles2 and vulkan creation failed.
2023-10-05 05:14:54 -04:00
Alexander Orzechowski
4f92ecde82 renderer_autocreate_with_drm_fd: Ensure fd isn't bogus 2023-10-05 05:00:44 -04:00
Alexander Orzechowski
1b0694b794 treewide: Migrate from sizeof(struct) to sizeof(*pointer) where practical 2023-10-03 01:51:07 -04:00
Alexander Orzechowski
98a745d926 render/pass: Remove empty box early return 2023-09-21 02:25:34 -04:00
Alexander Orzechowski
e9706e62f5 renderer: Use wlr_render_rect_options_get_box
Fixes: #3697
2023-09-21 02:25:34 -04:00
Alexander Orzechowski
5299d973d5 render/pass: Introduce wlr_render_rect_options_get_box 2023-09-21 02:25:34 -04:00
Manuel Stoeckl
5aea90264f render/vulkan: fix validation error with vkCmdBlitImage
Specfically, VUID-vkCmdBlitImage-srcImage-00247.
2023-09-10 15:28:57 -04:00
Simon Ser
65bbbbbf0c render/vulkan: de-duplicate VkImageUsageFlags
The flags passed to vkCreateImage() must match the flags used when
querying formats. Make this clearer by using the same variable.
2023-09-09 23:32:28 +00:00
Simon Ser
7bf6c1fc6c render/pass: ensure rect has positive size
Ported from wlr_render_rect().
2023-08-24 03:54:36 +00:00
Manuel Stoeckl
a94168b5fe render: ensure wlr_render_rect_options->box is nonempty
This optimization also fixes an validation error with the Vulkan
renderer by ensuring vkCmdClearAttachments does not receive empty
regions.
2023-08-23 18:28:58 +00:00
Simon Ser
11aba53ead render: only open DRM render node if necessary
Only open a render node if we actually need one (ie, if we're about
to attempt GLES2 or Vulkan).
2023-08-23 13:42:07 +02:00
Alexander Orzechowski
ce615a44c0 egl: Don't assume display is owned when KHR_display_reference is unsupported
We could potentially leak a display here, but not really because the
display acts as a singleton that will be returned next time a renderer
of the same device is created.
2023-08-21 15:51:26 +00:00
Alexander Orzechowski
91a1797a96 egl: Remove dead code
Display is always NULL here since egl_init is always last to be called.
2023-08-21 15:51:26 +00:00
Alexander Orzechowski
5f6912595e renderer/vulkan: Defer device lost signal until end of pass
If the compositor were to try to handle a GPU reset within the lost
signal (by recreating the renderer) we should avoid referencing renderer
resources after the lost signal. This prevents use after free for such
compositors.
2023-08-20 21:12:06 -04:00
Alexander Orzechowski
664ec59095 renderer: Sanity check texture source bounds 2023-08-14 08:08:39 +00:00
Simon Ser
c74f89d4f8 Avoid using memcpy() to copy structs
We can just use a regular assignment instead. This is more
type-safe since there is no need to provide the struct size.

The remaining memcpy() calls perform array copies or copies from
void pointers (which may be unaligned).
2023-08-03 14:40:28 +00:00
q234rty
061f5fafbd render/vulkan: use renamed glslang binary by default
glslang 12.3.0 renamed glslangValidator to glslang,
use that by default and use the old name as a fallback.

References: https://github.com/KhronosGroup/glslang/blob/main/CHANGES.md?plain=1#L14
2023-07-27 16:06:49 +08:00
Simon Ser
1205f03ec9 render/gles2: wrap timer setup in push_gles2_debug()
With this, errors should be properly wrapped in the debug scope.
2023-07-12 06:38:02 +00:00
Simon Ser
b7dca21c2b render: constify struct wlr_buffer_pass_options
Let's not allow renderer implementations to mutate the passed in
options.
2023-07-11 18:19:03 +00:00
Simon Ser
fe06e5f49a Use wl_container_of() instead of casts
This slightly improves type safety.

The culprits were found with:

    git grep -E '\([a-z0-9_ ]+ \*\)\W?[a-z]'
2023-07-11 20:16:17 +02:00
Simon Ser
c2c536de03 render/gles2: drop unnecessary cast
We can just refer to the struct field here.
2023-07-11 20:15:45 +02:00
Simon Ser
7a9f8d8d6b Use struct initializers instead of memset()
This is a bit more type-safe.
2023-07-07 17:31:11 +02:00
Alexander Orzechowski
38d451bcb5 render/vulkan: Don't compute texture.has_alpha until first...
...texture view is dynamically created
2023-06-21 11:37:54 -04:00
Alexander Orzechowski
06c0b0a204 render/vulkan: Initialize to fix compilation error 2023-06-19 18:00:26 -04:00
Simon Ser
be73da28b2 allocator: only use DRM auth if we are master
Legacy DRM auth will only work if we are DRM master. Keep using an
unauthenticated DRM FD if we are not DRM master. This should be
enough for GBM.

Closes: https://gitlab.freedesktop.org/wlroots/wlroots/-/issues/3674
2023-06-19 19:36:17 +00:00
Alexander Orzechowski
2044cc2311 render: Introduce wlr_render_texture_options.blend_mode 2023-06-19 13:16:34 -04:00