blob: 5380b7858a8b86d0d88c9b1132b3ee97eeaefa70 [file] [log] [blame]
Gurchetan Singh5521bde2016-09-30 14:53:32 -07001/*
2 * Copyright 2016 The Chromium OS Authors. All rights reserved.
3 * Use of this source code is governed by a BSD-style license that can be
4 * found in the LICENSE file.
5 */
6
7#include "drv_priv.h"
8#include "helpers.h"
Gurchetan Singh179687e2016-10-28 10:07:35 -07009#include "util.h"
10
Gurchetan Singhebe1e952016-11-29 20:36:13 -080011#define MESA_LLVMPIPE_TILE_ORDER 6
12#define MESA_LLVMPIPE_TILE_SIZE (1 << MESA_LLVMPIPE_TILE_ORDER)
13
Gurchetan Singh8ac0c9a2017-05-15 09:34:22 -070014static const uint32_t render_target_formats[] = { DRM_FORMAT_ABGR8888, DRM_FORMAT_ARGB8888,
15 DRM_FORMAT_RGB565, DRM_FORMAT_XBGR8888,
16 DRM_FORMAT_XRGB8888 };
17
18static const uint32_t texture_source_formats[] = { DRM_FORMAT_R8, DRM_FORMAT_YVU420,
19 DRM_FORMAT_YVU420_ANDROID };
Gurchetan Singh179687e2016-10-28 10:07:35 -070020
21static int vgem_init(struct driver *drv)
22{
Gurchetan Singhd3001452017-11-03 17:18:36 -070023 drv_add_combinations(drv, render_target_formats, ARRAY_SIZE(render_target_formats),
24 &LINEAR_METADATA, BO_USE_RENDER_MASK);
Gurchetan Singh8ac0c9a2017-05-15 09:34:22 -070025
Gurchetan Singhd3001452017-11-03 17:18:36 -070026 drv_add_combinations(drv, texture_source_formats, ARRAY_SIZE(texture_source_formats),
27 &LINEAR_METADATA, BO_USE_TEXTURE_MASK);
Gurchetan Singh8ac0c9a2017-05-15 09:34:22 -070028
29 return drv_modify_linear_combinations(drv);
Gurchetan Singh179687e2016-10-28 10:07:35 -070030}
Gurchetan Singh5521bde2016-09-30 14:53:32 -070031
Gurchetan Singh1b1d56a2017-03-10 16:25:23 -080032static int vgem_bo_create(struct bo *bo, uint32_t width, uint32_t height, uint32_t format,
Gurchetan Singh60ee5832017-09-28 16:25:12 -070033 uint64_t flags)
Gurchetan Singhebe1e952016-11-29 20:36:13 -080034{
Owen Linbbb69fd2017-06-05 14:33:08 +080035 width = ALIGN(width, MESA_LLVMPIPE_TILE_SIZE);
36 height = ALIGN(height, MESA_LLVMPIPE_TILE_SIZE);
37
38 /* HAL_PIXEL_FORMAT_YV12 requires that the buffer's height not be aligned. */
39 if (bo->format == DRM_FORMAT_YVU420_ANDROID)
40 height = bo->height;
41
42 return drv_dumb_bo_create(bo, width, height, format, flags);
Gurchetan Singhebe1e952016-11-29 20:36:13 -080043}
44
Gurchetan Singha1892b22017-09-28 16:40:52 -070045static uint32_t vgem_resolve_format(uint32_t format, uint64_t flags)
Gurchetan Singh5521bde2016-09-30 14:53:32 -070046{
47 switch (format) {
Gurchetan Singhf3b22da2016-11-21 10:46:38 -080048 case DRM_FORMAT_FLEX_IMPLEMENTATION_DEFINED:
Gurchetan Singh5521bde2016-09-30 14:53:32 -070049 /*HACK: See b/28671744 */
Gurchetan Singhf3b22da2016-11-21 10:46:38 -080050 return DRM_FORMAT_XBGR8888;
51 case DRM_FORMAT_FLEX_YCbCr_420_888:
Owen Linbbb69fd2017-06-05 14:33:08 +080052 return DRM_FORMAT_YVU420;
Gurchetan Singh5521bde2016-09-30 14:53:32 -070053 default:
54 return format;
55 }
56}
57
Gurchetan Singh3e9d3832017-10-31 10:36:25 -070058const struct backend backend_vgem = {
Gurchetan Singh5521bde2016-09-30 14:53:32 -070059 .name = "vgem",
Gurchetan Singh179687e2016-10-28 10:07:35 -070060 .init = vgem_init,
Gurchetan Singhebe1e952016-11-29 20:36:13 -080061 .bo_create = vgem_bo_create,
Gurchetan Singh5521bde2016-09-30 14:53:32 -070062 .bo_destroy = drv_dumb_bo_destroy,
Gurchetan Singh71611d62017-01-03 16:49:56 -080063 .bo_import = drv_prime_bo_import,
Gurchetan Singh5521bde2016-09-30 14:53:32 -070064 .bo_map = drv_dumb_bo_map,
Gurchetan Singhba6bd502017-09-18 15:29:47 -070065 .bo_unmap = drv_bo_munmap,
Gurchetan Singh5521bde2016-09-30 14:53:32 -070066 .resolve_format = vgem_resolve_format,
Gurchetan Singh5521bde2016-09-30 14:53:32 -070067};