Skip to content

Commit ff74590

Browse files
authored
[Wayland] Add wl_shm support for 10 bpc formats and wl_shm/DMA-BUF su… (#748)
* [Wayland] Add wl_shm support for 10 bpc formats and wl_shm/DMA-BUF support for 16 bpc half float formats This makes it possible to create 10 bpc as well as 16 bpc wl_shm buffers (e.g. WL_SHM_FORMAT_ABGR2101010 and WL_SHM_FORMAT_ABGR16161616F). Adapted from Mutter: https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/804 * Update libmuffin0.symbols
1 parent a5ef2fc commit ff74590

17 files changed

+523
-42
lines changed

cogl/cogl/cogl-bitmap-conversion.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -351,6 +351,14 @@ _cogl_bitmap_needs_short_temp_buffer (CoglPixelFormat format)
351351
case COGL_PIXEL_FORMAT_BGRA_1010102_PRE:
352352
case COGL_PIXEL_FORMAT_ARGB_2101010_PRE:
353353
case COGL_PIXEL_FORMAT_ABGR_2101010_PRE:
354+
case COGL_PIXEL_FORMAT_RGBA_FP_16161616:
355+
case COGL_PIXEL_FORMAT_BGRA_FP_16161616:
356+
case COGL_PIXEL_FORMAT_ARGB_FP_16161616:
357+
case COGL_PIXEL_FORMAT_ABGR_FP_16161616:
358+
case COGL_PIXEL_FORMAT_RGBA_FP_16161616_PRE:
359+
case COGL_PIXEL_FORMAT_BGRA_FP_16161616_PRE:
360+
case COGL_PIXEL_FORMAT_ARGB_FP_16161616_PRE:
361+
case COGL_PIXEL_FORMAT_ABGR_FP_16161616_PRE:
354362
return TRUE;
355363
}
356364

cogl/cogl/cogl-bitmap-packing.h

Lines changed: 63 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -40,13 +40,13 @@
4040
#define UNPACK_2(b) (((b) * ((1 << (sizeof (component_type) * 8)) - 1) + \
4141
1) / 3)
4242
#define UNPACK_4(b) (((b) * ((1 << (sizeof (component_type) * 8)) - 1) + \
43-
7) / 15)
43+
7) / 0xf)
4444
#define UNPACK_5(b) (((b) * ((1 << (sizeof (component_type) * 8)) - 1) + \
45-
15) / 31)
45+
0xf) / 0x1f)
4646
#define UNPACK_6(b) (((b) * ((1 << (sizeof (component_type) * 8)) - 1) + \
47-
31) / 63)
47+
0x1f) / 0x3f)
4848
#define UNPACK_10(b) (((b) * ((1 << (sizeof (component_type) * 8)) - 1) + \
49-
511) / 1023)
49+
0x1ff) / 0x3ff)
5050

