[PATCH xf86-video-amdgpu 2/5] Propagate failure from amdgpu_set_pixmap_bo

Michel Dänzer michel at daenzer.net
Wed Jun 15 10:00:47 UTC 2016


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

Preparation for the following fixes.

Signed-off-by: Michel Dänzer <michel.daenzer at amd.com>
---
 src/amdgpu_bo_helper.c |  9 ++++++---
 src/amdgpu_kms.c       |  4 +++-
 src/amdgpu_pixmap.h    | 11 ++++++-----
 src/drmmode_display.c  | 28 +++++++++++++++-------------
 4 files changed, 30 insertions(+), 22 deletions(-)

diff --git a/src/amdgpu_bo_helper.c b/src/amdgpu_bo_helper.c
index f5a67e3..5482ff0 100644
--- a/src/amdgpu_bo_helper.c
+++ b/src/amdgpu_bo_helper.c
@@ -384,6 +384,7 @@ Bool amdgpu_set_shared_pixmap_backing(PixmapPtr ppix, void *fd_handle)
 	struct amdgpu_buffer *pixmap_buffer = NULL;
 	int ihandle = (int)(long)fd_handle;
 	uint32_t size = ppix->devKind * ppix->drawable.height;
+	Bool ret;
 
 	if (info->gbm) {
 		struct amdgpu_pixmap *priv;
@@ -442,13 +443,15 @@ Bool amdgpu_set_shared_pixmap_backing(PixmapPtr ppix, void *fd_handle)
 		return FALSE;
 	}
 
-	amdgpu_set_pixmap_bo(ppix, pixmap_buffer);
-
 	close(ihandle);
+
+	ret = amdgpu_set_pixmap_bo(ppix, pixmap_buffer);
+
 	/* we have a reference from the alloc and one from set pixmap bo,
 	   drop one */
 	amdgpu_bo_unref(&pixmap_buffer);
-	return TRUE;
+
+	return ret;
 }
 
 #endif /* AMDGPU_PIXMAP_SHARING */
diff --git a/src/amdgpu_kms.c b/src/amdgpu_kms.c
index 3c53bc9..b34a223 100644
--- a/src/amdgpu_kms.c
+++ b/src/amdgpu_kms.c
@@ -205,7 +205,9 @@ static Bool AMDGPUCreateScreenResources_KMS(ScreenPtr pScreen)
 	if (info->dri2.enabled || info->use_glamor) {
 		if (info->front_buffer) {
 			PixmapPtr pPix = pScreen->GetScreenPixmap(pScreen);
-			amdgpu_set_pixmap_bo(pPix, info->front_buffer);
+
+			if (!amdgpu_set_pixmap_bo(pPix, info->front_buffer))
+				return FALSE;
 		}
 	}
 
diff --git a/src/amdgpu_pixmap.h b/src/amdgpu_pixmap.h
index ecdd74d..9c51067 100644
--- a/src/amdgpu_pixmap.h
+++ b/src/amdgpu_pixmap.h
@@ -54,17 +54,17 @@ static inline void amdgpu_set_pixmap_private(PixmapPtr pixmap,
 	dixSetPrivate(&pixmap->devPrivates, &amdgpu_pixmap_index, priv);
 }
 
-static inline void amdgpu_set_pixmap_bo(PixmapPtr pPix, struct amdgpu_buffer *bo)
+static inline Bool amdgpu_set_pixmap_bo(PixmapPtr pPix, struct amdgpu_buffer *bo)
 {
 	struct amdgpu_pixmap *priv;
 
 	priv = amdgpu_get_pixmap_private(pPix);
 	if (priv == NULL && bo == NULL)
-		return;
+		return TRUE;
 
 	if (priv) {
 		if (priv->bo == bo)
-			return;
+			return TRUE;
 
 		if (priv->bo) {
 			amdgpu_bo_unref(&priv->bo);
@@ -81,13 +81,14 @@ static inline void amdgpu_set_pixmap_bo(PixmapPtr pPix, struct amdgpu_buffer *bo
 		if (!priv) {
 			priv = calloc(1, sizeof(struct amdgpu_pixmap));
 			if (!priv)
-				goto out;
+				return FALSE;
 		}
 		amdgpu_bo_ref(bo);
 		priv->bo = bo;
 	}
-out:
+
 	amdgpu_set_pixmap_private(pPix, priv);
+	return TRUE;
 }
 
 static inline struct amdgpu_buffer *amdgpu_get_pixmap_bo(PixmapPtr pPix)
diff --git a/src/drmmode_display.c b/src/drmmode_display.c
index a675c73..3d76c88 100644
--- a/src/drmmode_display.c
+++ b/src/drmmode_display.c
@@ -111,18 +111,18 @@ static PixmapPtr drmmode_create_bo_pixmap(ScrnInfoPtr pScrn,
 		return NULL;
 
 	if (!(*pScreen->ModifyPixmapHeader) (pixmap, width, height,
-					     depth, bpp, pitch, NULL)) {
-		return NULL;
-	}
+					     depth, bpp, pitch, NULL))
+		goto fail;
 
-	amdgpu_set_pixmap_bo(pixmap, bo);
+	if (!amdgpu_glamor_create_textured_pixmap(pixmap, bo))
+		goto fail;
 
-	if (!amdgpu_glamor_create_textured_pixmap(pixmap, bo)) {
-		pScreen->DestroyPixmap(pixmap);
-		return NULL;
-	}
+	if (amdgpu_set_pixmap_bo(pixmap, bo))
+		return pixmap;
 
-	return pixmap;
+fail:
+	pScreen->DestroyPixmap(pixmap);
+	return NULL;
 }
 
 static void drmmode_destroy_bo_pixmap(PixmapPtr pixmap)
@@ -1944,9 +1944,14 @@ static Bool drmmode_xf86crtc_resize(ScrnInfoPtr scrn, int width, int height)
 		goto fail;
 	}
 
+	if (!amdgpu_glamor_create_screen_resources(scrn->pScreen))
+		goto fail;
+
 	if (info->use_glamor ||
 	    (info->front_buffer->flags & AMDGPU_BO_FLAGS_GBM)) {
-		amdgpu_set_pixmap_bo(ppix, info->front_buffer);
+		if (!amdgpu_set_pixmap_bo(ppix, info->front_buffer))
+			goto fail;
+
 		screen->ModifyPixmapHeader(ppix,
 					   width, height, -1, -1, pitch, info->front_buffer->cpu_ptr);
 	} else {
@@ -1963,9 +1968,6 @@ static Bool drmmode_xf86crtc_resize(ScrnInfoPtr scrn, int width, int height)
 	scrn->pixmapPrivate.ptr = ppix->devPrivate.ptr;
 #endif
 
-	if (info->use_glamor)
-		amdgpu_glamor_create_screen_resources(scrn->pScreen);
-
 	/* Clear new buffer */
 	gc = GetScratchGC(ppix->drawable.depth, scrn->pScreen);
 	ValidateGC(&ppix->drawable, gc);
-- 
2.8.1



More information about the xorg-driver-ati mailing list