[PATCH xf86-video-ati 01/15] Propagate failure from radeon_set_pixmap_bo

Michel Dänzer michel at daenzer.net
Wed Sep 21 09:50:40 UTC 2016


From: Michel Dänzer <michel.daenzer at amd.com>

(Ported from amdgpu commits c315c00e44afc91a7c8e2eab5af836d9643ebb88
 and 0d42082108c264568e2aadd15ace70e72388bc65)

Signed-off-by: Michel Dänzer <michel.daenzer at amd.com>
---
 src/drmmode_display.c  | 30 ++++++++++++++++++------------
 src/radeon.h           | 14 +++++++++-----
 src/radeon_bo_helper.c | 16 +++++++++++-----
 src/radeon_kms.c       |  3 ++-
 4 files changed, 40 insertions(+), 23 deletions(-)

diff --git a/src/drmmode_display.c b/src/drmmode_display.c
index a8d4386..89922d6 100644
--- a/src/drmmode_display.c
+++ b/src/drmmode_display.c
@@ -126,12 +126,11 @@ static PixmapPtr drmmode_create_bo_pixmap(ScrnInfoPtr pScrn,
 
 	if (!(*pScreen->ModifyPixmapHeader)(pixmap, width, height,
 					    depth, bpp, pitch, NULL)) {
-		return NULL;
+		goto fail;
 	}
 
 	if (!info->use_glamor)
 		exaMoveInPixmap(pixmap);
-	radeon_set_pixmap_bo(pixmap, bo);
 	if (info->ChipFamily >= CHIP_FAMILY_R600) {
 		surface = radeon_get_pixmap_surface(pixmap);
 		if (surface && psurf) 
@@ -163,22 +162,25 @@ static PixmapPtr drmmode_create_bo_pixmap(ScrnInfoPtr pScrn,
 				surface->flags |= RADEON_SURF_SET(RADEON_SURF_MODE_2D, MODE);
 			}
 			if (radeon_surface_best(info->surf_man, surface)) {
-				return NULL;
+				goto fail;
 			}
 			if (radeon_surface_init(info->surf_man, surface)) {
-				return NULL;
+				goto fail;
 			}
 		}
 	}
 
-	if (info->use_glamor &&
-	    !radeon_glamor_create_textured_pixmap(pixmap,
-						  radeon_get_pixmap_private(pixmap))) {
-		pScreen->DestroyPixmap(pixmap);
-	  	return NULL;
-	}
+	if (!radeon_set_pixmap_bo(pixmap, bo))
+		goto fail;
 
-	return pixmap;
+	if (!info->use_glamor ||
+	    radeon_glamor_create_textured_pixmap(pixmap,
+						 radeon_get_pixmap_private(pixmap)))
+		return pixmap;
+
+fail:
+	pScreen->DestroyPixmap(pixmap);
+	return NULL;
 }
 
 static void drmmode_destroy_bo_pixmap(PixmapPtr pixmap)
@@ -2121,7 +2123,6 @@ drmmode_xf86crtc_resize (ScrnInfoPtr scrn, int width, int height)
 		goto fail;
 
 	if (!info->r600_shadow_fb) {
-		radeon_set_pixmap_bo(ppix, info->front_bo);
 		psurface = radeon_get_pixmap_surface(ppix);
 		*psurface = info->front_surface;
 		screen->ModifyPixmapHeader(ppix,
@@ -2145,6 +2146,11 @@ drmmode_xf86crtc_resize (ScrnInfoPtr scrn, int width, int height)
 	if (info->use_glamor)
 		radeon_glamor_create_screen_resources(scrn->pScreen);
 
+	if (!info->r600_shadow_fb) {
+		if (!radeon_set_pixmap_bo(ppix, info->front_bo))
+			goto fail;
+	}
+
 	/* Clear new buffer */
 	gc = GetScratchGC(ppix->drawable.depth, scrn->pScreen);
 	force = info->accel_state->force;
diff --git a/src/radeon.h b/src/radeon.h
index 590966f..c914a58 100644
--- a/src/radeon.h
+++ b/src/radeon.h
@@ -678,7 +678,7 @@ static inline struct radeon_surface *radeon_get_pixmap_surface(PixmapPtr pPix)
 
 uint32_t radeon_get_pixmap_tiling(PixmapPtr pPix);
 
-static inline void radeon_set_pixmap_bo(PixmapPtr pPix, struct radeon_bo *bo)
+static inline Bool radeon_set_pixmap_bo(PixmapPtr pPix, struct radeon_bo *bo)
 {
 #ifdef USE_GLAMOR
     RADEONInfoPtr info = RADEONPTR(xf86ScreenToScrn(pPix->drawable.pScreen));
@@ -688,11 +688,11 @@ static inline void radeon_set_pixmap_bo(PixmapPtr pPix, struct radeon_bo *bo)
 
 	priv = radeon_get_pixmap_private(pPix);
 	if (priv == NULL && bo == NULL)
-	    return;
+	    return TRUE;
 
 	if (priv) {
 	    if (priv->bo == bo)
-		return;
+		return TRUE;
 
 	    if (priv->bo)
 		radeon_bo_unref(priv->bo);
@@ -709,7 +709,7 @@ static inline void radeon_set_pixmap_bo(PixmapPtr pPix, struct radeon_bo *bo)
 	    if (!priv) {
 		priv = calloc(1, sizeof (struct radeon_pixmap));
 		if (!priv)
-		    goto out;
+		    return FALSE;
 	    }
 
 	    radeon_bo_ref(bo);
@@ -717,8 +717,9 @@ static inline void radeon_set_pixmap_bo(PixmapPtr pPix, struct radeon_bo *bo)
 
 	    radeon_bo_get_tiling(bo, &priv->tiling_flags, &pitch);
 	}
-out:
+
 	radeon_set_pixmap_private(pPix, priv);
+	return TRUE;
     } else
 #endif /* USE_GLAMOR */
     {
@@ -735,7 +736,10 @@ out:
 	    driver_priv->bo = bo;
 
 	    radeon_bo_get_tiling(bo, &driver_priv->tiling_flags, &pitch);
+	    return TRUE;
 	}
+
+	return FALSE;
     }
 }
 