5151
inline static void
5252
G_PASTE (_cogl_unpack_a_8_, component_size) (const uint8_t *src,
@@ -207,8 +207,8 @@ G_PASTE (_cogl_unpack_rgb_565_, component_size) (const uint8_t *src,
207207
uint16_t v = *(const uint16_t *) src;
208208

209209
dst[0] = UNPACK_5 (v >> 11);
210-
dst[1] = UNPACK_6 ((v >> 5) & 63);
211-
dst[2] = UNPACK_5 (v & 31);
210+
dst[1] = UNPACK_6 ((v >> 5) & 0x3f);
211+
dst[2] = UNPACK_5 (v & 0x1f);
212212
dst[3] = UNPACK_BYTE (255);
213213
dst += 4;
214214
src += 2;
@@ -225,9 +225,9 @@ G_PASTE (_cogl_unpack_rgba_4444_, component_size) (const uint8_t *src,
225225
uint16_t v = *(const uint16_t *) src;
226226

227227
dst[0] = UNPACK_4 (v >> 12);
228-
dst[1] = UNPACK_4 ((v >> 8) & 15);
229-
dst[2] = UNPACK_4 ((v >> 4) & 15);
230-
dst[3] = UNPACK_4 (v & 15);
228+
dst[1] = UNPACK_4 ((v >> 8) & 0xf);
229+
dst[2] = UNPACK_4 ((v >> 4) & 0xf);
230+
dst[3] = UNPACK_4 (v & 0xf);
231231
dst += 4;
232232
src += 2;
233233
}
@@ -243,8 +243,8 @@ G_PASTE (_cogl_unpack_rgba_5551_, component_size) (const uint8_t *src,
243243
uint16_t v = *(const uint16_t *) src;
244244

245245
dst[0] = UNPACK_5 (v >> 11);
246-
dst[1] = UNPACK_5 ((v >> 6) & 31);
247-
dst[2] = UNPACK_5 ((v >> 1) & 31);
246+
dst[1] = UNPACK_5 ((v >> 6) & 0x1f);
247+
dst[2] = UNPACK_5 ((v >> 1) & 0x1f);
248248
dst[3] = UNPACK_1 (v & 1);
249249
dst += 4;
250250
src += 2;
@@ -261,8 +261,8 @@ G_PASTE (_cogl_unpack_rgba_1010102_, component_size) (const uint8_t *src,
261261
uint32_t v = *(const uint32_t *) src;
262262

263263
dst[0] = UNPACK_10 (v >> 22);
264-
dst[1] = UNPACK_10 ((v >> 12) & 1023);
265-
dst[2] = UNPACK_10 ((v >> 2) & 1023);
264+
dst[1] = UNPACK_10 ((v >> 12) & 0x3ff);
265+
dst[2] = UNPACK_10 ((v >> 2) & 0x3ff);
266266
dst[3] = UNPACK_2 (v & 3);
267267
dst += 4;
268268
src += 2;
@@ -279,8 +279,8 @@ G_PASTE (_cogl_unpack_bgra_1010102_, component_size) (const uint8_t *src,
279279
uint32_t v = *(const uint32_t *) src;
280280

281281
dst[2] = UNPACK_10 (v >> 22);
282-
dst[1] = UNPACK_10 ((v >> 12) & 1023);
283-
dst[0] = UNPACK_10 ((v >> 2) & 1023);
282+
dst[1] = UNPACK_10 ((v >> 12) & 0x3ff);
283+
dst[0] = UNPACK_10 ((v >> 2) & 0x3ff);
284284
dst[3] = UNPACK_2 (v & 3);
285285
dst += 4;
286286
src += 2;
@@ -297,9 +297,9 @@ G_PASTE (_cogl_unpack_argb_2101010_, component_size) (const uint8_t *src,
297297
uint32_t v = *(const uint32_t *) src;
298298

299299
dst[3] = UNPACK_2 (v >> 30);
300-
dst[0] = UNPACK_10 ((v >> 20) & 1023);
301-
dst[1] = UNPACK_10 ((v >> 10) & 1023);
302-
dst[2] = UNPACK_10 (v & 1023);
300+
dst[0] = UNPACK_10 ((v >> 20) & 0x3ff);
301+
dst[1] = UNPACK_10 ((v >> 10) & 0x3ff);
302+
dst[2] = UNPACK_10 (v & 0x3ff);
303303
dst += 4;
304304
src += 2;
305305
}
@@ -315,14 +315,22 @@ G_PASTE (_cogl_unpack_abgr_2101010_, component_size) (const uint8_t *src,
315315
uint32_t v = *(const uint32_t *) src;
316316

317317
dst[3] = UNPACK_2 (v >> 30);
318-
dst[2] = UNPACK_10 ((v >> 20) & 1023);
319-
dst[1] = UNPACK_10 ((v >> 10) & 1023);
320-
dst[0] = UNPACK_10 (v & 1023);
318+
dst[2] = UNPACK_10 ((v >> 20) & 0x3ff);
319+
dst[1] = UNPACK_10 ((v >> 10) & 0x3ff);
320+
dst[0] = UNPACK_10 (v & 0x3ff);
321321
dst += 4;
322322
src += 2;
323323
}
324324
}
325325

326+
inline static void
327+
G_PASTE (_cogl_unpack_argb_fp_16161616_, component_size) (const uint8_t *src,
328+
component_type *dst,
329+
int width)
330+
{
331+
g_warning ("Not implemented");
332+
}
333+
326334
#undef UNPACK_1
327335
#undef UNPACK_2
328336
#undef UNPACK_4
@@ -396,6 +404,16 @@ G_PASTE (_cogl_unpack_, component_size) (CoglPixelFormat format,
396404
case COGL_PIXEL_FORMAT_ABGR_2101010_PRE:
397405
G_PASTE (_cogl_unpack_abgr_2101010_, component_size) (src, dst, width);
398406
break;
407+
case COGL_PIXEL_FORMAT_RGBA_FP_16161616:
408+
case COGL_PIXEL_FORMAT_BGRA_FP_16161616:
409+
case COGL_PIXEL_FORMAT_ARGB_FP_16161616:
410+
case COGL_PIXEL_FORMAT_ABGR_FP_16161616:
411+
case COGL_PIXEL_FORMAT_RGBA_FP_16161616_PRE:
412+
case COGL_PIXEL_FORMAT_BGRA_FP_16161616_PRE:
413+
case COGL_PIXEL_FORMAT_ARGB_FP_16161616_PRE:
414+
case COGL_PIXEL_FORMAT_ABGR_FP_16161616_PRE:
415+
G_PASTE (_cogl_unpack_argb_fp_16161616_, component_size) (src, dst, width);
416+
break;
399417
case COGL_PIXEL_FORMAT_DEPTH_16:
400418
case COGL_PIXEL_FORMAT_DEPTH_32:
401419
case COGL_PIXEL_FORMAT_DEPTH_24_STENCIL_8:
@@ -414,10 +432,10 @@ G_PASTE (_cogl_unpack_, component_size) (CoglPixelFormat format,
414432

415433
#define PACK_1(b) PACK_SIZE (b, 1)
416434
#define PACK_2(b) PACK_SIZE (b, 3)
417-
#define PACK_4(b) PACK_SIZE (b, 15)
418-
#define PACK_5(b) PACK_SIZE (b, 31)
419-
#define PACK_6(b) PACK_SIZE (b, 63)
420-
#define PACK_10(b) PACK_SIZE (b, 1023)
435+
#define PACK_4(b) PACK_SIZE (b, 0xf)
436+
#define PACK_5(b) PACK_SIZE (b, 0x1f)
437+
#define PACK_6(b) PACK_SIZE (b, 0x3f)
438+
#define PACK_10(b) PACK_SIZE (b, 0x3ff)
421439

422440
inline static void
423441
G_PASTE (_cogl_pack_a_8_, component_size) (const component_type *src,
@@ -432,6 +450,16 @@ G_PASTE (_cogl_pack_a_8_, component_size) (const component_type *src,
432450
}
433451
}
434452

453+
inline static void
454+
455+
456+
G_PASTE (_cogl_pack_argb_fp_16161616_, component_size) (const component_type *src,
457+
uint8_t *dst,
458+
int width)
459+
{
460+
g_warning ("Not implemented");
461+
}
462+
435463
inline static void
436464
G_PASTE (_cogl_pack_g_8_, component_size) (const component_type *src,
437465
uint8_t *dst,
@@ -757,6 +785,16 @@ G_PASTE (_cogl_pack_, component_size) (CoglPixelFormat format,
757785
case COGL_PIXEL_FORMAT_ABGR_2101010_PRE:
758786
G_PASTE (_cogl_pack_abgr_2101010_, component_size) (src, dst, width);
759787
break;
788+
case COGL_PIXEL_FORMAT_RGBA_FP_16161616:
789+
case COGL_PIXEL_FORMAT_BGRA_FP_16161616:
790+
case COGL_PIXEL_FORMAT_ARGB_FP_16161616:
791+
case COGL_PIXEL_FORMAT_ABGR_FP_16161616:
792+
case COGL_PIXEL_FORMAT_RGBA_FP_16161616_PRE:
793+
case COGL_PIXEL_FORMAT_BGRA_FP_16161616_PRE:
794+
case COGL_PIXEL_FORMAT_ARGB_FP_16161616_PRE:
795+
case COGL_PIXEL_FORMAT_ABGR_FP_16161616_PRE:
796+
G_PASTE (_cogl_pack_argb_fp_16161616_, component_size) (src, dst, width);
797+
break;
760798
case COGL_PIXEL_FORMAT_DEPTH_16:
761799
case COGL_PIXEL_FORMAT_DEPTH_32:
762800
case COGL_PIXEL_FORMAT_DEPTH_24_STENCIL_8:

cogl/cogl/cogl-context.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030

3131
#include "cogl-config.h"
3232

33+
#include "cogl-muffin.h"
3334
#include "cogl-object.h"
3435
#include "cogl-private.h"
3536
#include "cogl-profile.h"
@@ -616,3 +617,10 @@ cogl_get_graphics_reset_status (CoglContext *context)
616617
return COGL_GRAPHICS_RESET_STATUS_NO_ERROR;
617618
}
618619
}
620+
621+
gboolean
622+
cogl_context_format_supports_upload (CoglContext *ctx,
623+
CoglPixelFormat format)
624+
{
625+
return ctx->texture_driver->format_supports_upload (ctx, format);
626+
}

cogl/cogl/cogl-muffin.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,4 +48,8 @@ void cogl_renderer_set_custom_winsys (CoglRenderer *renderer,
4848
CoglCustomWinsysVtableGetter winsys_vtable_getter,
4949
void *user_data);
5050

51+
COGL_EXPORT
52+
gboolean cogl_context_format_supports_upload (CoglContext *ctx,
53+
CoglPixelFormat format);
54+
5155
#endif /* __COGL_MUFFIN_H___ */

cogl/cogl/cogl-pixel-format.c

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,62 @@ static const CoglPixelFormatInfo format_info_table[] = {
245245
.aligned = 0,
246246
.bpp = { 4 },
247247
},
248+
{
249+
.cogl_format = COGL_PIXEL_FORMAT_RGBA_FP_16161616,
250+
.format_str = "RGBA_FP_16161616",
251+
.n_planes = 1,
252+
.bpp = { 8 },
253+
.aligned = 1
254+
},
255+
{
256+
.cogl_format = COGL_PIXEL_FORMAT_BGRA_FP_16161616,
257+
.format_str = "BGRA_FP_16161616",
258+
.n_planes = 1,
259+
.bpp = { 8 },
260+
.aligned = 1
261+
},
262+
{
263+
.cogl_format = COGL_PIXEL_FORMAT_ARGB_FP_16161616,
264+
.format_str = "ARGB_FP_16161616",
265+
.n_planes = 1,
266+
.bpp = { 8 },
267+
.aligned = 1
268+
},
269+
{
270+
.cogl_format = COGL_PIXEL_FORMAT_ABGR_FP_16161616,
271+
.format_str = "ABGR_FP_16161616",
272+
.n_planes = 1,
273+
.bpp = { 8 },
274+
.aligned = 1
275+
},
276+
{
277+
.cogl_format = COGL_PIXEL_FORMAT_RGBA_FP_16161616_PRE,
278+
.format_str = "RGBA_FP_16161616_PRE",
279+
.n_planes = 1,
280+
.bpp = { 8 },
281+
.aligned = 1
282+
},
283+
{
284+
.cogl_format = COGL_PIXEL_FORMAT_BGRA_FP_16161616_PRE,
285+
.format_str = "BGRA_FP_16161616_PRE",
286+
.n_planes = 1,
287+
.bpp = { 8 },
288+
.aligned = 1
289+
},
290+
{
291+
.cogl_format = COGL_PIXEL_FORMAT_ARGB_FP_16161616_PRE,
292+
.format_str = "ARGB_FP_16161616_PRE",
293+
.n_planes = 1,
294+
.bpp = { 8 },
295+
.aligned = 1
296+
},
297+
{
298+
.cogl_format = COGL_PIXEL_FORMAT_ABGR_FP_16161616_PRE,
299+
.format_str = "ABGR_FP_16161616_PRE",
300+
.n_planes = 1,
301+
.bpp = { 8 },
302+
.aligned = 1
303+
},
248304
{
249305
.cogl_format = COGL_PIXEL_FORMAT_DEPTH_16,
250306
.format_str = "DEPTH_16",

cogl/cogl/cogl-pixel-format.h

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ G_BEGIN_DECLS
103103
* 7 = YUV: undefined bpp, undefined alignment
104104
* 9 = 2 bpp, aligned
105105
* 10 = depth, aligned (8, 16, 24, 32, 32f)
106-
* 11 = undefined
106+
* 11 = 8 bpp fp16
107107
* 12 = 3 bpp, not aligned
108108
* 13 = 4 bpp, not aligned (e.g. 2101010)
109109
* 14-15 = undefined
@@ -168,6 +168,14 @@ G_BEGIN_DECLS
168168
* @COGL_PIXEL_FORMAT_BGRA_1010102_PRE: Premultiplied BGRA, 32 bits, 10 bpc
169169
* @COGL_PIXEL_FORMAT_ARGB_2101010_PRE: Premultiplied ARGB, 32 bits, 10 bpc
170170
* @COGL_PIXEL_FORMAT_ABGR_2101010_PRE: Premultiplied ABGR, 32 bits, 10 bpc
171+
* @COGL_PIXEL_FORMAT_RGBA_FP_16161616: RGBA half floating point, 64 bit
172+
* @COGL_PIXEL_FORMAT_BGRA_FP_16161616: BGRA half floating point, 64 bit
173+
* @COGL_PIXEL_FORMAT_ARGB_FP_16161616: ARGB half floating point, 64 bit
174+
* @COGL_PIXEL_FORMAT_ABGR_FP_16161616: ABGR half floating point, 64 bit
175+
* @COGL_PIXEL_FORMAT_RGBA_FP_16161616_PRE: Premultiplied RGBA half floating point, 64 bit
176+
* @COGL_PIXEL_FORMAT_BGRA_FP_16161616_PRE: Premultiplied BGRA half floating point, 64 bit
177+
* @COGL_PIXEL_FORMAT_ARGB_FP_16161616_PRE: Premultiplied ARGB half floating point, 64 bit
178+
* @COGL_PIXEL_FORMAT_ABGR_FP_16161616_PRE: Premultiplied ABGR half floating point, 64 bit
171179
*
172180
* Pixel formats used by Cogl. For the formats with a byte per
173181
* component, the order of the components specify the order in
@@ -216,6 +224,11 @@ typedef enum /*< prefix=COGL_PIXEL_FORMAT >*/
216224
COGL_PIXEL_FORMAT_ARGB_2101010 = (13 | COGL_A_BIT | COGL_AFIRST_BIT),
217225
COGL_PIXEL_FORMAT_ABGR_2101010 = (13 | COGL_A_BIT | COGL_BGR_BIT | COGL_AFIRST_BIT),
218226

227+
COGL_PIXEL_FORMAT_RGBA_FP_16161616 = (11 | COGL_A_BIT),
228+
COGL_PIXEL_FORMAT_BGRA_FP_16161616 = (11 | COGL_A_BIT | COGL_BGR_BIT),
229+
COGL_PIXEL_FORMAT_ARGB_FP_16161616 = (11 | COGL_A_BIT | COGL_AFIRST_BIT),
230+
COGL_PIXEL_FORMAT_ABGR_FP_16161616 = (11 | COGL_A_BIT | COGL_BGR_BIT | COGL_AFIRST_BIT),
231+
219232
COGL_PIXEL_FORMAT_RGBA_8888_PRE = (3 | COGL_A_BIT | COGL_PREMULT_BIT),
220233
COGL_PIXEL_FORMAT_BGRA_8888_PRE = (3 | COGL_A_BIT | COGL_PREMULT_BIT | COGL_BGR_BIT),
221234
COGL_PIXEL_FORMAT_ARGB_8888_PRE = (3 | COGL_A_BIT | COGL_PREMULT_BIT | COGL_AFIRST_BIT),
@@ -228,6 +241,11 @@ typedef enum /*< prefix=COGL_PIXEL_FORMAT >*/
228241
COGL_PIXEL_FORMAT_ARGB_2101010_PRE = (COGL_PIXEL_FORMAT_ARGB_2101010 | COGL_PREMULT_BIT),
229242
COGL_PIXEL_FORMAT_ABGR_2101010_PRE = (COGL_PIXEL_FORMAT_ABGR_2101010 | COGL_PREMULT_BIT),
230243

244+
COGL_PIXEL_FORMAT_RGBA_FP_16161616_PRE = (11 | COGL_A_BIT | COGL_PREMULT_BIT),
245+
COGL_PIXEL_FORMAT_BGRA_FP_16161616_PRE = (11 | COGL_A_BIT | COGL_PREMULT_BIT | COGL_BGR_BIT),
246+
COGL_PIXEL_FORMAT_ARGB_FP_16161616_PRE = (11 | COGL_A_BIT | COGL_PREMULT_BIT | COGL_AFIRST_BIT),
247+
COGL_PIXEL_FORMAT_ABGR_FP_16161616_PRE = (11 | COGL_A_BIT | COGL_PREMULT_BIT | COGL_BGR_BIT | COGL_AFIRST_BIT),
248+
231249
COGL_PIXEL_FORMAT_DEPTH_16 = (9 | COGL_DEPTH_BIT),
232250
COGL_PIXEL_FORMAT_DEPTH_32 = (3 | COGL_DEPTH_BIT),
233251

cogl/cogl/cogl-private.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,8 @@ typedef enum
4747
COGL_PRIVATE_FEATURE_EXT_PACKED_DEPTH_STENCIL,
4848
COGL_PRIVATE_FEATURE_OES_PACKED_DEPTH_STENCIL,
4949
COGL_PRIVATE_FEATURE_TEXTURE_FORMAT_BGRA8888,
50+
COGL_PRIVATE_FEATURE_TEXTURE_FORMAT_RGBA1010102,
51+
COGL_PRIVATE_FEATURE_TEXTURE_FORMAT_HALF_FLOAT,
5052
COGL_PRIVATE_FEATURE_UNPACK_SUBIMAGE,
5153
COGL_PRIVATE_FEATURE_SAMPLER_OBJECTS,
5254
COGL_PRIVATE_FEATURE_READ_PIXELS_ANY_FORMAT,

cogl/cogl/cogl-texture-driver.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,10 @@ struct _CoglTextureDriver
128128
int width,
129129
int height);
130130

131+
gboolean
132+
(* format_supports_upload) (CoglContext *ctx,
133+
CoglPixelFormat format);
134+
131135
/*
132136
* The driver may impose constraints on what formats can be used to store
133137
* texture data read from textures. For example GLES currently only supports

0 commit comments

Comments
 (0)