diff --git a/libweston/pixel-formats.c b/libweston/pixel-formats.c index a23dd6eaa..58f491d12 100644 --- a/libweston/pixel-formats.c +++ b/libweston/pixel-formats.c @@ -51,15 +51,21 @@ #include #include +#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), diff --git a/libweston/renderer-gl/gl-renderer.c b/libweston/renderer-gl/gl-renderer.c index a9ad46110..6eda8163a 100644 --- a/libweston/renderer-gl/gl-renderer.c +++ b/libweston/renderer-gl/gl-renderer.c @@ -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: