aboutsummaryrefslogtreecommitdiff
path: root/backend
AgeCommit message (Collapse)Author
2021-07-09backend/drm: add test_only arg to wlr_drm_interface.crtc_commitSimon Ser
Right now callers of drm_crtc_commit need to check whether the interface is legacy or atomic before passing the TEST_ONLY flag. Additionally, the fallbacks for legacy are in-place in the common code. Add a test_only arg to the crtc_commit hook. This way, there's no risk to pass atomic-only flags to the legacy function (add an assert to ensure this) and all of the legacy-specific logic can be put back into legacy.c (done in next commit).
2021-07-08backend/drm: stop using drm_surface_make_current in drm_surface_blitSimon Ser
drm_surface_make_current and drm_surface_unset_current set implicit state and are an unnecessary mid-layer. Prefer to use directly wlr_renderer_begin_with_buffer, which automatically unsets the back buffer on wlr_renderer_end. I'd like to get rid of drm_surface_make_current once we stop using it for the primary swapchain.
2021-07-08backend/drm: force linear layout for multi-GPU buffersSimon Ser
Some buffers need to be copied across GPUs. Such buffers need to be allocated with a format and modifier suitable for both the source and the destination. When explicit modifiers aren't supported, we were forcing the buffers to be allocated with a linear layout, because implicit modifiers aren't portable across GPUs. All is well with this case. When explicit modifiers are supported, we were advertising the whole list of destination modifiers, in the hope that the source might have some in common and might be able to allocate a buffer with a more optimized layout. This works well if the source supports explicit modifiers. However, if the source doesn't, then wlr_drm_format_intersect will fallback to implicit modifiers, and everything goes boom: the source uses a GPU-specific tiling and the destination interprets it as linear. To avoid this, just force linear unconditionally. We'll be able to revert this once we have a good way to indicate that an implicit modifier isn't supported in wlr_drm_format_set, see [1]. [1]: https://github.com/swaywm/wlroots/pull/2815 Closes: https://github.com/swaywm/wlroots/issues/3030
2021-07-08Fix invalid uses of wl_array_for_eachSimon Ser
[1] and [2] have introduced new wl_array usage in wlroots, but contains a mistake: wl_array_for_each iterates over pointers to the wl_array entries, not over entries themselves. Fix all wl_array_for_each call sites. Name the variables "ptr" to avoid confusion. Found via ASan: ==148752==ERROR: AddressSanitizer: attempting free on address which was not malloc()-ed: 0x602000214111 in thread T0 #0 0x7f6ff2235f19 in __interceptor_free /build/gcc/src/gcc/libsanitizer/asan/asan_malloc_linux.cpp:127 #1 0x7f6ff1c04004 in wlr_tablet_destroy ../subprojects/wlroots/types/wlr_tablet_tool.c:24 #2 0x7f6ff1b8463c in wlr_input_device_destroy ../subprojects/wlroots/types/wlr_input_device.c:51 #3 0x7f6ff1ab9941 in backend_destroy ../subprojects/wlroots/backend/wayland/backend.c:306 #4 0x7f6ff1a68323 in wlr_backend_destroy ../subprojects/wlroots/backend/backend.c:57 #5 0x7f6ff1ab36b4 in multi_backend_destroy ../subprojects/wlroots/backend/multi/backend.c:57 #6 0x7f6ff1ab417c in handle_display_destroy ../subprojects/wlroots/backend/multi/backend.c:124 #7 0x7f6ff106184e in wl_display_destroy (/usr/lib/libwayland-server.so.0+0x884e) #8 0x55cd1a77c9e5 in server_fini ../sway/server.c:218 #9 0x55cd1a77893f in main ../sway/main.c:400 #10 0x7f6ff04bdb24 in __libc_start_main (/usr/lib/libc.so.6+0x27b24) #11 0x55cd1a73a7ad in _start (/home/simon/src/sway/build/sway/sway+0x33a7ad) 0x602000214111 is located 1 bytes inside of 16-byte region [0x602000214110,0x602000214120) freed by thread T0 here: #0 0x7f6ff2235f19 in __interceptor_free /build/gcc/src/gcc/libsanitizer/asan/asan_malloc_linux.cpp:127 #1 0x7f6ff1c04004 in wlr_tablet_destroy ../subprojects/wlroots/types/wlr_tablet_tool.c:24 #2 0x7f6ff1b8463c in wlr_input_device_destroy ../subprojects/wlroots/types/wlr_input_device.c:51 #3 0x7f6ff1ab9941 in backend_destroy ../subprojects/wlroots/backend/wayland/backend.c:306 #4 0x7f6ff1a68323 in wlr_backend_destroy ../subprojects/wlroots/backend/backend.c:57 #5 0x7f6ff1ab36b4 in multi_backend_destroy ../subprojects/wlroots/backend/multi/backend.c:57 #6 0x7f6ff1ab417c in handle_display_destroy ../subprojects/wlroots/backend/multi/backend.c:124 #7 0x7f6ff106184e in wl_display_destroy (/usr/lib/libwayland-server.so.0+0x884e) previously allocated by thread T0 here: #0 0x7f6ff2236279 in __interceptor_malloc /build/gcc/src/gcc/libsanitizer/asan/asan_malloc_linux.cpp:145 #1 0x7f6ff1066d03 in wl_array_add (/usr/lib/libwayland-server.so.0+0xdd03) [1]: https://github.com/swaywm/wlroots/pull/3002 [2]: https://github.com/swaywm/wlroots/pull/3004
2021-07-08backend/x11: send touch frame eventsSimon Ser
2021-07-08backend/wayland: send touch frame eventsSimon Ser
2021-07-08backend/libinput: send touch frame eventsSimon Ser
2021-07-06move wlr_box from /types to /utilSimon Zeni
2021-07-05backend/drm: don't clear pending cursor FB on failed commitSimon Ser
The previous fix tried to side-step cursor->pending_fb completely. However that messes up our buffer locking mechanism. Instead, stop clearing the pending cursor FB on a failed commit. The pending cursor FB will remain for the next commit. Fixes: 6c3d080e25e5 ("backend/drm: populate cursor plane's current_fb")
2021-07-05Revert "backend/drm: populate cursor plane's current_fb"Simon Ser
This reverts commit 6c3d080e25e56404228ad7704eed43e40fa0c623. Populating wlr_drm_plane.current_fb messes up the buffer's locking. The previous buffer is released while it's still being displayed on-screen.
2021-07-05backend/libinput: use wl_array for wlr_libinput_tablet.toolsSimon Ser
Instead of using a single-field wl_list, let's just use a wl_array.
2021-07-01buffer: make enum wlr_buffer_cap publicSimon Ser
Custom backends and renderers need to implement wlr_backend_impl.get_buffer_caps and wlr_renderer_impl.get_render_buffer_caps. They can't if enum wlr_buffer_cap isn't made public.
2021-07-01tablet: stop using wlr_listSimon Ser
2021-07-01backend/libinput: stop using wlr_list internallySimon Ser
2021-07-01Remove unused wlr_list.h includesSimon Ser
2021-06-24backend/drm: rename page_flip_handler to handle_page_flipSimon Ser
This is more consistent with the rest of the wlroots naming.
2021-06-20backend: add output state allow-listsSimon Ser
Right now, when a new output state field is added, all backends by default won't reject it. This means we need to add new checks to each and every backend when we introduce a new state field. Instead, introduce a bitmask of supported output state fields in each backend, and error out if the user has submitted an unknown field. Some fields don't need any backend involvment to work. These are listed in WLR_OUTPUT_STATE_BACKEND_OPTIONAL as a convenience.
2021-06-17backend/session: use DRM_PRIMARY_MINOR_NAMESimon Ser
Instead of hardcoding the string "card", use DRM_PRIMARY_MINOR_NAME. Some systems may use another prefix, e.g. OpenBSD uses "drm" instead.
2021-06-17backend/session: use drmIsKMSSimon Ser
This moves the magic incantation into libdrm and is clearer. See [1] for details. While at it, fixup the doc comment and improve logging. [1]: https://gitlab.freedesktop.org/mesa/drm/-/commit/523b3658aa8efa746417e916c987de23740ce313
2021-06-17backend/drm: populate cursor plane's current_fbSimon Ser
The set_cursor() hook is a little bit special: it's not really synchronized to commit() or test(). Once set_cursor() returns true, the new cursor is part of the current state. This fixes a state where wlr_drm_connector.cursor_enabled is true but there is no FB available. This is triggered by set_cursor() followed by a failed commit(), which resets pending_fb. We should definitely fix the output interface to make the cursor part of the pending state, but that's a more involved change.
2021-06-13backend/drm: remove test_bufferSimon Ser
Instead, call drm_connector_set_pending_fb.
2021-06-13backend/drm: move session check from test_buffer to drm_connector_testSimon Ser
The other caller (drm_connector_commit_state) already checks this.
2021-06-13backend/drm: move drm_connector_set_pending_fb upSimon Ser
This will be used in drm_connector_test shortly.
2021-06-13backend/drm: allocate a CRTC in drm_connector_testSimon Ser
We can't perform a test-only atomic commit if the connector is missing a CRTC.
2021-06-13backend/drm: allocate a CRTC in drm_connector_commit_stateSimon Ser
drm_connector_set_pending_fb needs a CRTC to import the buffer.
2021-06-13backend/drm: introduce drm_connector_alloc_crtcSimon Ser
This function allocates a CRTC for a connector if necessary.
2021-06-13backend/drm: allow committing a buffer and a mode togetherSimon Ser
Set the plane's pending FB before calling drm_connector_set_mode.
2021-06-13backend/drm: use atomic test-only commits for modifier fallbackSimon Ser
Instead of trying to perform a real modeset in init_renderer, perform an atomic test-only commit to find out whether disabling modifiers is necessary because of bandwidth limitations. This decouples init_renderer from the actual commit, making it possible to modeset an output with a user-supplied buffer instead of a black frame. We loose the ability to make sure the buffers coming from the swapchain will work fine when using the legacy interface. This can break i915 when atomic is disabled and modifiers enabled. But i915 always has atomic (so the user must explicitly disable it to run into potential bandwidth limitations) and is the only known problematic driver.
2021-06-09render: drop wlr_ prefix from wlr_renderer_bind_bufferSimon Ser
Make it clear this function is a private wlroots API and will stay that way.
2021-06-09backend/x11: use wlr_renderer_begin_with_buffer for cursorSimon Ser
2021-06-07backend/wayland: remove swapchainSimon Ser
Rely on wlr_output's generic swapchain handling.
2021-06-07backend/wayland: implement get_dmabuf_primary_formatsSimon Ser
2021-06-07backend/x11: remove swapchainSimon Ser
Rely on wlr_output's generic swapchain handling. We still need a renderer for cursor readback, sadly.
2021-06-07backend/x11: implement get_dmabuf_primary_formatsSimon Ser
2021-06-07backend/headless: remove swapchainSimon Ser
Rely on wlr_output's generic swapchain support instead of creating our own. The headless output now simply keeps a reference to the front buffer and does nothing else.
2021-06-02backend/drm: move cursor fields to wlr_drm_connectorSimon Ser
Doesn't make a lot of sense to split the cursor fields between wlr_drm_plane and wlr_drm_connector. Let's just move everything to wlr_drm_connector.
2021-06-02output: take a wlr_buffer in set_cursorSimon Ser
Instead of passing a wlr_texture to the backend, directly pass a wlr_buffer. Use get_cursor_size and get_cursor_formats to create a wlr_buffer that can be used as a cursor. We don't want to pass a wlr_texture because we want to remove as many rendering bits from the backend as possible.
2021-06-02backend/drm: introduce drm_plane_pick_render_formatSimon Ser
This is a new helper function to pick a render format suitable for a plane. The next commit will use it to initialize the cursor multi-GPU surface.
2021-06-02backend/drm: remove format arg from drm_plane_init_surfaceSimon Ser
This was always set to ARGB8888.
2021-06-02backend/drm: implement get_cursor_formats and get_cursor_sizeSimon Ser
2021-06-02backend/wayland: implement get_cursor_formatsSimon Ser
2021-05-31backend: stop using renderer to get the buffer typeSimon Ser
When picking a format, the backend needs to know whether the buffers allocated by the allocator will be DMA-BUFs or shared memory. So far, the backend used the renderer's supported buffer types to guess this information. This is pretty fragile: renderers in general don't care about the SHM cap (they only care about the DATA_PTR one). Additionally, nothing stops a renderer from supporting both DMA-BUFs and shared memory, but this would break the backend's guess. Instead, use wlr_allocator.buffer_caps. This is more reliable since the buffers created with the allocator are guaranteed to have these caps.
2021-05-21backend/x11: use common renderer and allocatorSimon Ser
Instead of managing our own renderer and allocator, let the common code do it.
2021-05-21backend/headless: use common renderer and allocatorSimon Ser
Instead of managing our own renderer and allocator, let the common code do it. Because wlr_headless_backend_create_with_renderer needs to re-use the parent renderer, we have to hand-roll some of the renderer initialization.
2021-05-21backend/wayland: use common renderer and allocatorSimon Ser
Instead of managing our own renderer and allocator, let the common code do it.
2021-05-21backend: automatically create allocatorSimon Ser
Introduce a new backend_get_allocator function that automatically creates an allocator for the backend if the backend has a renderer.
2021-05-21backend: automatically create rendererSimon Ser
If a backend accepts buffers (as indicated by get_buffer_caps) but doesn't implement get_renderer, automatically create a renderer.
2021-05-21backend: introduce wlr_backend_finishSimon Ser
This new functions cleans up the common backend state. While this currently only emits the destroy signal, this will also clean up the renderer and allocator in upcoming patches.
2021-05-17backend/drm: use wlr_texture_from_bufferSimon Ser
2021-04-30backend/drm: Do not require mode commit on enableKenny Levinsen
If a mode is not provided, use the current mode intead. Closes: https://github.com/swaywm/wlroots/issues/2904