diff options
author | Gurchetan Singh <gurchetansingh@chromium.org> | 2016-08-29 18:19:19 -0700 |
---|---|---|
committer | chrome-bot <chrome-bot@chromium.org> | 2016-09-02 07:11:27 -0700 |
commit | 42cc6d6c2a93f585daad4c70398edfd770578683 (patch) | |
tree | f0cc3586a9b48a6c2c938ca19fb062a9d3458e41 /mediatek.c | |
parent | d6fb5777154cb1be756173fd1ea907fada572b03 (diff) |
minigbm: Added YV12 for Mali platforms
Oak-cheets is using YV12 as it's Android flexible YUV format, so
we need to support it. Additionally, we're trying to enable
YV12 on Mali with EXT_image_dma_buf_import. Instead of having
redundant switch statements in every driver, let's add a helper
function to do this.
BUG=chrome-os-partner:54632, b/29059119, chromium:616275
TEST=Ran plane_test, graphics_Gbm on veyron_minnie
Change-Id: I4798225db809941367e58dde962576535b8d767c
Reviewed-on: https://chromium-review.googlesource.com/377884
Commit-Ready: Gurchetan Singh <gurchetansingh@chromium.org>
Tested-by: Gurchetan Singh <gurchetansingh@chromium.org>
Reviewed-by: Stéphane Marchesin <marcheu@chromium.org>
Diffstat (limited to 'mediatek.c')
-rw-r--r-- | mediatek.c | 33 |
1 files changed, 24 insertions, 9 deletions
@@ -18,26 +18,25 @@ static int mediatek_bo_create(struct bo *bo, uint32_t width, uint32_t height, uint32_t format, uint32_t flags) { - size_t size; - struct drm_mtk_gem_create gem_create; int ret; + size_t plane; + struct drm_mtk_gem_create gem_create; - bo->strides[0] = drv_stride_from_format(format, width, 0); - size = height * bo->strides[0]; + drv_bo_from_format(bo, width, height, format); memset(&gem_create, 0, sizeof(gem_create)); - gem_create.size = size; + gem_create.size = bo->offsets[bo->num_planes - 1] + + bo->sizes[bo->num_planes - 1]; ret = drmIoctl(bo->drv->fd, DRM_IOCTL_MTK_GEM_CREATE, &gem_create); if (ret) { fprintf(stderr, "drv: DRM_IOCTL_MTK_GEM_CREATE failed " - "(size=%zu)\n", size); + "(size=%llu)\n", gem_create.size); return ret; } - bo->handles[0].u32 = gem_create.handle; - bo->sizes[0] = size; - bo->offsets[0] = 0; + for (plane = 0; plane < bo->num_planes; plane++) + bo->handles[plane].u32 = gem_create.handle; return 0; } @@ -60,12 +59,26 @@ static void *mediatek_bo_map(struct bo *bo) bo->drv->fd, gem_map.offset); } +static drv_format_t mediatek_resolve_format(drv_format_t format) +{ + switch (format) { + case DRV_FORMAT_FLEX_IMPLEMENTATION_DEFINED: + /*HACK: See b/28671744 */ + return DRV_FORMAT_XBGR8888; + case DRV_FORMAT_FLEX_YCbCr_420_888: + return DRV_FORMAT_YVU420; + default: + return format; + } +} + const struct backend backend_mediatek = { .name = "mediatek", .bo_create = mediatek_bo_create, .bo_destroy = drv_gem_bo_destroy, .bo_map = mediatek_bo_map, + .resolve_format = mediatek_resolve_format, .format_list = { {DRV_FORMAT_XRGB8888, DRV_BO_USE_SCANOUT | DRV_BO_USE_CURSOR | DRV_BO_USE_RENDERING | DRV_BO_USE_HW_TEXTURE | @@ -81,6 +94,8 @@ const struct backend backend_mediatek = {DRV_FORMAT_ARGB8888, DRV_BO_USE_SCANOUT | DRV_BO_USE_CURSOR | DRV_BO_USE_LINEAR | DRV_BO_USE_SW_READ_OFTEN | DRV_BO_USE_SW_WRITE_OFTEN}, + {DRV_FORMAT_YVU420, DRV_BO_USE_LINEAR | DRV_BO_USE_SW_READ_OFTEN | + DRV_BO_USE_SW_WRITE_OFTEN}, } }; |