summaryrefslogtreecommitdiff
path: root/src
AgeCommit message (Collapse)Author
2022-07-30Don't set SourceValidate pointer to NULLMatthieu Herrb
inspired from similar code in amdgpu, fixes a crash when xrandr(1) is invoqued with X server 21.1.1 Signed-off-by: Matthieu Herrb <matthieu.herrb@laas.fr>
2022-07-23radeon_glamor_wrappers.c: Convert from ISO-8859-1 to UTF-8Alan Coopersmith
Allows Flawfinder to analyze source instead of erroring out on encoding Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
2022-04-06Fix spelling/wording issuesAlan Coopersmith
Found by using: codespell --builtin clear,rare,usage,informal,code,names Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
2021-05-10Only include dri.h with older versions of xserverMichel Dänzer
Not needed anymore with current versions.
2021-03-26Guard local variable info only used with glamorMichel Dänzer
Fixes compiler warning with glamor disabled: radeon_dri2.c: In function 'radeon_dri2_exchange_buffers': radeon_dri2.c:732:19: error: unused variable 'info' [-Werror=unused-variable] RADEONInfoPtr info = RADEONPTR(xf86ScreenToScrn(screen)); ^~~~
2021-03-26Guard local variable priv only used with glamorMichel Dänzer
Fixes compile errors with glamor disabled: ../../src/radeon_present.c: In function ‘radeon_present_check_flip’: ../../src/radeon_present.c:281:21: error: invalid use of undefined type ‘struct radeon_pixmap’ 281 | if (priv && priv->fb_failed) | ^~ ../../src/radeon_present.c:288:19: error: invalid use of undefined type ‘struct radeon_pixmap’ 288 | if (priv && !priv->fb_failed) { | ^~ ../../src/radeon_present.c:292:10: error: invalid use of undefined type ‘struct radeon_pixmap’ 292 | priv->fb_failed = TRUE; | ^~
2020-07-13ati: cleanup terminology to use primary/secondaryDave Airlie
The X server changed some API/ABIs here. Based on amdgpu patch by Michel
2020-04-14Fix return value check of drmIoctl()Niclas Zeising
When the drmModeSetCursor2() call was replaced with bare drmIoctl() call in 92df7097, a bug was introduced. With the use of drmModeSetCursor2(), the return value from drmIoctl() (which calls ioctl()) were mangled, if they were negative, they were replaced by -errno by a wrapper function in xf86drMode.c in libdrm. After replacing drmModeSetCursor2() with the call to drmIoctl(), this mangling no longer happens, and we need to explicitly check if the call to drmIoctl() fails, which is indicated by returning -1, and then why it failed, by checking errno. If the error indicated by errno is EINVAL, then we can't use the DRM_IOCTL_MODE_CURSOR2 ioctl(), and need to fall back to the DRM_IOCTL_MODE_CURSOR ioctl(). This bug can manifest itself by an invisible hw cursor on systems where the DRM_IOCTL_MODE_CURSOR2 is not implemented by the graphics driver. Credit also to Alexey Dokuchaev for help with developing the fix and testing. This fixes #190 Signed-off-by: Niclas Zeising <zeising@daemonic.se> Reviewed-by: Michel Dänzer <mdaenzer@redhat.com>
2020-02-10Don't crash X server if GPU acceleration is not availableAlexey Sheplyakov
Commit d1d8e3c8d0a0a0394d395eba171460501745209b causes X server to fail on startup when GPU acceleration is not working (or is disabled). The reason is that `radeon_get_pixmap_bo` function gets called too early (before EXA has been initialized) and fails with an assert: #0 __GI_raise (sig=<optimized out>) at ../sysdeps/unix/sysv/linux/raise.c:50 #1 0x76ab1c6c in __GI_abort () at abort.c:79 #2 0x76ac0b64 in __assert_fail_base (fmt=0x76bfbce4 "%s%s%s:%u: %s%sAssertion `%s' failed.\n%n", assertion=0x7658c80c "key->initialized", file=<optimized out>, line=121, function=0x7658d040 <__PRETTY_FUNCTION__.10607> "dixGetPrivateAddr") at assert.c:92 #3 0x76ac0c0c in __GI___assert_fail (assertion=0x7658c80c "key->initialized", file=0x7658c9d0 "../include/privates.h", line=121, function=0x7658d040 <__PRETTY_FUNCTION__.10607> "dixGetPrivateAddr") at assert.c:101 #4 0x76579e6c in dixGetPrivateAddr (key=<optimized out>, key=<optimized out>, privates=<optimized out>) at ../include/privates.h:121 #5 0x7657a954 in dixGetPrivateAddr (key=<optimized out>, key=<optimized out>, privates=<optimized out>) at exa.c:70 #6 dixGetPrivate (key=<optimized out>, privates=<optimized out>) at ../include/privates.h:136 #7 exaGetPixmapDriverPrivate (pPix=<optimized out>) at exa.c:68 #8 0x7623d460 in radeon_get_pixmap_bo (pPix=0x71c1b8) at radeon.h:804 #9 radeon_get_pixmap_handle (pixmap=0x71c1b8, handle=0x7fa22328) at radeon_bo_helper.c:357 #10 0x76244458 in radeon_pixmap_get_fb (pix=0x71c1b8) at radeon.h:886 #11 drmmode_set_mode_major (crtc=0x691860, mode=0x69191c, rotation=<optimized out>, x=<optimized out>, y=<optimized out>) at drmmode_display.c:918 #12 0x762467e8 in drmmode_set_desired_modes (pScrn=0x67c678, drmmode=<optimized out>, set_hw=1) at drmmode_display.c:3128 #13 0x0047bfa4 in MapWindow (client=0x669ec8, pWin=0x7206c0) at window.c:2722 #14 MapWindow (pWin=0x7206c0, client=0x669ec8) at window.c:2665 #15 0x00449650 in dix_main (argc=3, argv=0x7fa22604, envp=<optimized out>) at main.c:247 #16 0x76ab2198 in __libc_start_main (main=0x42db10 <main>, argc=3, argv=0x7fa22604, init=<optimized out>, fini=0x606434 <__libc_csu_fini>, rtld_fini=0x77229930 <_dl_fini>, stack_end=0x7fa225e0) at libc-start.c:308 #17 0x0042db80 in __start () at ../sysdeps/mips/start.S:110 Don't call `exaGetPixmapDriverPrivate` if the acceleration (EXA) is not enabled [yet] to avoid the problem. Closes: https://gitlab.freedesktop.org/xorg/driver/xf86-video-ati/issues/188 Closes: https://bugzilla.altlinux.org/show_bug.cgi?id=37539
2020-02-10Handle NULL fb_ptr in pixmap_get_fbMichel Dänzer
This can happen when HW acceleration is disabled. Fixes https://gitlab.freedesktop.org/xorg/driver/xf86-video-ati/issues/188
2020-02-05Fix link failure with gcc 10Adam Jackson
Without the 'extern' this looks like a definition not just a declaration, in every file that includes the header. gcc 10 is stricter about this kind of multiple definition. Reviewed-by: Michel Dänzer <mdaenzer@redhat.com>
2019-09-25Don't unreference FBs of pixmaps from different screens in LeaveVTMichel Dänzer
FindClientResourcesByType finds pixmaps from all screens, but trying to process ones from other screens here makes no sense and likely results in a crash or memory corruption. Fixes: 06a465484101 ("Make all active CRTCs scan out an all-black framebuffer in LeaveVT")
2019-09-20Don't set up black scanout buffer if LeaveVT is called from CloseScreenMichel Dänzer
Avoids a crash described in https://gitlab.freedesktop.org/xorg/driver/xf86-video-amdgpu/merge_requests/43#note_223718 (Ported from amdgpu commit 5b8bc9fc505c551dcd9b0ed5ab835a49fa4f9fda) Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
2019-07-18Don't disable page flipping completely with SW cursorMichel Dänzer
Even with SW cursor, page flipping can be used while no X cursor is visible. Occurred to me in the context of xorg/xserver#828. (Ported from amdgpu commit 87f41ace4920fd2069794211683659eb25b025a6)
2019-06-25present: Check that we can get a KMS FB for flippingMichel Dänzer
This can legitimately fail if the pixmap's storage is shared from another device, e.g. when using PRIME render offloading. (Ported from amdgpu commit 7d3fef72e0c871e1677e9e544f4cae5e238b5c52)
2019-06-14Remove dri2_drawable_crtc parameter consider_disabledMichel Dänzer
All callers were passing TRUE. (Ported from amdgpu commit ea19a5207054bb159fc7fb6d88e0ceb10c3da010) Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
2019-06-14dri2: Re-use previous CRTC when possible if pick_best_crtc returns NULLMichel Dänzer
This way, the MSC will continue ticking at the rate of (the last mode which was enabled for) that CRTC, instead of the client running unthrottled. (Ported from amdgpu commit 3109f088fdbd89c2ee8078625d4f073852492656) Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
2019-06-14dri2: reply to client for WaitMSC request in any caseFlora Cui
otherwise client would wait for reply forever and desktop appears hang. Signed-off-by: Flora Cui <flora.cui@amd.com> (Ported from amdgpu commit fb06fb814700a47464abd756e1111dcc76d0d776) Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
2019-05-09dri3: Always flush glamor before sharing pixmap storage with clientsMichel Dänzer
Even if glamor_gbm_bo_from_pixmap / glamor_fd_from_pixmap themselves don't trigger any drawing, there could already be unflushed drawing to the pixmap whose storage we share with a client. (Ported from amdgpu commit 4b17533fcb30842caf0035ba593b7d986520cc85) Acked-by: Alex Deucher <alexander.deucher@amd.com>
2019-04-24Retry get_fb_ptr in get_fbMichel Dänzer
If get_fb_ptr returns NULL, try again after pixmap_get_handle, it should work then. Fixes spurious Present page flipping failures using "normal" pixmaps which aren't shared with direct rendering clients, e.g. with a compositor using the RENDER extension. Bugzilla: https://bugs.freedesktop.org/110417 (Ported from amdgpu commit bf61e6d7ac1a5754b1026d7f80acf25ef622c491) Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
2019-03-15modesetting: add tile property supportDave Airlie
This adds tiling support to the driver, it retrieves the tile info from the kernel and translates it into the server format and exposes the property. (Ported from xserver commits 8fb8bbb3062f1a06621ab7030a9e89d5e8367b35 and 6abdb54a11dac4e8854ff94ecdcb90a14321ab31) (Ported from amdgpu commit 6ee857726166f495abcd68e4ff60e3a09593d079) Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
2019-03-14Use radeon_finish in drmmode_crtc_scanout_updateMichel Dänzer
radeon_glamor_finish only works if we're using glamor, otherwise it'll crash. Fixes: ce7db51020d3 "Cancel pending scanout update in drmmode_crtc_scanout_update" Bug: https://bugs.debian.org/924540 Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
2019-03-08Revert "glamor: Avoid glamor_create_pixmap for pixmaps backing windows"Michel Dänzer
This reverts commit 274703087f80342f51fa69c935bb9a1cb0c4ae47. Reports of visual corruption were bisected to this, e.g. https://bugs.archlinux.org/task/61941 . I can reproduce this with Turks, but not with Bonaire. I assume it's a Mesa/glamor bug, but let's revert for now. Acked-by: Alex Deucher <alexander.deucher@amd.com>
2019-03-04dri2: Call drm_queue_handle_deferred in dri2_deferred_eventMichel Dänzer
drm_queue_handler just puts the event on the signalled list; without calling drm_queue_handle_deferred, actual processing of the event may be delayed indefinitely, e.g. until another event arrives from the kernel. This could result in DRI2 clients hanging during DPMS off. Fixes: ba83a866af5a "Add radeon_drm_handle_event wrapper for drmHandleEvent" (Ported from amdgpu commit 09be74a3d1dd9604336d9a27f98d132b262dcbaf) Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
2019-03-01present: Check that flip and screen pixmap pitches matchMichel Dänzer
If they don't, flipping will result in corrupted display. Test case: * Run Xorg at 1920x1080 with no window manager * glxgears -geometry 2048x1080 The Present extension code in xserver 1.21 will check for this. (Ported from amdgpu commit a636f42b496b0604ca00a144690ece61d1a88a27) Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
2019-02-11Keep waiting for a pending flip if drm_handle_event returns 0Michel Dänzer
drm_wait_pending_flip stopped waiting if drm_handle_event returned 0, but that might have processed only some unrelated DRM events. As long as the flip is pending, we have to keep waiting for its completion event. Noticed while working on the previous fix. (Ported from amdgpu commit 9045fb310f88780e250e60b80431ca153330e61b)
2019-01-28Call drmHandleEvent again if it was interrupted by a signalMichel Dänzer
drmHandleEvent can be interrupted by a signal in read(), in which case it doesn't process any events but returns -1, which drm_handle_event propagated to its callers. This could cause the following failure cascade: 1. drm_wait_pending_flip stopped waiting for a pending flip. 2. Its caller cleared drmmode_crtc->flip_pending before the flip completed. 3. Another flip was attempted but got an unexpected EBUSY error because the previous flip was still pending. 4. TearFree was disabled due to the error. The solution is to call drmHandleEvent if it was interrupted by a signal. We can do that in drm_handle_event, because when that is called, either it is known that there are events ready to be processed, or the caller has to wait for events to arrive anyway. Bugzilla: https://bugs.freedesktop.org/109364 (Ported from amdgpu commit 3ff2cc225f6bc08364ee007fa54e9d0150adaf11)
2019-01-28Only update drmmode_crtc->flip_pending after actually submitting a flipMichel Dänzer
And only clear it if it matches the framebuffer of the completed flip being processed. Fixes (WW) RADEON(0): flip queue failed: Device or resource busy (WW) RADEON(0): Page flip failed: Device or resource busy (EE) RADEON(0): present flip failed due to clobbering drmmode_crtc->flip_pending. Reproducer: Enable TearFree, run warzone2100 fullscreen, toggle Vertical sync on/off under Video Options. Discovered while investigating https://bugs.freedesktop.org/109364 . (Ported from amdgpu commit e72a02ba1d35743fefd939458b9d8cddce86e7f5)
2019-01-28Don't allow TearFree scanout flips to complete in the same vblank periodMichel Dänzer
We were using a relative target of 0, meaning "complete the flip ASAP". This could result in the flip sometimes, but not always completing in the same vertical blank period where the corresponding drawing occurred, potentially causing judder artifacts with applications updating their window contents synchronized to the display refresh. A good way to test this is the vsynctester.com site in a windowed browser, where the judder results in the large "VSYNC" text intermittently appearing red or cyan instead of the expected gray. To avoid this, use a relative target MSC of 1, meaning that if a vertical blank period is in progress, the flip will only complete in the next one. Reported by Julian Tempel and Brandon Wright in https://bugs.freedesktop.org/106175 . (Ported from amdgpu commit a1b479c7d0066c481af920f297d6af9009dda11e)
2019-01-28glamor: Avoid glamor_create_pixmap for pixmaps backing windowsMichel Dänzer
If the compositing manager uses direct rendering (as is usually the case these days), the storage of a pixmap allocated by glamor_create_pixmap needs to be reallocated for sharing it with the compositing manager. Instead, allocate pixmap storage which can be shared directly. (Ported from amdgpu commit bf326f2ea19daa6c8da23d6788ff301ae70b8e69)
2019-01-28dri2: Flush in dri2_create_buffer2 after calling glamor_set_pixmap_boMichel Dänzer
To make sure the client can't use the shared pixmap storage for direct rendering first, which could produce garbage. Bugzilla: https://bugs.freedesktop.org/109235 (Ported from amdgpu commit ebd32b1c07208f8dbe853e089f5e4b7c6a7a658a)
2019-01-28dri3: Flush if necessary in dri3_fd_from_pixmapMichel Dänzer
To make sure the client can't use the shared pixmap storage for direct rendering first, which could produce garbage. Bugzilla: https://bugs.freedesktop.org/109235 (Ported from amdgpu commit d168532ee739f7e33a2798051e64ba445dd3859f)
2019-01-09Only call drmmode_validate_leases if RandR is enabledMichel Dänzer
It would crash if RandR is disabled, e.g. because Xinerama is enabled. Bugzilla: https://bugs.freedesktop.org/109230 Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
2019-01-09Only call drmmode_uevent_init if RandR is enabledMichel Dänzer
There's no point in listening for hotplug events if RandR is disabled, as there's no other mechanism for them to be propagated. We were already mostly ignoring them in that case. Inspired by https://gitlab.freedesktop.org/xorg/driver/xf86-video-intel/commit/1a489142c8e6a4828348cc9afbd0f430d3b1e2d8 (via https://bugs.freedesktop.org/109230#c11). Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
2018-12-28Use two HW cursor buffers per CRTCMichel Dänzer
Switch to the other buffer when xf86_config->cursor changes. Avoids these issues possible when re-using the same buffer: * The HW may intermittently display a mix of the old and new cursor images. * If the hotspot changes, the HW may intermittently display the new cursor image at the location corresponding to the old image's hotspot. Bugzilla: https://bugs.freedesktop.org/108832 (Ported from amdgpu commit 0d60233d26ec70d4e1faa343b438e33829c6d5e4)
2018-12-28Update cursor position in drmmode_show_cursor if hotspot changedMichel Dänzer
The cursor position is updated to be consistent with the new hotspot in the same ioctl call. (Ported from amdgpu commit b04697de5270e8e45744a7025c24df1f454a4cf0)
2018-12-28Use drmIoctl in drmmode_show_cursorMichel Dänzer
This should be functionally equivalent to what drmModeSetCursor(2) do behind the scenes, but allows for new tricks in following changes. (Ported from amdgpu commit b344e1559e936046ef02c777fc4f6bcefa3830bc)
2018-12-28Drop RADEONInfoRec::cursor_bo arrayMichel Dänzer
Not needed or even useful for anything. (Ported from amdgpu commit e95044e45350870fa7e237860e89ade91ac03550)
2018-12-28Automatically try re-enabling TearFree after a flip failedMichel Dänzer
Specifically, after both the page flip and vblank ioctls failed, but then the vblank ioctl started working again. This can happen intermittently e.g. when hotplugging a DP display. Previously, TearFree would stay disabled in that case until a modeset was triggered somehow. Bugzilla: https://bugs.freedesktop.org/103791 (Ported from amdgpu commit bcfa6c258fdf41a9928f8a3c78fc528d0fafee25)
2018-12-28Cancel pending scanout update in drmmode_crtc_scanout_updateMichel Dänzer
drmmode_crtc_scanout_update does the equivalent of a scanout update, so no need to do it again. This might also avoid issues if there's a pending scanout update at this point. (Ported from amdgpu commit 4e7a24ac5a64e402146953ec5850d13c05742116)
2018-12-28Perform scanout buffer update immediately if drmmode_wait_vblank failsMichel Dänzer
Otherwise the damaged screen contents may never be displayed in that case. (Ported from amdgpu commit 500fadb16285146e91f62fce3a0ce1360ca684ba)
2018-12-28Move deferred vblank events to separate drm_vblank_deferred listMichel Dänzer
It was still possible for nested xorg_list_for_each_entry_safe loops to occur over the drm_vblank_signalled list, which could mess up that list. Moving deferred events to a separate list allows processing the drm_vblank_signalled list without xorg_list_for_each_entry_safe. Bugzilla: https://bugs.freedesktop.org/108600 (Ported from amdgpu commit 51ba6dddee40c3688d4c7b12eabeab516ed153b7)
2018-12-28Explicitly keep track of whether a DRM event is for a flip or notMichel Dänzer
When an async flip is performed, and TearFree is enabled on the CRTC used for timing, we schedule a vblank event for completing the page flip. The DRM event queuing code treated this event like a vblank event, but it needs to be treated like a page flip event. (Ported from amdgpu commit e2c7369cae65069aa93eed1c0b678f975ce5c274)
2018-12-28Use drm_abort_one in drm_queue_handlerMichel Dänzer
At this point, we've already established that e->handler is NULL, no need to check again in drm_queue_handle_one. This also makes it clearer what's happening. (Ported from amdgpu commit eda571222f5a6be47f8897e82d85199bb9d95251)
2018-12-28glamor: Can work at depth >= 15 with current xserver Git masterMichel Dänzer
(Ported from amdgpu commit 0734cdf544ffd3f2ac8749ad0e4bf43f8a5cea50)
2018-12-28Skip gamma correction of cursor data if premultiplied R/G/B > alphaMichel Dänzer
The un-premultiplied R/G/B values would overflow the gamma LUT, so just pass through the data unchanged, and leave it up to the HW how to interpret such weird premultiplied alpha pixels. Bugzilla: https://bugs.freedesktop.org/108355 (Ported from amdgpu commit 13c94a373b4858a2d2aa14c22b5f98d53c84c0d9)
2018-12-20Detect and fix up non-premultiplied cursor dataMichel Dänzer
X server >= 1.18 already has code for this, but handle it with older X servers as well. (Ported from amdgpu commits ad6dfb0124860cf67730bde85867f81d9258c84d & 426f9a49655f01863cf4d898f525e5f95984e0c4)
2018-12-18Fix crash when page flipping in multi-X-Screen/Zaphod modeMario Kleiner
radeon_do_pageflip() indexed the flipdata->fb[] array indexing over config->num_crtc, but the flip completion routines, e.g., drmmode_flip_handler(), index that array via the crtc hw id from drmmode_get_crtc_id(crtc). This is mismatched and causes indexing into the wrong array slot at flip completion -> Server crash. Always use drmmode_get_crtc_id(crtc) for indexing into the array to fix this. Tested on a dual-X-Screen setup with one video output assigned to each X-Screen, page-flipping an OpenGL app on either of both X-Screens. This used to crash when flipping on X-Screen 1, now it doesn't anymore. Fixes: 740f0850f1e4 "Store FB for each CRTC in drmmode_flipdata_rec" Reviewed-by: Michel Dänzer <michel.daenzer@amd.com> Signed-off-by: Mario Kleiner <mario.kleiner.de@gmail.com>
2018-10-24Allow up to six instances in Zaphod modeMichel Dänzer
Corresponding to up to six CRTCs being available in the hardware. (Ported from amdgpu commit c9d43c1deb9a9cfc41a8d6439caf46d12d220853)
2018-10-24Make wait_pending_flip / handle_deferred symmetric in set_mode_majorMichel Dänzer
We were always calling the latter, but not always the former, which could result in handling deferred DRM events prematurely. (Ported from amdgpu commit 955373a3e69baa241a1f267e96d04ddb902f689f)