OSDN Git Service

Revert "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 };
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         drv_modify_combination(drv, DRM_FORMAT_NV12, &LINEAR_METADATA,
48                                BO_USE_HW_VIDEO_ENCODER | BO_USE_HW_VIDEO_DECODER |
49                                    BO_USE_CAMERA_READ | BO_USE_CAMERA_WRITE);
50         drv_modify_combination(drv, DRM_FORMAT_NV21, &LINEAR_METADATA, BO_USE_HW_VIDEO_ENCODER);
51
52         return drv_modify_linear_combinations(drv);
53 }
54
55 static uint32_t dri_generic_resolve_format(struct driver *drv, uint32_t format, uint64_t use_flags)
56 {
57         switch (format) {
58         case DRM_FORMAT_FLEX_IMPLEMENTATION_DEFINED:
59                 /* Camera subsystem requires NV12. */
60                 if (use_flags & (BO_USE_CAMERA_READ | BO_USE_CAMERA_WRITE))
61                         return DRM_FORMAT_NV12;
62                 /*HACK: See b/28671744 */
63                 return DRM_FORMAT_XBGR8888;
64         case DRM_FORMAT_FLEX_YCbCr_420_888:
65                 return DRM_FORMAT_NV12;
66         case DRM_FORMAT_BGR565:
67                 /* mesa3d doesn't support BGR565 */
68                 return DRM_FORMAT_RGB565;
69         default:
70                 return format;
71         }
72 }
73
74 const struct backend backend_dri_generic = {
75         .name = "dri_generic",
76         .init = dri_generic_init,
77         .close = dri_close,
78         .bo_create = dri_bo_create,
79         .bo_create_with_modifiers = dri_bo_create_with_modifiers,
80         .bo_destroy = dri_bo_destroy,
81         .bo_import = dri_bo_import,
82         .bo_map = dri_bo_map,
83         .bo_unmap = dri_bo_unmap,
84         .bo_get_plane_fd = dri_bo_get_plane_fd,
85         .resolve_format = dri_generic_resolve_format,
86         .num_planes_from_modifier = dri_num_planes_from_modifier,
87 };
88
89 #endif