aboutsummaryrefslogtreecommitdiff
path: root/backend/drm
AgeCommit message (Collapse)Author
2019-03-21wlr_output: Add preferred property (#1625)Guido Günther
* wlr_output: Indicate modes link * wlr_output: Introduce preferred flag This indicates an outputs preferred mode. * drm: Set preferred flag for an outputs preferred mode
2019-03-05backend/drm: Don't fail on failing to find overlay formatScott Anderson
Some hardware exists which doesn't support XRGB/ARGB overlays, and we aren't even using overlay planes, so don't fail on trying to find a format.
2019-02-24backend/drm: Unset cursor on cleanupScott Anderson
This will prevent the cursor from persisting on the Linux framebuffer terminal on exit.
2019-02-21backend/drm: fix memory leak in realloc crtcsRouven Czerwinski
If *changed_outputs is not supplied by the calling function, track the local allocation with a bool variable and free the allocation at the end of the function.
2019-02-19backend/drm: fix modeset on drm fd resumeBrian Ashworth
On DRM resume, such as switching back to a TTY, the output needs to be modeset to the current mode. However, wlr_output_set_mode will return early when attempting to set the mode to the current mode. This just steps around wlr_output_set_mode and calls drm_connector_set_mode directly.
2019-02-18backend/drm: fix NULL dereference when unsetting cursoremersion
This segfault happens on multi-GPU systems. Fixes https://github.com/swaywm/sway/issues/3717
2019-02-15Merge pull request #1537 from VincentVanlaer/cursor-dmabuf-nouveauDrew DeVault
Add workaround for hardware cursors on nouveau
2019-02-15Add workaround for hardware cursors on nouveauVincent Vanlaer
2019-02-15Revert "drm: do not modeset to current mode"Drew DeVault
This reverts commit 72c76b128e562c482868b42b1945ed49cbd44353.
2019-02-14Copy cursor surface to secondary gpu if necessaryVincent Vanlaer
2019-02-14drm: do not modeset to current modeBrian Ashworth
There is no point in modesetting an output to a mode that it is already set to. Modesetting will cause the output to briefly flicker which is undesirable for a noop. This returns early in `drm_connector_set_mode` when attempting to modeset to the current mode.
2019-02-04Allow cursor render surface to be used as fbVincent Vanlaer
In order for a surface to be used as a cursor plane framebuffer, it appears that requiring the buffer to be linear is sufficient. GBM_BO_USE_SCANOUT is added in case GBM_BO_USE_LINEAR isn't sufficient on untested hardware. Fixes #1323 Removed wlr_drm_plane.cursor_bo as it does not serve any purpose anymore. Relevant analysis (taken from the PR description): While trying to implement a fix for #1323, I found that when exporting the rendered surface into a DMA-BUF and reimporting it with `GBM_BO_USE_CURSOR`, the resulting object does not appear to be valid. After some digging (turning on drm-kms debugging and switching to legacy mode), I managed to extract the following error: ``` [drm:__setplane_check.isra.1 [drm]] Invalid pixel format AR24 little-endian (0x34325241), modifier 0x100000000000001 ``` The format itself refers to ARGB8888 which is the same format as `renderer->gbm_format` used in master to create the cursor bo. However, using `gbm_bo_create` with `GBM_BO_USE_CURSOR` results in a modifier of 0. A modifier of zero represents a linear buffer while the modifier of the surface that is rendered to is `I915_FORMAT_MOD_X_TILED` (see https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/tree/include/uapi/drm/drm_fourcc.h?h=v4.20.6#n263). In order to fix this mismatch in modifier, I added the `GBM_BO_USE_LINEAR` to the render surface and everything started to work just fine. I wondered however, whether the export and import is really necessary. I then decided to test if the back buffer of the render surface works as well, and at least on my hardware (Intel HD 530 and Intel UHD 620) it does. This is the patch in this PR and this requires no exporting and importing. I have to note that I cheated in order to import DMA_BUFs into a cursor bo when doing the first tests, since on import the Intel drivers check that the cursor is 64x64. This is strange since cursor sizes other than 64x64 have been around for quite some time now (https://lists.freedesktop.org/archives/mesa-commit/2014-June/050268.html). Removing this check made everything work fine. I later (while writing this PR) found out that `__DRI_IMAGE_USE_CURSOR` (to which `GBM_BO_USE_CURSOR` translates) has been deprecated in mesa (https://gitlab.freedesktop.org/mesa/mesa/blob/master/include/GL/internal/dri_interface.h#L1296), which makes me wonder what the usecase of `GBM_BO_USE_CURSOR` is. The reason we never encountered this is that when specifying `GBM_BO_USE_WRITE`, a dumb buffer is created trough DRM and the usage flag never reaches the Intel driver directly. The relevant code is in https://gitlab.freedesktop.org/mesa/mesa/blob/master/src/gbm/backends/dri/gbm_dri.c#L1011-1089 . From this it seems that as long as the size, format and modifiers are right, any surface can be used as a cursor.
2019-01-29Require libdrm >= 2.4.95emersion
2019-01-29backend/drm: fix GBM format mismatchemersion
We create the EGL config with GBM_FORMAT_ARGB8888, but then initialize GBM BOs with GBM_FORMAT_XRGB8888. This mismatch confuses Mesa. Instead, we can always use GBM_FORMAT_ARGB8888, and use DRM_FORMAT_XRGB8888 when calling drmModeAddFB2. Fixes https://github.com/swaywm/wlroots/issues/1438
2019-01-19backend/drm: fix state for outputs loosing their CRTCemersion
When there aren't enough CRTCs for all outputs, we try to move a CRTC from a disabled output to an enabled one. When this happens, the old output's state wasn't changed, so the compositor thought it was still enabled and rendering. This commit marks the old output as WLR_DRM_CONN_NEEDS_MODESET and sets its current mode to NULL.
2018-12-23backend/drm: get physical size from libdrmemersion
Values from libdrm are likely more reliable than raw values from the EDID. We were already using values from libdrm, but they were overwritten by parse_edid. See drm.c: wlr_conn->output.phys_width = drm_conn->mmWidth; wlr_conn->output.phys_height = drm_conn->mmHeight;
2018-12-21Standardize the wlr_box input paramatersTimidger
Fixes #1094
2018-12-16backend/drm: don't insert duplicate custom modes, fix refresh rateemersion
2018-12-09backend/drm: Fix uninitialized variableScott Anderson
2018-12-09backend/drm: Improve encoder logicScott Anderson
This fixes an issue that can occur with DP MST connectors not reporting any encoders.
2018-12-09backend/drm: fix disappeared output indicesemersion
This commit changes `scan_drm_connectors` to add new outputs to the end of the list. That way, it's easier to understand what's going on with indices. When we need to destroy outputs, we now walk the list in reverse order. This ensures indices remain correct while iterating and removing items from the list. We now also make outputs without a CRTC disappear (those are in WLR_DRM_CONN_NEEDS_MODESET state).
2018-12-04backend/drm: fix VLA overflowemersion
2018-11-22Fix interlaced mode rejectionRostislav Pehlivanov
2018-11-21Skip interlaced modes during drm mode detectionRostislav Pehlivanov
Fixes #3167 A better solution could be made if there's a need to.
2018-11-04backend/drm: specify minimum config attributesemersion
Since the format used by DRM is GBM_FORMAT_ARGB8888, we need at least a R, G, B and A channel.
2018-10-30Merge pull request #1346 from emersion/fix-schedule-frame-mgpuDrew DeVault
backend/drm: fix frame scheduling on secondary GPUs
2018-10-29backend/drm: fix frame scheduling on secondary GPUsemersion
There was a missing copy_drm_surface_mgpu call in drm_connector_schedule_frame so we asked for a pageflip with an unknown BO, resulting in ENOENT. Additionally, this commit makes schedule_frame return a bool indicating failures. This allows schedule_frame_handle_idle_timer to only set frame_pending to true if a frame has been successfully scheduled. Thus, if a pageflip fails, rendering won't be blocked forever anymore. In case a pageflip is already pending, true is returned because a frame has already been scheduled and will be sent sometime soon.
2018-10-28backend/drm: add WLR_DRM_NO_ATOMIC_GAMMA env variableemersion
This allows the legacy interface to be used instead of atomic if needed. This is a workaround to make some Intel GPUs work (if this variable is unset) as well as to make some AMD GPUs work (if this variable is set).
2018-10-17Increase _POSIX_C_SOURCE to 200112Lsghctoma
CLOCK_MONOTONIC appeared in IEEE Std. 1003.1-200x, it was not part of POSIX.1b (the 1993 version), and FreeBSD treats it accordingly.
2018-10-09backend/drm: don't reset conn->pageflip_pending in drm_connector_cleanupemersion
If a pageflip is pending before cleanup, it's still pending after. This is used line 1177: drm_connector_cleanup is called and conn->pageflip_pending is checked afterwards. Fixes #1297
2018-10-09Merge pull request #1298 from emersion/output-dangling-idle-frameDrew DeVault
output: remove idle_frame event source when destroying output
2018-10-09backend/drm: set drmEventContext version to 2Rouven Czerwinski
As per [1] set drmEventContext version to 2, since wlroots does not use the page_flip_handler2. [1]: https://s-opensource.org/2017/04/12/libdrm-event-handling-youre-probably-wrong/
2018-10-09output: remove idle_frame event source when destroying outputemersion
This prevents the idle event to be activated on a destroyed output. This also makes the backend responsible for free-ing modes, as it is the one allocating them and adding them to the list. Note that the DRM backend (the only one using modes) already frees them.
2018-10-08Merge pull request #1280 from emersion/drm-link-statusScott Anderson
backend/drm: add support for the link-status property
2018-10-07backend/drm: fix zero-length VLAsemersion
2018-10-07backend/drm: properly handle GPUs without CRTCsemersion
2018-10-05output: don't trigger a frame immediately in schedule_frameemersion
This desynchronizes our rendering loop with the vblank cycle. In case a compositor doesn't swap buffers but schedules a frame, emitting a frame event immediately enters a busy-loop. Instead, ask the backend to send a frame when appropriate. On Wayland we can just register a frame callback on our surface. On DRM we can do a no-op pageflip. Fixes #617 Fixes swaywm/sway#2748
2018-10-04output: add presentation refresh predictionemersion
2018-10-04Rename get_present_clock to get_presentation clock, use itemersion
2018-10-04backend: add get_present_clockemersion
2018-10-04output: add present eventemersion
2018-10-04backend/drm: add support for the link-status propertyemersion
2018-10-04Merge pull request #1262 from nyorain/session_fixDrew DeVault
Improve session handling
2018-10-04backend/drm: update EDID manufacturers databaseemersion
2018-10-03backend/drm: reset gamma table on VT switchemersion
2018-10-03output: make gamma size a size_t and gamma table constemersion
2018-09-28backend/drm: don't free connector immediatelyemersion
When a pageflip is pending, we'll get a DRM event for the connector in the future. We don't want to free the connector immediately otherwise we'll use-after-free in the pageflip handler. This commit adds a new state, "DISAPPEARED". This asks the pageflip handler to destroy the output after it's done pageflipping.
2018-09-24Rework session handlingnyorain
Sessions can now be retrieved from a backend in a more general manner. Multi-backend gets back its `session` field that contains the session if one was created, removing the interfacing from multi backend with the drm backend directly. This adds the possibility to use sessions even without the drm backend. It additionally fixes the bug that 2 session objects got created when WLR_BACKENDS were set to "libinput,drm". To allow vt switching without drm backend (and drm fd) on logind, start listening to PropertiesChanged signals from dbus and parse the session "Active" property when no master fd was created (this does not change current drm backend behaviour in any way).
2018-09-18backend/drm: add assertionsemersion
2018-09-15backend/drm: steal CRTCs from disabled outputsemersion
This commit allows outputs that need a CRTC to steal it from user-disabled outputs. Note that in the case there are enough CRTCs, disabled outputs don't loose it (so there's no modeset and plane initialization needed after DPMS). CRTC allocation still prefers to keep the old configuration, even if that means allocating an extra CRTC to a disabled output. CRTC reallocation now happen when enabling/disabling an output as well as when trying to modeset. When enabling an output without a CRTC, we realloc to try to steal a CRTC from a disabled output (that doesn't really need the CRTC). When disabling an output, we try to give our CRTC to an output that needs one. Modesetting is similar to enabling. A new DRM connector field has been added: `desired_enabled`. Outputs without CRTCs get automatically disabled. This field keeps track of the state desired by the user, allowing to automatically re-enable outputs when a CRTC becomes free. This required some changes to the allocation algorithm. Previously, the algorithm tried to keep the previous configuration even if a new configuration with a better score was possible (it only changed configuration when the old one didn't work anymore). This is now changed and the old configuration (still preferred) is only retained without considering new possibilities when it's perfect (all outputs have CRTCs). User-disabled outputs now have `possible_crtcs` set to 0, meaning they can only retain a previous CRTC (not acquire a new one). The allocation algorithm has been updated to do not bump the score when assigning a CRTC to a disabled output.