diff options
author | Michel Dänzer <michel.daenzer@amd.com> | 2016-06-15 17:20:36 +0900 |
---|---|---|
committer | Michel Dänzer <michel@daenzer.net> | 2016-06-16 15:20:04 +0900 |
commit | c315c00e44afc91a7c8e2eab5af836d9643ebb88 (patch) | |
tree | 080d2e3b6bf90eed2abc191d504d38e0140f967e | |
parent | 74602c4221e3c84949fd69f690cbc66dcae384ea (diff) |
Propagate failure from amdgpu_set_pixmap_bo
Preparation for the following fixes.
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
-rw-r--r-- | src/amdgpu_bo_helper.c | 9 | ||||
-rw-r--r-- | src/amdgpu_kms.c | 4 | ||||
-rw-r--r-- | src/amdgpu_pixmap.h | 11 | ||||
-rw-r--r-- | 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); |