summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRussell King <rmk@arm.linux.org.uk>2015-10-27 17:20:48 +0000
committerRussell King <rmk@arm.linux.org.uk>2015-11-08 20:09:05 +0000
commit6081fcfd3af768169a62cbd22ad766051c809fdb (patch)
tree645e8071675f8f397b1ab6801098b3e4c95d3a19
parent3b6f36cfdc4a190ec636478134810e9cc77d6e0c (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.c7
-rw-r--r--src/armada_accel.h1
-rw-r--r--src/armada_drm.c4
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,