mirror of
https://gitlab.freedesktop.org/wayland/weston.git
synced 2026-05-06 03:28:00 +02:00
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:
parent
da393fd468
commit
5e267afa6d
2 changed files with 70 additions and 26 deletions
|
|
@ -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),
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue