gl-renderer: Add wl_shm support to all declared RGB pixel formats

Support more RGB formats using texture swizzles. Automatise wl_shm
format addition based on the format table using the new texture format
utility gl_texture_is_format_supported().

Signed-off-by: Loïc Molinari <loic.molinari@collabora.com>
This commit is contained in:
Loïc Molinari 2024-11-11 15:40:06 +01:00 committed by Daniel Stone
parent da393fd468
commit 5e267afa6d
2 changed files with 70 additions and 26 deletions

View file

@ -51,15 +51,21 @@
#include <GLES2/gl2ext.h>
#include <GLES3/gl3.h>
#define SWIZZLES_A1GB { GL_ALPHA, GL_ONE, GL_GREEN, GL_BLUE }
#define SWIZZLES_ABG1 { GL_ALPHA, GL_BLUE, GL_GREEN, GL_ONE }
#define SWIZZLES_ABGR { GL_ALPHA, GL_BLUE, GL_GREEN, GL_RED }
#define SWIZZLES_ARGB { GL_ALPHA, GL_RED, GL_GREEN, GL_BLUE }
#define SWIZZLES_B1RG { GL_BLUE, GL_ONE, GL_RED, GL_GREEN }
#define SWIZZLES_BARG { GL_BLUE, GL_ALPHA, GL_RED, GL_GREEN }
#define SWIZZLES_BGR1 { GL_BLUE, GL_GREEN, GL_RED, GL_ONE }
#define SWIZZLES_BGRA { GL_BLUE, GL_GREEN, GL_RED, GL_ALPHA }
#define SWIZZLES_G1AB { GL_GREEN, GL_ONE, GL_ALPHA, GL_BLUE }
#define SWIZZLES_GBA1 { GL_GREEN, GL_BLUE, GL_ALPHA, GL_ONE }
#define SWIZZLES_GBAR { GL_GREEN, GL_BLUE, GL_ALPHA, GL_RED }
#define SWIZZLES_GRAB { GL_GREEN, GL_RED, GL_ALPHA, GL_BLUE }
#define SWIZZLES_R001 { GL_RED, GL_ZERO, GL_ZERO, GL_ONE }
#define SWIZZLES_R1BG { GL_RED, GL_ONE, GL_BLUE, GL_GREEN }
#define SWIZZLES_RABG { GL_RED, GL_ALPHA, GL_BLUE, GL_GREEN }
#define SWIZZLES_RG01 { GL_RED, GL_GREEN, GL_ZERO, GL_ONE }
#define SWIZZLES_RGB1 { GL_RED, GL_GREEN, GL_BLUE, GL_ONE }
#define SWIZZLES_RGBA { GL_RED, GL_GREEN, GL_BLUE, GL_ALPHA }
@ -135,23 +141,43 @@ static const struct pixel_format_info pixel_format_table[] = {
DRM_FORMAT(XRGB4444),
BITS_RGBA_FIXED(4, 4, 4, 0),
.bpp = 16,
#if __BYTE_ORDER == __LITTLE_ENDIAN
GL_FORMAT_INFO(GL_RGBA4, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4, GBA1),
#else
GL_FORMAT_INFO(GL_RGBA4, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4, A1GB),
#endif
},
{
DRM_FORMAT(ARGB4444),
BITS_RGBA_FIXED(4, 4, 4, 4),
.bpp = 16,
.opaque_substitute = DRM_FORMAT_XRGB4444,
#if __BYTE_ORDER == __LITTLE_ENDIAN
GL_FORMAT_INFO(GL_RGBA4, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4, GBAR),
#else
GL_FORMAT_INFO(GL_RGBA4, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4, ARGB),
#endif
},
{
DRM_FORMAT(XBGR4444),
BITS_RGBA_FIXED(4, 4, 4, 0),
.bpp = 16,
#if __BYTE_ORDER == __LITTLE_ENDIAN
GL_FORMAT_INFO(GL_RGBA4, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4, ABG1),
#else
GL_FORMAT_INFO(GL_RGBA4, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4, G1AB),
#endif
},
{
DRM_FORMAT(ABGR4444),
BITS_RGBA_FIXED(4, 4, 4, 4),
.bpp = 16,
.opaque_substitute = DRM_FORMAT_XBGR4444,
#if __BYTE_ORDER == __LITTLE_ENDIAN
GL_FORMAT_INFO(GL_RGBA4, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4, ABGR),
#else
GL_FORMAT_INFO(GL_RGBA4, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4, GRAB),
#endif
},
{
DRM_FORMAT(RGBX4444),
@ -182,12 +208,22 @@ static const struct pixel_format_info pixel_format_table[] = {
DRM_FORMAT(BGRX4444),
BITS_RGBA_FIXED(4, 4, 4, 0),
.bpp = 16,
#if __BYTE_ORDER == __LITTLE_ENDIAN
GL_FORMAT_INFO(GL_RGBA4, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4, BGR1),
#else
GL_FORMAT_INFO(GL_RGBA4, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4, R1BG),
#endif
},
{
DRM_FORMAT(BGRA4444),
BITS_RGBA_FIXED(4, 4, 4, 4),
.bpp = 16,
.opaque_substitute = DRM_FORMAT_BGRX4444,
#if __BYTE_ORDER == __LITTLE_ENDIAN
GL_FORMAT_INFO(GL_RGBA4, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4, BGRA),
#else
GL_FORMAT_INFO(GL_RGBA4, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4, RABG),
#endif
},
{
DRM_FORMAT(XRGB1555),
@ -237,12 +273,18 @@ static const struct pixel_format_info pixel_format_table[] = {
DRM_FORMAT(BGRX5551),
BITS_RGBA_FIXED(5, 5, 5, 0),
.bpp = 16,
#if __BYTE_ORDER == __LITTLE_ENDIAN
GL_FORMAT_INFO(GL_RGB5_A1, GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1, BGR1),
#endif
},
{
DRM_FORMAT(BGRA5551),
BITS_RGBA_FIXED(5, 5, 5, 1),
.bpp = 16,
.opaque_substitute = DRM_FORMAT_BGRX5551,
#if __BYTE_ORDER == __LITTLE_ENDIAN
GL_FORMAT_INFO(GL_RGB5_A1, GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1, BGRA),
#endif
},
{
DRM_FORMAT(RGB565),
@ -260,6 +302,9 @@ static const struct pixel_format_info pixel_format_table[] = {
DRM_FORMAT(BGR565),
BITS_RGBA_FIXED(5, 6, 5, 0),
.bpp = 16,
#if __BYTE_ORDER == __LITTLE_ENDIAN
GL_FORMAT_INFO(GL_RGB565, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, BGR1),
#endif
},
{
DRM_FORMAT(RGB888),
@ -502,12 +547,14 @@ static const struct pixel_format_info pixel_format_table[] = {
DRM_FORMAT(XRGB16161616F),
BITS_RGBA_FLOAT(16, 16, 16, 0),
.bpp = 64,
GL_FORMAT_INFO(GL_RGBA16F, GL_RGBA, GL_HALF_FLOAT, BGR1),
},
{
DRM_FORMAT(ARGB16161616F),
BITS_RGBA_FLOAT(16, 16, 16, 16),
.bpp = 64,
.opaque_substitute = DRM_FORMAT_XRGB16161616F,
GL_FORMAT_INFO(GL_RGBA16F, GL_RGBA, GL_HALF_FLOAT, BGRA),
},
{
DRM_FORMAT(YUYV),

View file

@ -4459,7 +4459,8 @@ gl_renderer_display_create(struct weston_compositor *ec,
const struct gl_renderer_display_options *options)
{
struct gl_renderer *gr;
int ret;
const struct pixel_format_info *info;
int ret, nformats, i;
gr = zalloc(sizeof *gr);
if (gr == NULL)
@ -4574,15 +4575,26 @@ gl_renderer_display_create(struct weston_compositor *ec,
wl_signal_init(&gr->destroy_signal);
wl_display_add_shm_format(ec->wl_display, WL_SHM_FORMAT_XBGR8888);
wl_display_add_shm_format(ec->wl_display, WL_SHM_FORMAT_ABGR8888);
wl_display_add_shm_format(ec->wl_display, WL_SHM_FORMAT_RGBX8888);
wl_display_add_shm_format(ec->wl_display, WL_SHM_FORMAT_RGBA8888);
wl_display_add_shm_format(ec->wl_display, WL_SHM_FORMAT_BGRX8888);
wl_display_add_shm_format(ec->wl_display, WL_SHM_FORMAT_BGRA8888);
wl_display_add_shm_format(ec->wl_display, WL_SHM_FORMAT_RGB888);
wl_display_add_shm_format(ec->wl_display, WL_SHM_FORMAT_BGR888);
wl_display_add_shm_format(ec->wl_display, WL_SHM_FORMAT_RGB565);
/* Register supported wl_shm RGB formats. */
nformats = pixel_format_get_info_count();
for (i = 0; i < nformats; i++) {
info = pixel_format_get_info_by_index(i);
/* libwayland registers XRGB8888 and ARGB8888 by default. */
if (info->format == WL_SHM_FORMAT_XRGB8888 ||
info->format == WL_SHM_FORMAT_ARGB8888)
continue;
if (info->hide_from_clients)
continue;
if (info->gl.internal == 0 ||
!gl_texture_is_format_supported(gr, info->gl.internal))
continue;
wl_display_add_shm_format(ec->wl_display, info->format);
}
wl_display_add_shm_format(ec->wl_display, WL_SHM_FORMAT_YUV420);
wl_display_add_shm_format(ec->wl_display, WL_SHM_FORMAT_YUV444);
wl_display_add_shm_format(ec->wl_display, WL_SHM_FORMAT_NV12);
@ -4590,22 +4602,7 @@ gl_renderer_display_create(struct weston_compositor *ec,
wl_display_add_shm_format(ec->wl_display, WL_SHM_FORMAT_NV24);
wl_display_add_shm_format(ec->wl_display, WL_SHM_FORMAT_YUYV);
wl_display_add_shm_format(ec->wl_display, WL_SHM_FORMAT_XYUV8888);
wl_display_add_shm_format(ec->wl_display, WL_SHM_FORMAT_ABGR8888);
#if __BYTE_ORDER == __LITTLE_ENDIAN
if (gr->gl_version >= gl_version(3, 0) ||
gl_extensions_has(gr, EXTENSION_EXT_TEXTURE_TYPE_2_10_10_10_REV)) {
wl_display_add_shm_format(ec->wl_display, WL_SHM_FORMAT_ABGR2101010);
wl_display_add_shm_format(ec->wl_display, WL_SHM_FORMAT_XBGR2101010);
}
if (gl_features_has(gr, FEATURE_COLOR_TRANSFORMS)) {
wl_display_add_shm_format(ec->wl_display, WL_SHM_FORMAT_ABGR16161616F);
wl_display_add_shm_format(ec->wl_display, WL_SHM_FORMAT_XBGR16161616F);
}
if (gl_extensions_has(gr, EXTENSION_EXT_TEXTURE_NORM16)) {
wl_display_add_shm_format(ec->wl_display, WL_SHM_FORMAT_ABGR16161616);
wl_display_add_shm_format(ec->wl_display, WL_SHM_FORMAT_XBGR16161616);
}
#endif
return 0;
fail_with_error: