diff options
author | Alex Deucher <alexander.deucher@amd.com> | 2015-04-20 11:57:52 -0400 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2015-04-20 11:57:52 -0400 |
commit | ff62bf6e9dce55dbde92baf4fa30193c7344ee8a (patch) | |
tree | efcbe45256256ae8cf1ada3761b0e744a13991b0 /src/amdgpu_pixmap.c |
amdgpu: add the xf86-video-amdgpu driver
This adds the new xf86-video-amdgpu driver for
newer AMD GPUs.
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'src/amdgpu_pixmap.c')
-rw-r--r-- | src/amdgpu_pixmap.c | 115 |
1 files changed, 115 insertions, 0 deletions
diff --git a/src/amdgpu_pixmap.c b/src/amdgpu_pixmap.c new file mode 100644 index 0000000..657ad33 --- /dev/null +++ b/src/amdgpu_pixmap.c @@ -0,0 +1,115 @@ +/* Copyright © 2014 Advanced Micro Devices, Inc. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including + * the next paragraph) shall be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <xf86.h> +#include "amdgpu_pixmap.h" +#include "amdgpu_bo_helper.h" + +static PixmapPtr +amdgpu_pixmap_create(ScreenPtr screen, int w, int h, int depth, unsigned usage) +{ + ScrnInfoPtr scrn; + struct amdgpu_pixmap *priv; + PixmapPtr pixmap; + AMDGPUInfoPtr info; + + /* only DRI2 pixmap is suppported */ + if (!(usage & AMDGPU_CREATE_PIXMAP_DRI2)) + return fbCreatePixmap(screen, w, h, depth, usage); + + if (w > 32767 || h > 32767) + return NullPixmap; + + if (depth == 1) + return fbCreatePixmap(screen, w, h, depth, usage); + + pixmap = fbCreatePixmap(screen, 0, 0, depth, usage); + if (pixmap == NullPixmap) + return pixmap; + + if (w && h) { + priv = calloc(1, sizeof(struct amdgpu_pixmap)); + if (priv == NULL) + goto fallback_pixmap; + + scrn = xf86ScreenToScrn(screen); + info = AMDGPUPTR(scrn); + if (!info->use_glamor) + usage |= AMDGPU_CREATE_PIXMAP_LINEAR; + priv->bo = amdgpu_alloc_pixmap_bo(scrn, w, h, depth, usage, + pixmap->drawable.bitsPerPixel, + &priv->stride); + if (!priv->bo) + goto fallback_priv; + + amdgpu_set_pixmap_private(pixmap, priv); + + if (amdgpu_bo_map(scrn, priv->bo)) { + ErrorF("Failed to mmap the bo\n"); + goto fallback_bo; + } + + screen->ModifyPixmapHeader(pixmap, w, h, + 0, 0, priv->stride, + priv->bo->cpu_ptr); + } + + return pixmap; + +fallback_bo: + amdgpu_bo_unref(&priv->bo); +fallback_priv: + free(priv); +fallback_pixmap: + fbDestroyPixmap(pixmap); + return fbCreatePixmap(screen, w, h, depth, usage); +} + +static Bool amdgpu_pixmap_destroy(PixmapPtr pixmap) +{ + if (pixmap->refcnt == 1) { + amdgpu_set_pixmap_bo(pixmap, NULL); + } + fbDestroyPixmap(pixmap); + return TRUE; +} + +/* This should only be called when glamor is disabled */ +Bool amdgpu_pixmap_init(ScreenPtr screen) +{ +#if HAS_DIXREGISTERPRIVATEKEY + if (!dixRegisterPrivateKey(&amdgpu_pixmap_index, PRIVATE_PIXMAP, 0)) +#else + if (!dixRequestPrivate(&amdgpu_pixmap_index, 0)) +#endif + return FALSE; + + screen->CreatePixmap = amdgpu_pixmap_create; + screen->DestroyPixmap = amdgpu_pixmap_destroy; + return TRUE; +} |