From f5df956c18634e501d878531858ed75391fec644 Mon Sep 17 00:00:00 2001 From: Manuel Stoeckl Date: Thu, 29 Jul 2021 23:55:57 -0400 Subject: [PATCH] render/gles2: add a few 10-bit and FP16 formats The half-float formats depend on GL_OES_texture_half_float_linear, not just the GL_OES_texture_half_float extension, because the latter does not include support for linear magni/minification filters. The new 2101010 and 16161616F formats are only available on little- endian builds, since their gl_types are larger than a byte and thus endianness dependent. --- include/render/gles2.h | 2 ++ render/gles2/pixel_format.c | 33 ++++++++++++++++++++++++++++++++- render/gles2/renderer.c | 6 ++++++ 3 files changed, 40 insertions(+), 1 deletion(-) diff --git a/include/render/gles2.h b/include/render/gles2.h index 68fbb40e..cc5a2808 100644 --- a/include/render/gles2.h +++ b/include/render/gles2.h @@ -43,6 +43,8 @@ struct wlr_gles2_renderer { bool KHR_debug; bool OES_egl_image_external; bool OES_egl_image; + bool EXT_texture_type_2_10_10_10_REV; + bool OES_texture_half_float_linear; } exts; struct { diff --git a/render/gles2/pixel_format.c b/render/gles2/pixel_format.c index ceb8dadd..31bb3908 100644 --- a/render/gles2/pixel_format.c +++ b/render/gles2/pixel_format.c @@ -69,7 +69,30 @@ static const struct wlr_gles2_pixel_format formats[] = { .gl_type = GL_UNSIGNED_SHORT_5_6_5, .has_alpha = false, }, - // TODO: EXT_texture_type_2_10_10_10_REV support + { + .drm_format = DRM_FORMAT_XBGR2101010, + .gl_format = GL_RGBA, + .gl_type = GL_UNSIGNED_INT_2_10_10_10_REV_EXT, + .has_alpha = false, + }, + { + .drm_format = DRM_FORMAT_ABGR2101010, + .gl_format = GL_RGBA, + .gl_type = GL_UNSIGNED_INT_2_10_10_10_REV_EXT, + .has_alpha = true, + }, + { + .drm_format = DRM_FORMAT_XBGR16161616F, + .gl_format = GL_RGBA, + .gl_type = GL_HALF_FLOAT_OES, + .has_alpha = false, + }, + { + .drm_format = DRM_FORMAT_ABGR16161616F, + .gl_format = GL_RGBA, + .gl_type = GL_HALF_FLOAT_OES, + .has_alpha = true, + }, #endif }; @@ -77,6 +100,14 @@ static const struct wlr_gles2_pixel_format formats[] = { bool is_gles2_pixel_format_supported(const struct wlr_gles2_renderer *renderer, const struct wlr_gles2_pixel_format *format) { + if (format->gl_type == GL_UNSIGNED_INT_2_10_10_10_REV_EXT + && !renderer->exts.EXT_texture_type_2_10_10_10_REV) { + return false; + } + if (format->gl_type == GL_HALF_FLOAT_OES + && !renderer->exts.OES_texture_half_float_linear) { + return false; + } if (format->gl_format == GL_BGRA_EXT && !renderer->exts.EXT_read_format_bgra) { return false; diff --git a/render/gles2/renderer.c b/render/gles2/renderer.c index 509d39d2..9ae6e2bb 100644 --- a/render/gles2/renderer.c +++ b/render/gles2/renderer.c @@ -749,6 +749,12 @@ struct wlr_renderer *wlr_gles2_renderer_create(struct wlr_egl *egl) { renderer->exts.EXT_read_format_bgra = check_gl_ext(exts_str, "GL_EXT_read_format_bgra"); + renderer->exts.EXT_texture_type_2_10_10_10_REV = + check_gl_ext(exts_str, "GL_EXT_texture_type_2_10_10_10_REV"); + + renderer->exts.OES_texture_half_float_linear = + check_gl_ext(exts_str, "GL_OES_texture_half_float_linear"); + if (check_gl_ext(exts_str, "GL_KHR_debug")) { renderer->exts.KHR_debug = true; load_gl_proc(&renderer->procs.glDebugMessageCallbackKHR,