[PATCH xserver 3/5] Xephyr: Check that glamor-xv is usable

Olivier Fourdan ofourdan at redhat.com
Thu Apr 20 15:35:42 UTC 2017


Use glamor_xv_core_init() returned value to disable Xv support early if
glamor-xv is not usable.

Signed-off-by: Olivier Fourdan <ofourdan at redhat.com>
Fixes: https://bugs.freedesktop.org/show_bug.cgi?id=100710
---
 hw/kdrive/ephyr/ephyr.c           | 16 ++++++++++++++--
 hw/kdrive/ephyr/ephyr.h           |  5 +++--
 hw/kdrive/ephyr/ephyr_glamor_xv.c |  7 ++++---
 3 files changed, 21 insertions(+), 7 deletions(-)

diff --git a/hw/kdrive/ephyr/ephyr.c b/hw/kdrive/ephyr/ephyr.c
index 546a76c..8c9b6d4 100644
--- a/hw/kdrive/ephyr/ephyr.c
+++ b/hw/kdrive/ephyr/ephyr.c
@@ -665,7 +665,7 @@ ephyrInitScreen(ScreenPtr pScreen)
 #ifdef XV
     if (!ephyrNoXV) {
         if (ephyr_glamor)
-            ephyr_glamor_xv_init(pScreen);
+            goto out; /* For glamor, we need the screen resources */
         else if (!ephyrInitVideo(pScreen)) {
             EPHYR_LOG_ERROR("failed to initialize xvideo\n");
         }
@@ -675,6 +675,7 @@ ephyrInitScreen(ScreenPtr pScreen)
     }
 #endif /*XV*/
 
+out:
     return TRUE;
 }
 
@@ -728,8 +729,19 @@ ephyrCreateResources(ScreenPtr pScreen)
         if (ephyr_glamor) {
             if (!ephyr_glamor_create_screen_resources(pScreen))
                 return FALSE;
+#ifdef XV
+            /* ephyr_glamor_xv_init() needs GLAMOR screen resources */
+            if (!ephyrNoXV) {
+                if (!ephyr_glamor_xv_init(pScreen)) {
+                    EPHYR_LOG_ERROR("failed to initialize GLAMOR xvideo\n");
+                }
+                else {
+                    EPHYR_LOG("initialized GLAMOR xvideo okay\n");
+                }
+            }
+#endif /*XV*/
         }
-#endif
+#endif /* GLAMOR */
         return ephyrSetInternalDamage(pScreen);
     }
 }
diff --git a/hw/kdrive/ephyr/ephyr.h b/hw/kdrive/ephyr/ephyr.h
index b48a21c..1d64490 100644
--- a/hw/kdrive/ephyr/ephyr.h
+++ b/hw/kdrive/ephyr/ephyr.h
@@ -226,11 +226,12 @@ Bool ephyrInitVideo(ScreenPtr pScreen);
 
 /* ephyr_glamor_xv.c */
 #ifdef GLAMOR
-void ephyr_glamor_xv_init(ScreenPtr screen);
+Bool ephyr_glamor_xv_init(ScreenPtr screen);
 #else /* !GLAMOR */
-static inline void
+static inline Bool
 ephyr_glamor_xv_init(ScreenPtr screen)
 {
+    return FALSE;
 }
 #endif /* !GLAMOR */
 
diff --git a/hw/kdrive/ephyr/ephyr_glamor_xv.c b/hw/kdrive/ephyr/ephyr_glamor_xv.c
index 4dd15cf..dc5f45a 100644
--- a/hw/kdrive/ephyr/ephyr_glamor_xv.c
+++ b/hw/kdrive/ephyr/ephyr_glamor_xv.c
@@ -105,7 +105,7 @@ ephyr_glamor_xv_put_image(KdScreenInfo *screen,
                                id, buf, width, height, sync, clipBoxes);
 }
 
-void
+Bool
 ephyr_glamor_xv_init(ScreenPtr screen)
 {
     KdVideoAdaptorRec *adaptor;
@@ -121,7 +121,8 @@ ephyr_glamor_xv_init(ScreenPtr screen)
     };
     int i;
 
-    glamor_xv_core_init(screen);
+    if (!glamor_xv_core_init(screen))
+        return FALSE;
 
     adaptor = xnfcalloc(1, sizeof(*adaptor));
 
@@ -157,5 +158,5 @@ ephyr_glamor_xv_init(ScreenPtr screen)
     adaptor->PutImage = ephyr_glamor_xv_put_image;
     adaptor->QueryImageAttributes = ephyr_glamor_xv_query_image_attributes;
 
-    KdXVScreenInit(screen, adaptor, 1);
+    return KdXVScreenInit(screen, adaptor, 1);
 }
-- 
2.9.3



More information about the xorg-devel mailing list