OSDN Git Service

gralloc0_register_buffer: initialize gralloc0 when needed
[android-x86/external-minigbm.git] / i915_private.c
1 /*
2  * Copyright 2017 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 DRV_I915
8
9 #include <assert.h>
10 #include <errno.h>
11 #include <i915_drm.h>
12 #include <stdio.h>
13 #include <string.h>
14 #include <sys/mman.h>
15 #include <drm_fourcc.h>
16 #include <xf86drm.h>
17
18 #include "drv_priv.h"
19 #include "helpers.h"
20 #include "util.h"
21 #include "i915_private.h"
22
23 static const uint32_t private_linear_source_formats[] = { DRM_FORMAT_R16,    DRM_FORMAT_NV16,
24                                                           DRM_FORMAT_YUV420, DRM_FORMAT_YUV422,
25                                                           DRM_FORMAT_YUV444, DRM_FORMAT_NV21,
26                                                           DRM_FORMAT_P010 };
27
28 static const uint32_t private_rgb24_formats[] = { DRM_FORMAT_RGB888, DRM_FORMAT_BGR888 };
29
30 static const uint32_t private_source_formats[] = { DRM_FORMAT_P010, DRM_FORMAT_NV12_Y_TILED_INTEL };
31
32 #if !defined(DRM_CAP_CURSOR_WIDTH)
33 #define DRM_CAP_CURSOR_WIDTH 0x8
34 #endif
35
36 #if !defined(DRM_CAP_CURSOR_HEIGHT)
37 #define DRM_CAP_CURSOR_HEIGHT 0x9
38 #endif
39
40 static const uint32_t kDefaultCursorWidth = 64;
41 static const uint32_t kDefaultCursorHeight = 64;
42
43 #define BO_USE_CAMERA_MASK BO_USE_CAMERA_READ | BO_USE_SCANOUT | BO_USE_CAMERA_WRITE
44
45 static void get_preferred_cursor_attributes(uint32_t drm_fd, uint64_t *cursor_width,
46                                             uint64_t *cursor_height)
47 {
48         uint64_t width = 0, height = 0;
49         if (drmGetCap(drm_fd, DRM_CAP_CURSOR_WIDTH, &width)) {
50                 fprintf(stderr, "cannot get cursor width. \n");
51         } else if (drmGetCap(drm_fd, DRM_CAP_CURSOR_HEIGHT, &height)) {
52                 fprintf(stderr, "cannot get cursor height. \n");
53         }
54
55         if (!width)
56                 width = kDefaultCursorWidth;
57
58         *cursor_width = width;
59
60         if (!height)
61                 height = kDefaultCursorHeight;
62
63         *cursor_height = height;
64 }
65
66 int i915_private_init(struct driver *drv, uint64_t *cursor_width, uint64_t *cursor_height)
67 {
68         get_preferred_cursor_attributes(drv->fd, cursor_width, cursor_height);
69         return 0;
70 }
71
72 int i915_private_add_combinations(struct driver *drv)
73 {
74         struct format_metadata metadata;
75         uint64_t render_flags, texture_flags;
76
77         render_flags = BO_USE_RENDER_MASK;
78         texture_flags = BO_USE_TEXTURE_MASK;
79
80         metadata.tiling = I915_TILING_NONE;
81         metadata.priority = 1;
82         metadata.modifier = DRM_FORMAT_MOD_NONE;
83
84         drv_modify_combination(drv, DRM_FORMAT_ABGR8888, &metadata, BO_USE_CURSOR | BO_USE_SCANOUT);
85         drv_modify_combination(drv, DRM_FORMAT_NV12, &metadata,
86                                BO_USE_RENDERING | BO_USE_TEXTURE | BO_USE_CAMERA_MASK);
87         drv_modify_combination(drv, DRM_FORMAT_YUYV, &metadata,
88                                BO_USE_TEXTURE | BO_USE_CAMERA_MASK | BO_USE_RENDERING);
89         drv_modify_combination(drv, DRM_FORMAT_VYUY, &metadata,
90                                BO_USE_TEXTURE | BO_USE_CAMERA_MASK | BO_USE_RENDERING);
91         drv_modify_combination(drv, DRM_FORMAT_UYVY, &metadata,
92                                BO_USE_TEXTURE | BO_USE_CAMERA_MASK | BO_USE_RENDERING);
93         drv_modify_combination(drv, DRM_FORMAT_YVYU, &metadata,
94                                BO_USE_TEXTURE | BO_USE_CAMERA_MASK | BO_USE_RENDERING);
95         drv_modify_combination(drv, DRM_FORMAT_YVU420_ANDROID, &metadata,
96                                BO_USE_TEXTURE | BO_USE_CAMERA_MASK);
97         drv_modify_combination(drv, DRM_FORMAT_RGB565, &metadata, BO_USE_CAMERA_MASK);
98
99         /* Media/Camera expect these formats support. */
100         metadata.tiling = I915_TILING_NONE;
101         metadata.priority = 1;
102         metadata.modifier = DRM_FORMAT_MOD_NONE;
103         drv_add_combinations(drv, private_linear_source_formats,
104                              ARRAY_SIZE(private_linear_source_formats), &metadata,
105                              texture_flags | BO_USE_CAMERA_MASK);
106
107         metadata.tiling = I915_TILING_Y;
108         metadata.priority = 3;
109         metadata.modifier = I915_FORMAT_MOD_Y_TILED;
110         drv_add_combinations(drv, private_source_formats, ARRAY_SIZE(private_source_formats),
111                              &metadata, texture_flags | BO_USE_CAMERA_MASK);
112
113         /* Android CTS tests require this. */
114         drv_add_combinations(drv, private_rgb24_formats, ARRAY_SIZE(private_rgb24_formats),
115                              &metadata, BO_USE_SW_MASK);
116
117         texture_flags &= ~BO_USE_RENDERSCRIPT;
118         texture_flags &= ~BO_USE_SW_WRITE_OFTEN;
119         texture_flags &= ~BO_USE_SW_READ_OFTEN;
120         texture_flags &= ~BO_USE_LINEAR;
121
122         metadata.tiling = I915_TILING_X;
123         metadata.priority = 2;
124         metadata.modifier = I915_FORMAT_MOD_X_TILED;
125
126         int ret = drv_add_combinations(drv, private_linear_source_formats,
127                                        ARRAY_SIZE(private_linear_source_formats), &metadata,
128                                        texture_flags | BO_USE_CAMERA_MASK);
129         if (ret)
130                 return ret;
131
132         return 0;
133 }
134
135 void i915_private_align_dimensions(uint32_t format, uint32_t *vertical_alignment)
136 {
137         switch (format) {
138         case DRM_FORMAT_NV12_Y_TILED_INTEL:
139                 *vertical_alignment = 64;
140                 break;
141         }
142 }
143
144 uint32_t i915_private_bpp_from_format(uint32_t format, size_t plane)
145 {
146         assert(plane < drv_num_planes_from_format(format));
147
148         switch (format) {
149         case DRM_FORMAT_NV12_Y_TILED_INTEL:
150                 return (plane == 0) ? 8 : 4;
151         case DRM_FORMAT_P010:
152                 return (plane == 0) ? 16 : 8;
153         case DRM_FORMAT_YUV420:
154         case DRM_FORMAT_YUV422:
155         case DRM_FORMAT_YUV444:
156         case DRM_FORMAT_NV16:
157                 return 8;
158         case DRM_FORMAT_R16:
159                 return 16;
160         }
161
162         fprintf(stderr, "drv: UNKNOWN FORMAT %d\n", format);
163         return 0;
164 }
165
166 void i915_private_vertical_subsampling_from_format(uint32_t *vertical_subsampling, uint32_t format,
167                                                    size_t plane)
168 {
169         switch (format) {
170         case DRM_FORMAT_NV12_Y_TILED_INTEL:
171         case DRM_FORMAT_YUV420:
172         case DRM_FORMAT_P010:
173                 *vertical_subsampling = (plane == 0) ? 1 : 2;
174                 break;
175         default:
176                 *vertical_subsampling = 1;
177         }
178 }
179
180 size_t i915_private_num_planes_from_format(uint32_t format)
181 {
182         switch (format) {
183         case DRM_FORMAT_R16:
184                 return 1;
185         case DRM_FORMAT_NV12_Y_TILED_INTEL:
186         case DRM_FORMAT_NV16:
187         case DRM_FORMAT_P010:
188                 return 2;
189         case DRM_FORMAT_YUV420:
190         case DRM_FORMAT_YUV422:
191         case DRM_FORMAT_YUV444:
192                 return 3;
193         }
194
195         fprintf(stderr, "drv: UNKNOWN FORMAT %d\n", format);
196         return 0;
197 }
198
199 uint32_t i915_private_resolve_format(uint32_t format, uint64_t usage, uint32_t *resolved_format)
200 {
201         switch (format) {
202         case DRM_FORMAT_FLEX_IMPLEMENTATION_DEFINED:
203                 /* KBL camera subsystem requires NV12. */
204                 if (usage & (BO_USE_CAMERA_READ | BO_USE_CAMERA_WRITE)) {
205                         *resolved_format = DRM_FORMAT_NV12;
206                         return 1;
207                 }
208
209                 if (usage & BO_USE_TEXTURE) {
210                         *resolved_format = DRM_FORMAT_ABGR8888;
211                         return 1;
212                 }
213         }
214
215         return 0;
216 }
217
218 #endif