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.
15 #include <drm_fourcc.h>
21 #include "i915_private.h"
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, DRM_FORMAT_RGB888, DRM_FORMAT_BGR888,
27 DRM_FORMAT_XRGB161616, DRM_FORMAT_XBGR161616,
28 DRM_FORMAT_ABGR2101010 };
30 static const uint32_t private_source_formats[] = { DRM_FORMAT_P010, DRM_FORMAT_NV12_Y_TILED_INTEL };
32 #if !defined(DRM_CAP_CURSOR_WIDTH)
33 #define DRM_CAP_CURSOR_WIDTH 0x8
36 #if !defined(DRM_CAP_CURSOR_HEIGHT)
37 #define DRM_CAP_CURSOR_HEIGHT 0x9
40 static const uint32_t kDefaultCursorWidth = 64;
41 static const uint32_t kDefaultCursorHeight = 64;
43 #define BO_USE_CAMERA_MASK BO_USE_CAMERA_READ | BO_USE_SCANOUT | BO_USE_CAMERA_WRITE
45 static void get_preferred_cursor_attributes(uint32_t drm_fd, uint64_t *cursor_width,
46 uint64_t *cursor_height)
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");
56 width = kDefaultCursorWidth;
58 *cursor_width = width;
61 height = kDefaultCursorHeight;
63 *cursor_height = height;
66 int i915_private_init(struct driver *drv, uint64_t *cursor_width, uint64_t *cursor_height)
68 get_preferred_cursor_attributes(drv->fd, cursor_width, cursor_height);
72 int i915_private_add_combinations(struct driver *drv)
74 struct format_metadata metadata;
75 uint64_t render_flags, texture_flags;
77 render_flags = BO_USE_RENDER_MASK;
78 texture_flags = BO_USE_TEXTURE_MASK;
80 metadata.tiling = I915_TILING_NONE;
81 metadata.priority = 1;
82 metadata.modifier = DRM_FORMAT_MOD_NONE;
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);
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);
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);
113 texture_flags &= ~BO_USE_RENDERSCRIPT;
114 texture_flags &= ~BO_USE_SW_WRITE_OFTEN;
115 texture_flags &= ~BO_USE_SW_READ_OFTEN;
116 texture_flags &= ~BO_USE_LINEAR;
118 metadata.tiling = I915_TILING_X;
119 metadata.priority = 2;
120 metadata.modifier = I915_FORMAT_MOD_X_TILED;
122 int ret = drv_add_combinations(drv, private_linear_source_formats,
123 ARRAY_SIZE(private_linear_source_formats), &metadata,
124 texture_flags | BO_USE_CAMERA_MASK);
131 void i915_private_align_dimensions(uint32_t format, uint32_t *vertical_alignment)
134 case DRM_FORMAT_NV12_Y_TILED_INTEL:
135 *vertical_alignment = 64;
140 uint32_t i915_private_bpp_from_format(uint32_t format, size_t plane)
142 assert(plane < drv_num_planes_from_format(format));
145 case DRM_FORMAT_NV12_Y_TILED_INTEL:
146 return (plane == 0) ? 8 : 4;
147 case DRM_FORMAT_P010:
148 return (plane == 0) ? 16 : 8;
149 case DRM_FORMAT_YUV420:
150 case DRM_FORMAT_YUV422:
151 case DRM_FORMAT_YUV444:
152 case DRM_FORMAT_NV16:
156 case DRM_FORMAT_XRGB161616:
157 case DRM_FORMAT_XBGR161616:
159 case DRM_FORMAT_ABGR2101010:
163 fprintf(stderr, "drv: UNKNOWN FORMAT %d\n", format);
167 void i915_private_vertical_subsampling_from_format(uint32_t *vertical_subsampling, uint32_t format,
171 case DRM_FORMAT_NV12_Y_TILED_INTEL:
172 case DRM_FORMAT_YUV420:
173 case DRM_FORMAT_P010:
174 *vertical_subsampling = (plane == 0) ? 1 : 2;
177 *vertical_subsampling = 1;
181 size_t i915_private_num_planes_from_format(uint32_t format)
185 case DRM_FORMAT_XRGB161616:
186 case DRM_FORMAT_XBGR161616:
187 case DRM_FORMAT_ABGR2101010:
189 case DRM_FORMAT_NV12_Y_TILED_INTEL:
190 case DRM_FORMAT_NV16:
191 case DRM_FORMAT_P010:
193 case DRM_FORMAT_YUV420:
194 case DRM_FORMAT_YUV422:
195 case DRM_FORMAT_YUV444:
199 fprintf(stderr, "drv: UNKNOWN FORMAT %d\n", format);
203 uint32_t i915_private_resolve_format(uint32_t format, uint64_t usage, uint32_t *resolved_format)
206 case DRM_FORMAT_FLEX_IMPLEMENTATION_DEFINED:
207 /* KBL camera subsystem requires NV12. */
208 if (usage & (BO_USE_CAMERA_READ | BO_USE_CAMERA_WRITE)) {
209 *resolved_format = DRM_FORMAT_NV12;
213 if (usage & BO_USE_TEXTURE) {
214 *resolved_format = DRM_FORMAT_ABGR8888;