blob: 22726c49aa0cb2d688eeb09b41b39af4d3d97474 [file] [log] [blame]
Daniel Stone903721a2017-04-04 17:54:20 +01001/*
Pekka Paalanenabd3f3c2019-09-27 14:33:46 +03002 * Copyright © 2016, 2019 Collabora, Ltd.
Pekka Paalanene7c91b62018-09-26 14:00:34 +03003 * Copyright (c) 2018 DisplayLink (UK) Ltd.
Daniel Stone903721a2017-04-04 17:54:20 +01004 *
5 * Permission is hereby granted, free of charge, to any person obtaining a
6 * copy of this software and associated documentation files (the "Software"),
7 * to deal in the Software without restriction, including without limitation
8 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9 * and/or sell copies of the Software, and to permit persons to whom the
10 * Software is furnished to do so, subject to the following conditions:
11 *
12 * The above copyright notice and this permission notice (including the next
13 * paragraph) shall be included in all copies or substantial portions of the
14 * Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22 * DEALINGS IN THE SOFTWARE.
23 *
24 * Author: Daniel Stone <daniels@collabora.com>
25 */
26
27#include "config.h"
28
29#include <endian.h>
30#include <inttypes.h>
31#include <stdbool.h>
32#include <unistd.h>
Pekka Paalanenf5ed7432018-09-26 14:26:53 +030033#include <string.h>
Marius Vlada9a63042018-11-20 17:04:57 +020034#include <wayland-client-protocol.h>
Daniel Stone903721a2017-04-04 17:54:20 +010035
Pekka Paalanenc232f8d2019-04-05 16:09:45 +030036#include "shared/helpers.h"
Pekka Paalanen4b301fe2021-02-04 17:39:45 +020037#include "shared/weston-drm-fourcc.h"
Daniel Stone903721a2017-04-04 17:54:20 +010038#include "wayland-util.h"
39#include "pixel-formats.h"
40
Pekka Paalanena4ecf962021-03-03 14:45:55 +020041#ifdef ENABLE_EGL
Daniel Stone903721a2017-04-04 17:54:20 +010042#include <EGL/egl.h>
43#include <EGL/eglext.h>
44#include <GLES2/gl2.h>
45#include <GLES2/gl2ext.h>
46#define GL_FORMAT(fmt) .gl_format = (fmt)
47#define GL_TYPE(type) .gl_type = (type)
48#define SAMPLER_TYPE(type) .sampler_type = (type)
49#else
50#define GL_FORMAT(fmt) .gl_format = 0
51#define GL_TYPE(type) .gl_type = 0
52#define SAMPLER_TYPE(type) .sampler_type = 0
53#endif
54
Pekka Paalanene7c91b62018-09-26 14:00:34 +030055#define DRM_FORMAT(f) .format = DRM_FORMAT_ ## f, .drm_format_name = #f
Pekka Paalanenabd3f3c2019-09-27 14:33:46 +030056#define BITS_RGBA_FIXED(r_, g_, b_, a_) \
57 .bits.r = r_, \
58 .bits.g = g_, \
59 .bits.b = b_, \
60 .bits.a = a_, \
61 .component_type = PIXEL_COMPONENT_TYPE_FIXED
Pekka Paalanene7c91b62018-09-26 14:00:34 +030062
Pekka Paalanenc232f8d2019-04-05 16:09:45 +030063#include "shared/weston-egl-ext.h"
Daniel Stone903721a2017-04-04 17:54:20 +010064
65/**
66 * Table of DRM formats supported by Weston; RGB, ARGB and YUV formats are
67 * supported. Indexed/greyscale formats, and formats not containing complete
68 * colour channels, are not supported.
69 */
70static const struct pixel_format_info pixel_format_table[] = {
71 {
Pekka Paalanene7c91b62018-09-26 14:00:34 +030072 DRM_FORMAT(XRGB4444),
Pekka Paalanenabd3f3c2019-09-27 14:33:46 +030073 BITS_RGBA_FIXED(4, 4, 4, 0),
Daniel Stone903721a2017-04-04 17:54:20 +010074 },
75 {
Pekka Paalanene7c91b62018-09-26 14:00:34 +030076 DRM_FORMAT(ARGB4444),
Pekka Paalanenabd3f3c2019-09-27 14:33:46 +030077 BITS_RGBA_FIXED(4, 4, 4, 4),
Daniel Stone903721a2017-04-04 17:54:20 +010078 .opaque_substitute = DRM_FORMAT_XRGB4444,
79 },
80 {
Pekka Paalanene7c91b62018-09-26 14:00:34 +030081 DRM_FORMAT(XBGR4444),
Pekka Paalanenabd3f3c2019-09-27 14:33:46 +030082 BITS_RGBA_FIXED(4, 4, 4, 0),
Daniel Stone903721a2017-04-04 17:54:20 +010083 },
84 {
Pekka Paalanene7c91b62018-09-26 14:00:34 +030085 DRM_FORMAT(ABGR4444),
Pekka Paalanenabd3f3c2019-09-27 14:33:46 +030086 BITS_RGBA_FIXED(4, 4, 4, 4),
Daniel Stone903721a2017-04-04 17:54:20 +010087 .opaque_substitute = DRM_FORMAT_XBGR4444,
88 },
89 {
Pekka Paalanene7c91b62018-09-26 14:00:34 +030090 DRM_FORMAT(RGBX4444),
Pekka Paalanenabd3f3c2019-09-27 14:33:46 +030091 BITS_RGBA_FIXED(4, 4, 4, 0),
Daniel Stone903721a2017-04-04 17:54:20 +010092# if __BYTE_ORDER == __LITTLE_ENDIAN
93 GL_FORMAT(GL_RGBA),
94 GL_TYPE(GL_UNSIGNED_SHORT_4_4_4_4),
95#endif
96 },
97 {
Pekka Paalanene7c91b62018-09-26 14:00:34 +030098 DRM_FORMAT(RGBA4444),
Pekka Paalanenabd3f3c2019-09-27 14:33:46 +030099 BITS_RGBA_FIXED(4, 4, 4, 4),
Daniel Stone903721a2017-04-04 17:54:20 +0100100 .opaque_substitute = DRM_FORMAT_RGBX4444,
101# if __BYTE_ORDER == __LITTLE_ENDIAN
102 GL_FORMAT(GL_RGBA),
103 GL_TYPE(GL_UNSIGNED_SHORT_4_4_4_4),
104#endif
105 },
106 {
Pekka Paalanene7c91b62018-09-26 14:00:34 +0300107 DRM_FORMAT(BGRX4444),
Pekka Paalanenabd3f3c2019-09-27 14:33:46 +0300108 BITS_RGBA_FIXED(4, 4, 4, 0),
Daniel Stone903721a2017-04-04 17:54:20 +0100109 },
110 {
Pekka Paalanene7c91b62018-09-26 14:00:34 +0300111 DRM_FORMAT(BGRA4444),
Pekka Paalanenabd3f3c2019-09-27 14:33:46 +0300112 BITS_RGBA_FIXED(4, 4, 4, 4),
Daniel Stone903721a2017-04-04 17:54:20 +0100113 .opaque_substitute = DRM_FORMAT_BGRX4444,
114 },
115 {
Pekka Paalanene7c91b62018-09-26 14:00:34 +0300116 DRM_FORMAT(XRGB1555),
Pekka Paalanenabd3f3c2019-09-27 14:33:46 +0300117 BITS_RGBA_FIXED(5, 5, 5, 0),
Daniel Stone903721a2017-04-04 17:54:20 +0100118 .depth = 15,
119 .bpp = 16,
120 },
121 {
Pekka Paalanene7c91b62018-09-26 14:00:34 +0300122 DRM_FORMAT(ARGB1555),
Pekka Paalanenabd3f3c2019-09-27 14:33:46 +0300123 BITS_RGBA_FIXED(5, 5, 5, 1),
Daniel Stone903721a2017-04-04 17:54:20 +0100124 .opaque_substitute = DRM_FORMAT_XRGB1555,
125 },
126 {
Pekka Paalanene7c91b62018-09-26 14:00:34 +0300127 DRM_FORMAT(XBGR1555),
Pekka Paalanenabd3f3c2019-09-27 14:33:46 +0300128 BITS_RGBA_FIXED(5, 5, 5, 0),
Daniel Stone903721a2017-04-04 17:54:20 +0100129 },
130 {
Pekka Paalanene7c91b62018-09-26 14:00:34 +0300131 DRM_FORMAT(ABGR1555),
Pekka Paalanenabd3f3c2019-09-27 14:33:46 +0300132 BITS_RGBA_FIXED(5, 5, 5, 1),
Daniel Stone903721a2017-04-04 17:54:20 +0100133 .opaque_substitute = DRM_FORMAT_XBGR1555,
134 },
135 {
Pekka Paalanene7c91b62018-09-26 14:00:34 +0300136 DRM_FORMAT(RGBX5551),
Pekka Paalanenabd3f3c2019-09-27 14:33:46 +0300137 BITS_RGBA_FIXED(5, 5, 5, 0),
Daniel Stone903721a2017-04-04 17:54:20 +0100138# if __BYTE_ORDER == __LITTLE_ENDIAN
139 GL_FORMAT(GL_RGBA),
140 GL_TYPE(GL_UNSIGNED_SHORT_5_5_5_1),
141#endif
142 },
143 {
Pekka Paalanene7c91b62018-09-26 14:00:34 +0300144 DRM_FORMAT(RGBA5551),
Pekka Paalanenabd3f3c2019-09-27 14:33:46 +0300145 BITS_RGBA_FIXED(5, 5, 5, 1),
Daniel Stone903721a2017-04-04 17:54:20 +0100146 .opaque_substitute = DRM_FORMAT_RGBX5551,
147# if __BYTE_ORDER == __LITTLE_ENDIAN
148 GL_FORMAT(GL_RGBA),
149 GL_TYPE(GL_UNSIGNED_SHORT_5_5_5_1),
150#endif
151 },
152 {
Pekka Paalanene7c91b62018-09-26 14:00:34 +0300153 DRM_FORMAT(BGRX5551),
Pekka Paalanenabd3f3c2019-09-27 14:33:46 +0300154 BITS_RGBA_FIXED(5, 5, 5, 0),
Daniel Stone903721a2017-04-04 17:54:20 +0100155 },
156 {
Pekka Paalanene7c91b62018-09-26 14:00:34 +0300157 DRM_FORMAT(BGRA5551),
Pekka Paalanenabd3f3c2019-09-27 14:33:46 +0300158 BITS_RGBA_FIXED(5, 5, 5, 1),
Daniel Stone903721a2017-04-04 17:54:20 +0100159 .opaque_substitute = DRM_FORMAT_BGRX5551,
160 },
161 {
Pekka Paalanene7c91b62018-09-26 14:00:34 +0300162 DRM_FORMAT(RGB565),
Pekka Paalanenabd3f3c2019-09-27 14:33:46 +0300163 BITS_RGBA_FIXED(5, 6, 5, 0),
Daniel Stone903721a2017-04-04 17:54:20 +0100164 .depth = 16,
165 .bpp = 16,
166# if __BYTE_ORDER == __LITTLE_ENDIAN
167 GL_FORMAT(GL_RGB),
168 GL_TYPE(GL_UNSIGNED_SHORT_5_6_5),
169#endif
170 },
171 {
Pekka Paalanene7c91b62018-09-26 14:00:34 +0300172 DRM_FORMAT(BGR565),
Pekka Paalanenabd3f3c2019-09-27 14:33:46 +0300173 BITS_RGBA_FIXED(5, 6, 5, 0),
Daniel Stone903721a2017-04-04 17:54:20 +0100174 },
175 {
Pekka Paalanene7c91b62018-09-26 14:00:34 +0300176 DRM_FORMAT(RGB888),
Pekka Paalanenabd3f3c2019-09-27 14:33:46 +0300177 BITS_RGBA_FIXED(8, 8, 8, 0),
Daniel Stone903721a2017-04-04 17:54:20 +0100178 },
179 {
Pekka Paalanene7c91b62018-09-26 14:00:34 +0300180 DRM_FORMAT(BGR888),
Pekka Paalanenabd3f3c2019-09-27 14:33:46 +0300181 BITS_RGBA_FIXED(8, 8, 8, 0),
Daniel Stone903721a2017-04-04 17:54:20 +0100182 GL_FORMAT(GL_RGB),
183 GL_TYPE(GL_UNSIGNED_BYTE),
184 },
185 {
Pekka Paalanene7c91b62018-09-26 14:00:34 +0300186 DRM_FORMAT(XRGB8888),
Pekka Paalanenabd3f3c2019-09-27 14:33:46 +0300187 BITS_RGBA_FIXED(8, 8, 8, 0),
Daniel Stone903721a2017-04-04 17:54:20 +0100188 .depth = 24,
189 .bpp = 32,
190 GL_FORMAT(GL_BGRA_EXT),
191 GL_TYPE(GL_UNSIGNED_BYTE),
192 },
193 {
Pekka Paalanene7c91b62018-09-26 14:00:34 +0300194 DRM_FORMAT(ARGB8888),
Pekka Paalanenabd3f3c2019-09-27 14:33:46 +0300195 BITS_RGBA_FIXED(8, 8, 8, 8),
Daniel Stone903721a2017-04-04 17:54:20 +0100196 .opaque_substitute = DRM_FORMAT_XRGB8888,
197 .depth = 32,
198 .bpp = 32,
199 GL_FORMAT(GL_BGRA_EXT),
200 GL_TYPE(GL_UNSIGNED_BYTE),
201 },
202 {
Pekka Paalanene7c91b62018-09-26 14:00:34 +0300203 DRM_FORMAT(XBGR8888),
Pekka Paalanenabd3f3c2019-09-27 14:33:46 +0300204 BITS_RGBA_FIXED(8, 8, 8, 0),
Daniel Stone903721a2017-04-04 17:54:20 +0100205 GL_FORMAT(GL_RGBA),
206 GL_TYPE(GL_UNSIGNED_BYTE),
207 },
208 {
Pekka Paalanene7c91b62018-09-26 14:00:34 +0300209 DRM_FORMAT(ABGR8888),
Pekka Paalanenabd3f3c2019-09-27 14:33:46 +0300210 BITS_RGBA_FIXED(8, 8, 8, 8),
Daniel Stone903721a2017-04-04 17:54:20 +0100211 .opaque_substitute = DRM_FORMAT_XBGR8888,
212 GL_FORMAT(GL_RGBA),
213 GL_TYPE(GL_UNSIGNED_BYTE),
214 },
215 {
Pekka Paalanene7c91b62018-09-26 14:00:34 +0300216 DRM_FORMAT(RGBX8888),
Pekka Paalanenabd3f3c2019-09-27 14:33:46 +0300217 BITS_RGBA_FIXED(8, 8, 8, 0),
Daniel Stone903721a2017-04-04 17:54:20 +0100218 },
219 {
Pekka Paalanene7c91b62018-09-26 14:00:34 +0300220 DRM_FORMAT(RGBA8888),
Pekka Paalanenabd3f3c2019-09-27 14:33:46 +0300221 BITS_RGBA_FIXED(8, 8, 8, 8),
Daniel Stone903721a2017-04-04 17:54:20 +0100222 .opaque_substitute = DRM_FORMAT_RGBX8888,
223 },
224 {
Pekka Paalanene7c91b62018-09-26 14:00:34 +0300225 DRM_FORMAT(BGRX8888),
Pekka Paalanenabd3f3c2019-09-27 14:33:46 +0300226 BITS_RGBA_FIXED(8, 8, 8, 0),
Daniel Stone903721a2017-04-04 17:54:20 +0100227 },
228 {
Pekka Paalanene7c91b62018-09-26 14:00:34 +0300229 DRM_FORMAT(BGRA8888),
Pekka Paalanenabd3f3c2019-09-27 14:33:46 +0300230 BITS_RGBA_FIXED(8, 8, 8, 8),
Daniel Stone903721a2017-04-04 17:54:20 +0100231 .opaque_substitute = DRM_FORMAT_BGRX8888,
232 },
233 {
Pekka Paalanene7c91b62018-09-26 14:00:34 +0300234 DRM_FORMAT(XRGB2101010),
Pekka Paalanenabd3f3c2019-09-27 14:33:46 +0300235 BITS_RGBA_FIXED(10, 10, 10, 0),
Daniel Stone903721a2017-04-04 17:54:20 +0100236 .depth = 30,
237 .bpp = 32,
238 },
239 {
Pekka Paalanene7c91b62018-09-26 14:00:34 +0300240 DRM_FORMAT(ARGB2101010),
Pekka Paalanenabd3f3c2019-09-27 14:33:46 +0300241 BITS_RGBA_FIXED(10, 10, 10, 2),
Daniel Stone903721a2017-04-04 17:54:20 +0100242 .opaque_substitute = DRM_FORMAT_XRGB2101010,
243 },
244 {
Pekka Paalanene7c91b62018-09-26 14:00:34 +0300245 DRM_FORMAT(XBGR2101010),
Pekka Paalanenabd3f3c2019-09-27 14:33:46 +0300246 BITS_RGBA_FIXED(10, 10, 10, 0),
Daniel Stone903721a2017-04-04 17:54:20 +0100247# if __BYTE_ORDER == __LITTLE_ENDIAN
248 GL_FORMAT(GL_RGBA),
249 GL_TYPE(GL_UNSIGNED_INT_2_10_10_10_REV_EXT),
250#endif
251 },
252 {
Pekka Paalanene7c91b62018-09-26 14:00:34 +0300253 DRM_FORMAT(ABGR2101010),
Pekka Paalanenabd3f3c2019-09-27 14:33:46 +0300254 BITS_RGBA_FIXED(10, 10, 10, 2),
Daniel Stone903721a2017-04-04 17:54:20 +0100255 .opaque_substitute = DRM_FORMAT_XBGR2101010,
256# if __BYTE_ORDER == __LITTLE_ENDIAN
257 GL_FORMAT(GL_RGBA),
258 GL_TYPE(GL_UNSIGNED_INT_2_10_10_10_REV_EXT),
259#endif
260 },
261 {
Pekka Paalanene7c91b62018-09-26 14:00:34 +0300262 DRM_FORMAT(RGBX1010102),
Pekka Paalanenabd3f3c2019-09-27 14:33:46 +0300263 BITS_RGBA_FIXED(10, 10, 10, 0),
Daniel Stone903721a2017-04-04 17:54:20 +0100264 },
265 {
Pekka Paalanene7c91b62018-09-26 14:00:34 +0300266 DRM_FORMAT(RGBA1010102),
Pekka Paalanenabd3f3c2019-09-27 14:33:46 +0300267 BITS_RGBA_FIXED(10, 10, 10, 2),
Daniel Stone903721a2017-04-04 17:54:20 +0100268 .opaque_substitute = DRM_FORMAT_RGBX1010102,
269 },
270 {
Pekka Paalanene7c91b62018-09-26 14:00:34 +0300271 DRM_FORMAT(BGRX1010102),
Pekka Paalanenabd3f3c2019-09-27 14:33:46 +0300272 BITS_RGBA_FIXED(10, 10, 10, 0),
Daniel Stone903721a2017-04-04 17:54:20 +0100273 },
274 {
Pekka Paalanene7c91b62018-09-26 14:00:34 +0300275 DRM_FORMAT(BGRA1010102),
Pekka Paalanenabd3f3c2019-09-27 14:33:46 +0300276 BITS_RGBA_FIXED(10, 10, 10, 2),
Daniel Stone903721a2017-04-04 17:54:20 +0100277 .opaque_substitute = DRM_FORMAT_BGRX1010102,
278 },
279 {
Pekka Paalanene7c91b62018-09-26 14:00:34 +0300280 DRM_FORMAT(YUYV),
Daniel Stone903721a2017-04-04 17:54:20 +0100281 SAMPLER_TYPE(EGL_TEXTURE_Y_XUXV_WL),
282 .num_planes = 1,
283 .hsub = 2,
284 },
285 {
Pekka Paalanene7c91b62018-09-26 14:00:34 +0300286 DRM_FORMAT(YVYU),
Daniel Stone903721a2017-04-04 17:54:20 +0100287 SAMPLER_TYPE(EGL_TEXTURE_Y_XUXV_WL),
288 .num_planes = 1,
289 .chroma_order = ORDER_VU,
290 .hsub = 2,
291 },
292 {
Pekka Paalanene7c91b62018-09-26 14:00:34 +0300293 DRM_FORMAT(UYVY),
Daniel Stone903721a2017-04-04 17:54:20 +0100294 SAMPLER_TYPE(EGL_TEXTURE_Y_XUXV_WL),
295 .num_planes = 1,
296 .luma_chroma_order = ORDER_CHROMA_LUMA,
297 .hsub = 2,
298 },
299 {
Pekka Paalanene7c91b62018-09-26 14:00:34 +0300300 DRM_FORMAT(VYUY),
Daniel Stone903721a2017-04-04 17:54:20 +0100301 SAMPLER_TYPE(EGL_TEXTURE_Y_XUXV_WL),
302 .num_planes = 1,
303 .luma_chroma_order = ORDER_CHROMA_LUMA,
304 .chroma_order = ORDER_VU,
305 .hsub = 2,
306 },
307 {
Pekka Paalanene7c91b62018-09-26 14:00:34 +0300308 DRM_FORMAT(NV12),
Daniel Stone903721a2017-04-04 17:54:20 +0100309 SAMPLER_TYPE(EGL_TEXTURE_Y_UV_WL),
310 .num_planes = 2,
311 .hsub = 2,
312 .vsub = 2,
313 },
314 {
Pekka Paalanene7c91b62018-09-26 14:00:34 +0300315 DRM_FORMAT(NV21),
Daniel Stone903721a2017-04-04 17:54:20 +0100316 SAMPLER_TYPE(EGL_TEXTURE_Y_UV_WL),
317 .num_planes = 2,
318 .chroma_order = ORDER_VU,
319 .hsub = 2,
320 .vsub = 2,
321 },
322 {
Pekka Paalanene7c91b62018-09-26 14:00:34 +0300323 DRM_FORMAT(NV16),
Daniel Stone903721a2017-04-04 17:54:20 +0100324 SAMPLER_TYPE(EGL_TEXTURE_Y_UV_WL),
325 .num_planes = 2,
326 .hsub = 2,
327 .vsub = 1,
328 },
329 {
Pekka Paalanene7c91b62018-09-26 14:00:34 +0300330 DRM_FORMAT(NV61),
Daniel Stone903721a2017-04-04 17:54:20 +0100331 SAMPLER_TYPE(EGL_TEXTURE_Y_UV_WL),
332 .num_planes = 2,
333 .chroma_order = ORDER_VU,
334 .hsub = 2,
335 .vsub = 1,
336 },
337 {
Pekka Paalanene7c91b62018-09-26 14:00:34 +0300338 DRM_FORMAT(NV24),
Daniel Stone903721a2017-04-04 17:54:20 +0100339 SAMPLER_TYPE(EGL_TEXTURE_Y_UV_WL),
340 .num_planes = 2,
341 },
342 {
Pekka Paalanene7c91b62018-09-26 14:00:34 +0300343 DRM_FORMAT(NV42),
Daniel Stone903721a2017-04-04 17:54:20 +0100344 SAMPLER_TYPE(EGL_TEXTURE_Y_UV_WL),
345 .num_planes = 2,
346 .chroma_order = ORDER_VU,
347 },
348 {
Pekka Paalanene7c91b62018-09-26 14:00:34 +0300349 DRM_FORMAT(YUV410),
Daniel Stone903721a2017-04-04 17:54:20 +0100350 SAMPLER_TYPE(EGL_TEXTURE_Y_U_V_WL),
351 .num_planes = 3,
352 .hsub = 4,
353 .vsub = 4,
354 },
355 {
Pekka Paalanene7c91b62018-09-26 14:00:34 +0300356 DRM_FORMAT(YVU410),
Daniel Stone903721a2017-04-04 17:54:20 +0100357 SAMPLER_TYPE(EGL_TEXTURE_Y_U_V_WL),
358 .num_planes = 3,
359 .chroma_order = ORDER_VU,
360 .hsub = 4,
361 .vsub = 4,
362 },
363 {
Pekka Paalanene7c91b62018-09-26 14:00:34 +0300364 DRM_FORMAT(YUV411),
Daniel Stone903721a2017-04-04 17:54:20 +0100365 SAMPLER_TYPE(EGL_TEXTURE_Y_U_V_WL),
366 .num_planes = 3,
367 .hsub = 4,
368 .vsub = 1,
369 },
370 {
Pekka Paalanene7c91b62018-09-26 14:00:34 +0300371 DRM_FORMAT(YVU411),
Daniel Stone903721a2017-04-04 17:54:20 +0100372 SAMPLER_TYPE(EGL_TEXTURE_Y_U_V_WL),
373 .num_planes = 3,
374 .chroma_order = ORDER_VU,
375 .hsub = 4,
376 .vsub = 1,
377 },
378 {
Pekka Paalanene7c91b62018-09-26 14:00:34 +0300379 DRM_FORMAT(YUV420),
Daniel Stone903721a2017-04-04 17:54:20 +0100380 SAMPLER_TYPE(EGL_TEXTURE_Y_U_V_WL),
381 .num_planes = 3,
382 .hsub = 2,
383 .vsub = 2,
384 },
385 {
Pekka Paalanene7c91b62018-09-26 14:00:34 +0300386 DRM_FORMAT(YVU420),
Daniel Stone903721a2017-04-04 17:54:20 +0100387 SAMPLER_TYPE(EGL_TEXTURE_Y_U_V_WL),
388 .num_planes = 3,
389 .chroma_order = ORDER_VU,
390 .hsub = 2,
391 .vsub = 2,
392 },
393 {
Pekka Paalanene7c91b62018-09-26 14:00:34 +0300394 DRM_FORMAT(YUV422),
Daniel Stone903721a2017-04-04 17:54:20 +0100395 SAMPLER_TYPE(EGL_TEXTURE_Y_U_V_WL),
396 .num_planes = 3,
397 .hsub = 2,
398 .vsub = 1,
399 },
400 {
Pekka Paalanene7c91b62018-09-26 14:00:34 +0300401 DRM_FORMAT(YVU422),
Daniel Stone903721a2017-04-04 17:54:20 +0100402 SAMPLER_TYPE(EGL_TEXTURE_Y_U_V_WL),
403 .num_planes = 3,
404 .chroma_order = ORDER_VU,
405 .hsub = 2,
406 .vsub = 1,
407 },
408 {
Pekka Paalanene7c91b62018-09-26 14:00:34 +0300409 DRM_FORMAT(YUV444),
Daniel Stone903721a2017-04-04 17:54:20 +0100410 SAMPLER_TYPE(EGL_TEXTURE_Y_U_V_WL),
411 .num_planes = 3,
412 },
413 {
Pekka Paalanene7c91b62018-09-26 14:00:34 +0300414 DRM_FORMAT(YVU444),
Daniel Stone903721a2017-04-04 17:54:20 +0100415 SAMPLER_TYPE(EGL_TEXTURE_Y_U_V_WL),
416 .num_planes = 3,
417 .chroma_order = ORDER_VU,
418 },
419};
420
421WL_EXPORT const struct pixel_format_info *
Marius Vlada9a63042018-11-20 17:04:57 +0200422pixel_format_get_info_shm(uint32_t format)
423{
424 if (format == WL_SHM_FORMAT_XRGB8888)
425 return pixel_format_get_info(DRM_FORMAT_XRGB8888);
426 else if (format == WL_SHM_FORMAT_ARGB8888)
427 return pixel_format_get_info(DRM_FORMAT_ARGB8888);
428 else
429 return pixel_format_get_info(format);
430}
431
432WL_EXPORT const struct pixel_format_info *
Daniel Stone903721a2017-04-04 17:54:20 +0100433pixel_format_get_info(uint32_t format)
434{
435 unsigned int i;
436
437 for (i = 0; i < ARRAY_LENGTH(pixel_format_table); i++) {
438 if (pixel_format_table[i].format == format)
439 return &pixel_format_table[i];
440 }
441
442 return NULL;
443}
444
Pekka Paalanenf5ed7432018-09-26 14:26:53 +0300445WL_EXPORT const struct pixel_format_info *
446pixel_format_get_info_by_drm_name(const char *drm_format_name)
447{
448 const struct pixel_format_info *info;
449 unsigned int i;
450
451 for (i = 0; i < ARRAY_LENGTH(pixel_format_table); i++) {
452 info = &pixel_format_table[i];
453 if (strcasecmp(info->drm_format_name, drm_format_name) == 0)
454 return info;
455 }
456
457 return NULL;
458}
459
Daniel Stone903721a2017-04-04 17:54:20 +0100460WL_EXPORT unsigned int
461pixel_format_get_plane_count(const struct pixel_format_info *info)
462{
463 return info->num_planes ? info->num_planes : 1;
464}
465
466WL_EXPORT bool
467pixel_format_is_opaque(const struct pixel_format_info *info)
468{
469 return !info->opaque_substitute;
470}
471
Daniel Stone903721a2017-04-04 17:54:20 +0100472WL_EXPORT const struct pixel_format_info *
473pixel_format_get_opaque_substitute(const struct pixel_format_info *info)
474{
475 if (!info->opaque_substitute)
476 return info;
477 else
478 return pixel_format_get_info(info->opaque_substitute);
479}
480
Pekka Paalanen8ba775d2019-09-13 14:44:24 +0300481WL_EXPORT const struct pixel_format_info *
482pixel_format_get_info_by_opaque_substitute(uint32_t format)
483{
484 unsigned int i;
485
486 for (i = 0; i < ARRAY_LENGTH(pixel_format_table); i++) {
487 if (pixel_format_table[i].opaque_substitute == format)
488 return &pixel_format_table[i];
489 }
490
491 return NULL;
492}
493
Daniel Stone903721a2017-04-04 17:54:20 +0100494WL_EXPORT unsigned int
495pixel_format_width_for_plane(const struct pixel_format_info *info,
496 unsigned int plane,
497 unsigned int width)
498{
499 /* We don't support any formats where the first plane is subsampled. */
500 if (plane == 0 || !info->hsub)
501 return width;
502
503 return width / info->hsub;
504}
505
506WL_EXPORT unsigned int
507pixel_format_height_for_plane(const struct pixel_format_info *info,
508 unsigned int plane,
509 unsigned int height)
510{
511 /* We don't support any formats where the first plane is subsampled. */
512 if (plane == 0 || !info->vsub)
513 return height;
514
515 return height / info->vsub;
516}