From: Michel Dänzer <michel.daen...@amd.com>

Calling drmmode_crtc_scanout_allocate in drmmode_crtc_shadow_allocate
resulted in drmmode_crtc_scanout_create called from
drmmode_crtc_shadow_create passing an uninitialized pitch value to
drmmode_create_bo_pixmap.

Fixes issues such as failure to allocate the scanout pixmap or visual
corruption and GPUVM faults when attempting to use rotation with Xorg
<1.19.

Bugzilla: https://bugs.freedesktop.org/99916
Fixes: ea30d856ba5e ("Pass pitch from drmmode_crtc_scanout_allocate to 
drmmode_create_bo_pixmap")
Signed-off-by: Michel Dänzer <michel.daen...@amd.com>
---
 src/drmmode_display.c | 23 +++++++++++++++--------
 1 file changed, 15 insertions(+), 8 deletions(-)

diff --git a/src/drmmode_display.c b/src/drmmode_display.c
index fd22a19ba..560bfae44 100644
--- a/src/drmmode_display.c
+++ b/src/drmmode_display.c
@@ -1194,14 +1194,20 @@ drmmode_show_cursor (xf86CrtcPtr crtc)
                         info->cursor_w, info->cursor_h);
 }
 
+/* Xorg expects a non-NULL return value from drmmode_crtc_shadow_allocate, and
+ * passes that back to drmmode_crtc_scanout_create; it doesn't use it for
+ * anything else.
+ */
 static void *
 drmmode_crtc_shadow_allocate(xf86CrtcPtr crtc, int width, int height)
 {
        drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
-       int pitch;
 
-       return drmmode_crtc_scanout_allocate(crtc, &drmmode_crtc->rotate,
-                                            width, height, &pitch);
+       if (!drmmode_crtc_scanout_create(crtc, &drmmode_crtc->rotate, width,
+                                        height))
+               return NULL;
+
+       return (void*)~0UL;
 }
 
 static PixmapPtr
@@ -1209,11 +1215,12 @@ drmmode_crtc_shadow_create(xf86CrtcPtr crtc, void 
*data, int width, int height)
 {
        drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
 
-       /* Xorg passes in the return value of drmmode_crtc_shadow_allocate
-        * for data, but that's redundant for drmmode_crtc_scanout_create.
-        */
-       return drmmode_crtc_scanout_create(crtc, &drmmode_crtc->rotate, width,
-                                          height);
+       if (!data) {
+               drmmode_crtc_scanout_create(crtc, &drmmode_crtc->rotate, width,
+                                           height);
+       }
+
+       return drmmode_crtc->rotate.pixmap;
 }
 
 static void
-- 
2.11.0

_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

Reply via email to