blob: afdb5a2f256023d7727d614c33b4ab8e63ccbf98 [file] [log] [blame]
Vincent Palatin5ecebea2016-03-11 14:05:45 -08001/*
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
Gurchetan Singh46faf6b2016-08-05 14:40:07 -07007#include "drv_priv.h"
Vincent Palatin5ecebea2016-03-11 14:05:45 -08008#include "helpers.h"
Gurchetan Singh179687e2016-10-28 10:07:35 -07009#include "util.h"
Vincent Palatin5ecebea2016-03-11 14:05:45 -080010
Gurchetan Singhe2b3a062017-04-07 17:15:34 -070011#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 virtio_gpu_init(struct driver *drv)
22{
Gurchetan Singh8ac0c9a2017-05-15 09:34:22 -070023 int ret;
24 ret = drv_add_combinations(drv, render_target_formats, ARRAY_SIZE(render_target_formats),
25 &LINEAR_METADATA, BO_USE_RENDER_MASK);
26 if (ret)
27 return ret;
28
29 ret = drv_add_combinations(drv, texture_source_formats, ARRAY_SIZE(texture_source_formats),
30 &LINEAR_METADATA, BO_USE_TEXTURE_MASK);
31 if (ret)
32 return ret;
33
34 return drv_modify_linear_combinations(drv);
Gurchetan Singh179687e2016-10-28 10:07:35 -070035}
36
Gurchetan Singhe2b3a062017-04-07 17:15:34 -070037static int virtio_gpu_bo_create(struct bo *bo, uint32_t width, uint32_t height, uint32_t format,
38 uint32_t flags)
39{
Owen Linbbb69fd2017-06-05 14:33:08 +080040 width = ALIGN(width, MESA_LLVMPIPE_TILE_SIZE);
41 height = ALIGN(height, MESA_LLVMPIPE_TILE_SIZE);
42
43 /* HAL_PIXEL_FORMAT_YV12 requires that the buffer's height not be aligned. */
44 if (bo->format == DRM_FORMAT_YVU420_ANDROID)
45 height = bo->height;
46
47 return drv_dumb_bo_create(bo, width, height, format, flags);
Gurchetan Singhe2b3a062017-04-07 17:15:34 -070048}
49
Tomasz Figace1ae022017-07-05 18:15:06 +090050static uint32_t virtio_gpu_resolve_format(uint32_t format, uint64_t usage)
Gurchetan Singhe2b3a062017-04-07 17:15:34 -070051{
52 switch (format) {
53 case DRM_FORMAT_FLEX_IMPLEMENTATION_DEFINED:
54 /*HACK: See b/28671744 */
55 return DRM_FORMAT_XBGR8888;
56 case DRM_FORMAT_FLEX_YCbCr_420_888:
Owen Linbbb69fd2017-06-05 14:33:08 +080057 return DRM_FORMAT_YVU420;
Gurchetan Singhe2b3a062017-04-07 17:15:34 -070058 default:
59 return format;
60 }
61}
62
Gurchetan Singh1b1d56a2017-03-10 16:25:23 -080063struct backend backend_virtio_gpu = {
Vincent Palatin5ecebea2016-03-11 14:05:45 -080064 .name = "virtio_gpu",
Gurchetan Singh179687e2016-10-28 10:07:35 -070065 .init = virtio_gpu_init,
Gurchetan Singhe2b3a062017-04-07 17:15:34 -070066 .bo_create = virtio_gpu_bo_create,
Gurchetan Singh46faf6b2016-08-05 14:40:07 -070067 .bo_destroy = drv_dumb_bo_destroy,
Gurchetan Singh71611d62017-01-03 16:49:56 -080068 .bo_import = drv_prime_bo_import,
Gurchetan Singhef920532016-08-12 16:38:25 -070069 .bo_map = drv_dumb_bo_map,
Gurchetan Singhba6bd502017-09-18 15:29:47 -070070 .bo_unmap = drv_bo_munmap,
Gurchetan Singhe2b3a062017-04-07 17:15:34 -070071 .resolve_format = virtio_gpu_resolve_format,
Vincent Palatin5ecebea2016-03-11 14:05:45 -080072};