diff --git a/src/radeon_bo_helper.c b/src/radeon_bo_helper.c
index 531bc45..933dc7b 100644
--- a/src/radeon_bo_helper.c
+++ b/src/radeon_bo_helper.c
@@ -312,14 +312,17 @@ Bool radeon_set_shared_pixmap_backing(PixmapPtr ppix, void *fd_handle,
     struct radeon_bo *bo;
     int ihandle = (int)(long)fd_handle;
     uint32_t size = ppix->devKind * ppix->drawable.height;
+    Bool ret = FALSE;
 
     bo = radeon_gem_bo_open_prime(info->bufmgr, ihandle, size);
     if (!bo)
-        return FALSE;
+        goto error;
 
     memset(surface, 0, sizeof(struct radeon_surface));
 
-    radeon_set_pixmap_bo(ppix, bo);
+    ret = radeon_set_pixmap_bo(ppix, bo);
+    if (!ret)
+	goto error;
 
     if (info->ChipFamily >= CHIP_FAMILY_R600 && info->surf_man) {
 	uint32_t tiling_flags;
@@ -360,10 +363,12 @@ Bool radeon_set_shared_pixmap_backing(PixmapPtr ppix, void *fd_handle,
 	surface->stencil_tile_split = (tiling_flags >> RADEON_TILING_EG_STENCIL_TILE_SPLIT_SHIFT) & RADEON_TILING_EG_STENCIL_TILE_SPLIT_MASK;
 	surface->mtilea = (tiling_flags >> RADEON_TILING_EG_MACRO_TILE_ASPECT_SHIFT) & RADEON_TILING_EG_MACRO_TILE_ASPECT_MASK;
 	if (radeon_surface_best(info->surf_man, surface)) {
-	    return FALSE;
+	    ret = FALSE;
+	    goto error;
 	}
 	if (radeon_surface_init(info->surf_man, surface)) {
-	    return FALSE;
+	    ret = FALSE;
+	    goto error;
 	}
 	/* we have to post hack the surface to reflect the actual size
 	   of the shared pixmap */
@@ -371,11 +376,12 @@ Bool radeon_set_shared_pixmap_backing(PixmapPtr ppix, void *fd_handle,
 	surface->level[0].nblk_x = ppix->devKind / surface->bpe;
     }
 
+ error:
     close(ihandle);
     /* we have a reference from the alloc and one from set pixmap bo,
        drop one */
     radeon_bo_unref(bo);
-    return TRUE;
+    return ret;
 }
 
 #endif /* RADEON_PIXMAP_SHARING */
diff --git a/src/radeon_kms.c b/src/radeon_kms.c
index 4a5f9da..b64c636 100644
--- a/src/radeon_kms.c
+++ b/src/radeon_kms.c
@@ -347,7 +347,8 @@ static Bool RADEONCreateScreenResources_KMS(ScreenPtr pScreen)
     if (info->dri2.enabled || info->use_glamor) {
 	if (info->front_bo) {
 	    PixmapPtr pPix = pScreen->GetScreenPixmap(pScreen);
-	    radeon_set_pixmap_bo(pPix, info->front_bo);
+	    if (!radeon_set_pixmap_bo(pPix, info->front_bo))
+		return FALSE;
 	    surface = radeon_get_pixmap_surface(pPix);
 	    if (surface) {
 		*surface = info->front_surface;
-- 
2.9.3



More information about the amd-gfx mailing list