2 * Copyright 2020 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.
18 static const uint32_t scanout_render_formats[] = { DRM_FORMAT_ARGB8888, DRM_FORMAT_XRGB8888,
19 DRM_FORMAT_ABGR8888, DRM_FORMAT_XBGR8888,
20 DRM_FORMAT_RGB565, DRM_FORMAT_ARGB4444 };
22 static const uint32_t texture_only_formats[] = { DRM_FORMAT_NV12, DRM_FORMAT_NV21,
23 DRM_FORMAT_YVU420, DRM_FORMAT_YVU420_ANDROID };
25 static int dri_generic_init(struct driver *drv)
27 struct dri_driver *dri;
29 dri = calloc(1, sizeof(struct dri_driver));
41 drv_add_combinations(drv, scanout_render_formats, ARRAY_SIZE(scanout_render_formats),
42 &LINEAR_METADATA, BO_USE_RENDER_MASK | BO_USE_SCANOUT);
44 drv_add_combinations(drv, texture_only_formats, ARRAY_SIZE(texture_only_formats),
45 &LINEAR_METADATA, BO_USE_TEXTURE_MASK);
47 /* Android CTS tests require this. */
48 drv_add_combination(drv, DRM_FORMAT_BGR888, &LINEAR_METADATA, BO_USE_SW_MASK);
50 drv_modify_combination(drv, DRM_FORMAT_NV12, &LINEAR_METADATA,
51 BO_USE_HW_VIDEO_ENCODER | BO_USE_HW_VIDEO_DECODER |
52 BO_USE_CAMERA_READ | BO_USE_CAMERA_WRITE);
53 drv_modify_combination(drv, DRM_FORMAT_NV21, &LINEAR_METADATA, BO_USE_HW_VIDEO_ENCODER);
55 return drv_modify_linear_combinations(drv);
58 static uint32_t dri_generic_resolve_format(struct driver *drv, uint32_t format, uint64_t use_flags)
60 if (!(use_flags & (BO_USE_SW_MASK/* | BO_USE_COMPOSER_TARGET*/))) {
62 case DRM_FORMAT_XBGR8888:
63 /* Try to optimize pinephone performance */
64 return DRM_FORMAT_RGB565;
65 case DRM_FORMAT_ABGR8888:
66 /* Try to optimize pinephone performance */
67 return DRM_FORMAT_ARGB8888;
68 // return DRM_FORMAT_ARGB4444;
73 case DRM_FORMAT_FLEX_IMPLEMENTATION_DEFINED:
74 /* Camera subsystem requires NV12. */
75 if (use_flags & (BO_USE_CAMERA_READ | BO_USE_CAMERA_WRITE))
76 return DRM_FORMAT_NV12;
77 /*HACK: See b/28671744 */
78 return DRM_FORMAT_XBGR8888;
79 case DRM_FORMAT_FLEX_YCbCr_420_888:
80 return DRM_FORMAT_NV12;
81 case DRM_FORMAT_BGR565:
82 /* mesa3d doesn't support BGR565 */
83 return DRM_FORMAT_RGB565;
89 const struct backend backend_dri_generic = {
90 .name = "dri_generic",
91 .init = dri_generic_init,
93 .bo_create = dri_bo_create,
94 .bo_create_with_modifiers = dri_bo_create_with_modifiers,
95 .bo_destroy = dri_bo_destroy,
96 .bo_import = dri_bo_import,
98 .bo_unmap = dri_bo_unmap,
99 .bo_get_plane_fd = dri_bo_get_plane_fd,
100 .resolve_format = dri_generic_resolve_format,
101 .num_planes_from_modifier = dri_num_planes_from_modifier,