OSDN Git Service

WIP: Pinephone optimization experements
[android-x86/external-minigbm.git] / dri_generic_driver.c
1 /*
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.
5  */
6
7 #ifdef DRI_GENERIC_DRV
8
9 #include <string.h>
10 #include <xf86drm.h>
11
12 #include "dri.h"
13 #include "drv_priv.h"
14 #include "helpers.h"
15 #include "util.h"
16 #include <errno.h>
17
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 };
21
22 static const uint32_t texture_only_formats[] = { DRM_FORMAT_NV12, DRM_FORMAT_NV21,
23                                                  DRM_FORMAT_YVU420, DRM_FORMAT_YVU420_ANDROID };
24
25 static int dri_generic_init(struct driver *drv)
26 {
27         struct dri_driver *dri;
28
29         dri = calloc(1, sizeof(struct dri_driver));
30         if (!dri)
31                 return -ENOMEM;
32
33         drv->priv = dri;
34
35         if (dri_init2(drv)) {
36                 free(dri);
37                 drv->priv = NULL;
38                 return -ENODEV;
39         }
40
41         drv_add_combinations(drv, scanout_render_formats, ARRAY_SIZE(scanout_render_formats),
42                              &LINEAR_METADATA, BO_USE_RENDER_MASK | BO_USE_SCANOUT);
43
44         drv_add_combinations(drv, texture_only_formats, ARRAY_SIZE(texture_only_formats),
45                              &LINEAR_METADATA, BO_USE_TEXTURE_MASK);
46
47         /* Android CTS tests require this. */
48         drv_add_combination(drv, DRM_FORMAT_BGR888, &LINEAR_METADATA, BO_USE_SW_MASK);
49
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);
54
55         return drv_modify_linear_combinations(drv);
56 }
57
58 static uint32_t dri_generic_resolve_format(struct driver *drv, uint32_t format, uint64_t use_flags)
59 {
60         if (!(use_flags & (BO_USE_SW_MASK/* | BO_USE_COMPOSER_TARGET*/))) {
61                 switch (format) {
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;
69                 }
70         }
71
72         switch (format) {
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;
84         default:
85                 return format;
86         }
87 }
88
89 const struct backend backend_dri_generic = {
90         .name = "dri_generic",
91         .init = dri_generic_init,
92         .close = dri_close,
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,
97         .bo_map = dri_bo_map,
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,
102 };
103
104 #endif