diff options
author | Russell King <rmk@arm.linux.org.uk> | 2015-10-27 17:20:48 +0000 |
---|---|---|
committer | Russell King <rmk@arm.linux.org.uk> | 2015-11-08 20:09:05 +0000 |
commit | 6081fcfd3af768169a62cbd22ad766051c809fdb (patch) | |
tree | 645e8071675f8f397b1ab6801098b3e4c95d3a19 | |
parent | 3b6f36cfdc4a190ec636478134810e9cc77d6e0c (diff) |
src: ensure pixmaps are aligned to the GPU accelerator requirements
Ensure pixmap sizes are aligned according to the GPU accelerator
requirements. This allows modes such as 1366x768 to work with
Vivante GPUs.
Signed-off-by: Russell King <rmk@arm.linux.org.uk>
-rw-r--r-- | etnaviv/etnaviv.c | 7 | ||||
-rw-r--r-- | src/armada_accel.h | 1 | ||||
-rw-r--r-- | src/armada_drm.c | 4 |
3 files changed, 12 insertions, 0 deletions
diff --git a/etnaviv/etnaviv.c b/etnaviv/etnaviv.c index 5123b74..b4306e9 100644 --- a/etnaviv/etnaviv.c +++ b/etnaviv/etnaviv.c @@ -1005,6 +1005,12 @@ fail_accel: return FALSE; } +static void etnaviv_align_bo_size(ScreenPtr pScreen, int *width, int *height, + int bpp) +{ + *width = etnaviv_pitch(*width, bpp) * 8 / bpp; +} + static Bool etnaviv_format(struct etnaviv_format *fmt, unsigned int depth, unsigned int bpp) { @@ -1155,6 +1161,7 @@ static int etnaviv_export_name(ScreenPtr pScreen, uint32_t name) const struct armada_accel_ops etnaviv_ops = { .pre_init = etnaviv_pre_init, .screen_init = etnaviv_ScreenInit, + .align_bo_size = etnaviv_align_bo_size, .import_dmabuf = etnaviv_import_dmabuf, .attach_name = etnaviv_attach_name, .free_pixmap = etnaviv_free_pixmap, diff --git a/src/armada_accel.h b/src/armada_accel.h index 157bb1d..073f0d7 100644 --- a/src/armada_accel.h +++ b/src/armada_accel.h @@ -25,6 +25,7 @@ enum { struct armada_accel_ops { Bool (*pre_init)(ScrnInfoPtr, int); int (*screen_init)(ScreenPtr, struct drm_armada_bufmgr *); + void (*align_bo_size)(ScreenPtr, int *, int *, int); Bool (*import_dmabuf)(ScreenPtr, PixmapPtr, int); void (*attach_name)(ScreenPtr, PixmapPtr, uint32_t); void (*free_pixmap)(PixmapPtr); diff --git a/src/armada_drm.c b/src/armada_drm.c index 14de490..0f21493 100644 --- a/src/armada_drm.c +++ b/src/armada_drm.c @@ -108,6 +108,10 @@ static struct drm_armada_bo *armada_bo_alloc_framebuffer(ScrnInfoPtr pScrn, struct drm_armada_bo *bo; int ret; + if (arm->accel_ops && arm->accel_ops->align_bo_size) + arm->accel_ops->align_bo_size(pScrn->pScreen, &width, + &height, bpp); + bo = drm_armada_bo_dumb_create(arm->bufmgr, width, height, bpp); if (!bo) { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, |